-- Test include tag functionality DO $$ DECLARE result text; total_tests integer := 0; passed_tests integer := 0; BEGIN -- Test 1: Plain text inclusion total_tests := total_tests + 1; BEGIN result := hemar.render( '{ "include": { "inner_template": { "content": "

Hello World

" } } }'::jsonb, $hemar${{ include inner_template }}$hemar$ ); IF result = '

Hello World

' THEN RAISE NOTICE 'Test %: Plain text inclusion works correctly', total_tests; passed_tests := passed_tests + 1; ELSE RAISE WARNING 'Test %: failed, Expected "

Hello World

", got "%"', total_tests, result; END IF; EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Test %: Plain text inclusion: FAILED with error: %', total_tests, SQLERRM; END; -- Test 2: Template with separate context total_tests := total_tests + 1; result := hemar.render( '{ "include": { "inner_template": { "template": "Hello {{ name }}!", "context": { "name": "John" } } } }'::jsonb, $hemar${{ include inner_template }}$hemar$ ); IF result = 'Hello John!' THEN RAISE NOTICE 'Test %: Template with separate context works correctly', total_tests; passed_tests := passed_tests + 1; ELSE RAISE WARNING 'Test %: failed, Expected "Hello John!", got "%"', total_tests, result; END IF; -- Test 3: Template with shared context total_tests := total_tests + 1; result := hemar.render( '{ "name": "John", "include": { "inner_template": { "template": "Hello {{ name }}!" } } }'::jsonb, $hemar${{ include inner_template }}$hemar$ ); IF result = 'Hello John!' THEN RAISE NOTICE 'Test % passed: Template with shared context works correctly', total_tests; passed_tests := passed_tests + 1; ELSE RAISE WARNING 'Test % failed: Expected "Hello John!", got "%"', total_tests, result; END IF; -- Test 4: Nested includes total_tests := total_tests + 1; result := hemar.render( '{ "include": { "outer_template": { "template": "Outer: {{ include inner_template }}", "context": { "include": { "inner_template": { "template": "Inner: {{ name }}", "context": { "name": "John" } } } } } } }'::jsonb, $hemar${{ include outer_template }}$hemar$ ); IF result = 'Outer: Inner: John' THEN RAISE NOTICE 'Test % passed: Nested includes work correctly', total_tests; passed_tests := passed_tests + 1; ELSE RAISE WARNING 'Test % failed: Expected "Outer: Inner: John", got "%"', total_tests, result; END IF; -- Test 5: Complex template with multiple includes total_tests := total_tests + 1; result := hemar.render( '{ "include": { "header": { "content": "
Welcome
" }, "content": { "template": "Hello {{ user.name }}!", "context": { "user": { "name": "John" } } }, "footer": { "template": "Copyright {{ year }}", "context": { "year": "2024" } } } }'::jsonb, $hemar$Header: {{ include header }} Content: {{ include content }} Footer: {{ include footer }}$hemar$ ); IF result = 'Header:
Welcome
Content: Hello John! Footer: Copyright 2024' THEN RAISE NOTICE 'Test % passed: Complex template with multiple includes works correctly', total_tests; passed_tests := passed_tests + 1; ELSE RAISE WARNING 'Test % failed: Expected , got "%"', total_tests, result; END IF; -- Test 6: Error handling - missing include data total_tests := total_tests + 1; BEGIN result := hemar.render( '{{ include missing_template }}', '{}'::jsonb ); RAISE WARNING 'Test % failed: Should have raised an error for missing include data', total_tests; EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'Test % passed: Error handling for missing include data works correctly', total_tests; passed_tests := passed_tests + 1; END; -- Test 7: Error handling - invalid include data total_tests := total_tests + 1; BEGIN result := hemar.render( '{ "include": { "invalid_template": "not an object" } }'::jsonb, '{{ include invalid_template }}' ); IF result = '' THEN RAISE NOTICE 'Test % passed: Error handling for invalid include data works correctly', total_tests; passed_tests := passed_tests + 1; ELSE RAISE WARNING 'Test % failed: Expected "", got "%"', total_tests, result; END IF; EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Test % failed: Should have raised an error for invalid include data', total_tests; END; -- Test 8: Error handling - unexisting include object total_tests := total_tests + 1; BEGIN result := hemar.render( '{}'::jsonb, '{{ include invalid_template }}' ); IF result = '' THEN RAISE NOTICE 'Test % passed: Error handling for unexisting include object works correctly', total_tests; passed_tests := passed_tests + 1; ELSE RAISE WARNING 'Test % failed: Expected "", got "%"', total_tests, result; END IF; EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Test % failed: Should have raised an error for unexisting include object', total_tests; END; -- Test 9: Error handling - unexisting include data total_tests := total_tests + 1; BEGIN result := hemar.render( '{ "include": { } }'::jsonb, '{{ include invalid_template }}' ); IF result = '' THEN RAISE NOTICE 'Test % passed: Error handling for unexisting include data works correctly', total_tests; passed_tests := passed_tests + 1; ELSE RAISE WARNING 'Test % failed: Expected "", got "%"', total_tests, result; END IF; EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Test % failed: Should have raised an error for unexisting include data', total_tests; END; IF passed_tests = total_tests THEN RAISE NOTICE '------------------------------------'; RAISE NOTICE 'SUMMARY: % of % template include tests passed (100%%)', passed_tests, total_tests; RAISE NOTICE '------------------------------------'; ELSE RAISE WARNING '------------------------------------'; RAISE WARNING 'SUMMARY: % of % template include 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 % template include tests did not pass', (total_tests - passed_tests), total_tests; END IF; END $$;