diff --git a/package/c/hemar/test/mod.sql b/package/c/hemar/test/mod.sql index e889cb6..fa4df44 100755 --- a/package/c/hemar/test/mod.sql +++ b/package/c/hemar/test/mod.sql @@ -5,4 +5,5 @@ BEGIN; \ir test_render_interpolate.sql \ir test_render_section.sql \ir test_render_include.sql + \ir test_render_all.sql ROLLBACK; diff --git a/package/c/hemar/test/test_render_all.sql b/package/c/hemar/test/test_render_all.sql new file mode 100755 index 0000000..8282ea6 --- /dev/null +++ b/package/c/hemar/test/test_render_all.sql @@ -0,0 +1,219 @@ +-- Test all template tags together +DO $$ +DECLARE + total_tests INT := 0; + passed_tests INT := 0; + test_result TEXT; + expected TEXT; + passed BOOLEAN; +BEGIN + -- Test 1: Complex template with all tag types + total_tests := total_tests + 1; + test_result := hemar.render( + '{ + "page": { + "title": "My Page", + "sections": [ + { + "id": "section1", + "title": "Section 1", + "items": [ + { + "id": "item1", + "status": "active", + "content": "Item 1 Content", + "template": "item_template" + }, + { + "id": "item2", + "status": "inactive", + "content": "Item 2 Content", + "template": "item_template" + } + ] + } + ] + }, + "include": { + "meta_tags": { + "content": "" + }, + "header": { + "template": "Welcome to {{ page.title }}!", + "context": { + "page": { + "title": "My Page" + } + } + }, + "item_template": { + "template": "Status: {{ status }}, Content: {{ content }}" + }, + "footer": { + "content": "" + } + } + }'::jsonb, + $template$ + + + {{ page.title }} + {{ include meta_tags }} + + +
{{ include header }}
+
+ {{ for section in page.sections }} +
+

{{ section.title }}

+ {{ for item in section.items }} +
+ {{ include item.template }} + {{ exec + DECLARE + v_status TEXT; + BEGIN + v_status := context->'item'->>'status'; + RETURN CASE + WHEN v_status = 'active' THEN ' (Active Item)' + ELSE ' (Inactive Item)' + END; + END; + }} +
+ {{ end }} +
+ {{ end }} +
+ + +$template$ + ); + + expected := ' + + + My Page + + + +
Welcome to My Page!
+
+
+

Section 1

+
+ Status: active, Content: Item 1 Content (Active Item) +
+
+ Status: inactive, Content: Item 2 Content (Inactive Item) +
+
+
+ + +'; + + passed := test_result = expected; + passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END); + IF passed THEN + RAISE NOTICE 'Test %: Complex template with all tag types: PASSED', total_tests; + ELSE + RAISE WARNING 'Test %: Complex template with all tag types: FAILED. Expected "%", got "%"', + total_tests, expected, test_result; + END IF; + + -- Test 2: Template with nested includes and shared context + total_tests := total_tests + 1; + test_result := hemar.render( + '{ + "user": { + "name": "John", + "role": "admin" + }, + "include": { + "user_info": { + "template": "User: {{ user.name }} ({{ user.role }})" + }, + "permissions": { + "template": "{{ include user_info }} - Permissions: {{ for perm in user.permissions }}{{ perm }} {{ end }}", + "context": { + "user": { + "name": "John", + "role": "admin", + "permissions": ["read", "write", "delete"] + } + } + } + } + }'::jsonb, + $template${{ include permissions }}$template$ + ); + + expected := 'User: John (admin) - Permissions: read write delete '; + + passed := test_result = expected; + passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END); + IF passed THEN + RAISE NOTICE 'Test %: Template with nested includes and shared context: PASSED', total_tests; + ELSE + RAISE WARNING 'Test %: Template with nested includes and shared context: FAILED. Expected "%", got "%"', + total_tests, expected, test_result; + END IF; + + -- Test 3: Template with execute tag using context from section + total_tests := total_tests + 1; + test_result := hemar.render( + '{ + "items": [ + {"id": 1, "value": 100}, + {"id": 2, "value": 200}, + {"id": 3, "value": 300} + ] + }'::jsonb, + $template$Items: +{{ for item in items }} + Item {{ item.id }}: {{ exec + DECLARE + v_value INT; + BEGIN + v_value := (context->>'value')::int; + RETURN v_value * 2; + END; + }} +{{ end }}$template$ + ); + + expected := 'Items: + Item 1: 200 + Item 2: 400 + Item 3: 600 +'; + + passed := test_result = expected; + passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END); + IF passed THEN + RAISE NOTICE 'Test %: Template with execute tag using context from section: PASSED', total_tests; + ELSE + RAISE WARNING 'Test %: Template with execute tag using context from section: FAILED. Expected "%", got "%"', + total_tests, expected, test_result; + END IF; + + -- Print summary + IF passed_tests = total_tests THEN + RAISE NOTICE '------------------------------------'; + RAISE NOTICE 'SUMMARY: % of % combined template tests passed (100%%)', + passed_tests, total_tests; + RAISE NOTICE '------------------------------------'; + ELSE + RAISE WARNING '------------------------------------'; + RAISE WARNING 'SUMMARY: % of % combined template tests passed (%)', + passed_tests, + total_tests, + round((passed_tests::numeric / total_tests::numeric) * 100, 2) || '%'; + RAISE WARNING '------------------------------------'; + END IF; + + IF passed_tests != total_tests THEN + RAISE EXCEPTION 'Tests failed: % of % combined template tests did not pass', (total_tests - passed_tests), total_tests; + END IF; +END $$; \ No newline at end of file