-- 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; BEGIN 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; EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Test % failed: Error: %', total_tests, SQLERRM; END; -- Test 2: Template with nested includes and shared context total_tests := total_tests + 1; BEGIN 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; EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Test % failed: Error: %', total_tests, SQLERRM; END; -- Test 3: Template with execute tag using context from section total_tests := total_tests + 1; BEGIN 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; EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Test % failed: Error: %', total_tests, SQLERRM; END; -- 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 $$;