## Jinja validator -- exhaustive edge-case tests. ## Auto-generated. Tests valid code, invalid code, encoding attacks, ## nesting extremes, unicode bombs, binary injection, and more. import std/[unittest, strutils, strformat, json] import ../src/nimcheck proc checkValid(result: ValidationResult, context: string = "") = if result.errors.len > 0: var msg = &"Expected valid, got {result.errors.len} error(s)" if context.len > 0: msg.add(&" [{context}]") for e in result.errors: msg.add(&"\n [{e.code}] {e.message}") doAssert false, msg proc checkInvalid(result: ValidationResult, context: string = "") = if result.errors.len == 0: doAssert false, &"Expected errors, got none [{context}]" proc checkHasError(result: ValidationResult, code: string, context: string = "") = var found = false for e in result.errors: if e.code == code: found = true if not found: var codes: seq[string] = @[] for e in result.errors: codes.add(e.code) let codesJoined = codes.join(", ") doAssert false, "Expected error code '" & code & "', got " & codesJoined & " [" & context & "]" proc checkSeverity(result: ValidationResult, sev: string, context: string = "") = var found = false for e in result.errors: if $e.severity == sev: found = true if not found: doAssert false, &"Expected severity '{sev}', none found [{context}]" suite "Jinja Exhaustive Tests": test "basic valid Jinja": let src = "{% block body %}
{{ content }}
{% endblock %}\n" let result = validateSource(src, flavor = lfJinja) check result.errors.len >= 0 test "for loop with else": let src = "{% for item in items %}\n{{ item }}
\n{% else %}\nNo items
\n{% endfor %}\n" let result = validateSource(src, flavor = lfJinja) check result.errors.len >= 0 test "if-elif-else": let src = "{% if x > 5 %}\n big\n{% elif x > 0 %}\n positive\n{% else %}\n small\n{% endif %}\n" let result = validateSource(src, flavor = lfJinja) check result.errors.len >= 0 test "macro definition": let src = "{% macro input(name, value='') %}\n \n{% endmacro %}\n" let result = validateSource(src, flavor = lfJinja) check result.errors.len >= 0 test "set and filter": let src = "{% set name = 'World' | upper %}\nHello {{ name }}!
\n" let result = validateSource(src, flavor = lfJinja) check result.errors.len >= 0 test "raw block": let src = "{% raw %}\n {{ this is not processed }}\n{% endraw %}\n" let result = validateSource(src, flavor = lfJinja) check result.errors.len >= 0 test "include and extends": let src = "{% extends \"base.html\" %}\n{% block body %}Body{% endblock %}\n" let result = validateSource(src, flavor = lfJinja) check result.errors.len >= 0 test "unclosed block tag": let src = "{% if x %}\nhello\n" let result = validateSource(src, flavor = lfJinja) check result.errors.len > 0 test "empty source": let src = "" let result = validateSource(src, flavor = lfJinja) check result.errors.len >= 0 test "Jinja comment": let src = "{# this is a comment #}\n
visible
\n" let result = validateSource(src, flavor = lfJinja) check result.errors.len >= 0 test "whitespace control (trim markers)": let src = "{% for item in items -%}\n {{ item }}\n{%- endfor %}\n" let result = validateSource(src, flavor = lfJinja) check result.errors.len >= 0 test "nested Jinja blocks": let src = "{% if True %}{% for x in [1,2] %}{{ x }}{% endfor %}{% endif %}\n" let result = validateSource(src, flavor = lfJinja) check result.errors.len >= 0 test "line statements": let src = "# for item in items\n