379 lines
13 KiB
Gherkin
379 lines
13 KiB
Gherkin
Feature: YAML Template Engine coverage
|
|
|
|
Background:
|
|
Given the YAML template engine is initialized for coverage
|
|
|
|
Scenario: Postprocess splits combined mapping values
|
|
Given I have YAML with specific line splitting pattern:
|
|
"""
|
|
config:
|
|
combined: value1 key2: value2
|
|
test: normal value
|
|
"""
|
|
When I process postprocessing line splitting
|
|
Then specific line splitting should occur
|
|
And the lines should be restructured
|
|
|
|
Scenario: Rejects non-dict plain YAML without templates
|
|
Given I have plain YAML without templates:
|
|
"""
|
|
- item1
|
|
- item2
|
|
"""
|
|
When I load YAML content through the template engine
|
|
Then a ValueError should be raised indicating dict requirement
|
|
|
|
Scenario: Deferred loading preserves template placeholders
|
|
Given the YAML template engine is initialized for coverage
|
|
Given I have a YAML string with inline template placeholders:
|
|
"""
|
|
agent:
|
|
name: "{{ name }}"
|
|
model: "{{ model }}"
|
|
"""
|
|
When I load YAML content without context for deferred rendering
|
|
Then the deferred template should keep placeholders
|
|
And the deferred template should be a mapping with key "agent"
|
|
|
|
Scenario: Deferred loading surfaces YAML errors for invalid templates
|
|
Given I have invalid templated YAML for deferred rendering:
|
|
"""
|
|
agent:
|
|
name: {{ name
|
|
"""
|
|
When I load YAML content without context for deferred rendering
|
|
Then a YAML error should be raised for deferred loading
|
|
|
|
Scenario: Preprocess inserts indentation hints for for-loops
|
|
Given I have a YAML string with for loops requiring preprocessing:
|
|
"""
|
|
agents:
|
|
{% for item in items %}
|
|
- name: {{ item }}
|
|
{% endfor %}
|
|
"""
|
|
When I preprocess the YAML content for rendering
|
|
Then indentation hints should be present after the loop line
|
|
|
|
Scenario: Rendering with colon-heavy values triggers fallback fix
|
|
Given I have a templated YAML that renders malformed mapping:
|
|
"""
|
|
config: {{ value_with_colons }}
|
|
"""
|
|
And I have a template context with colon rich value
|
|
When I render the YAML with context
|
|
Then a YAML parsing error should be raised after attempting fixes
|
|
|
|
Scenario: Rendering simple template succeeds with merged context
|
|
Given I have a YAML string with inline Jinja2 templates:
|
|
"""
|
|
items:
|
|
{% for item in items %}
|
|
- {{ item }}
|
|
{% endfor %}
|
|
context_value: {{ context.existing }}
|
|
"""
|
|
And I have a template context with list items
|
|
When I render the YAML with context
|
|
Then the rendered YAML should be parsed into a mapping
|
|
And the rendered mapping should include loop results and merged context
|
|
|
|
Scenario: Selectattr filter fills defaults
|
|
Given I have objects with missing attributes
|
|
When I apply the selectattr filter for attribute "score" with default 0
|
|
Then the selected attributes should include defaults
|
|
|
|
Scenario: Sum and helper filters format values
|
|
Given I have numeric values for the sum filter
|
|
When I apply the sum filter and helper formatters
|
|
Then the helper filters should format output
|
|
|
|
Scenario: Analyze YAML structure skips comments and finds templates
|
|
Given I have YAML with mixed content for structure analysis:
|
|
"""
|
|
# comment
|
|
root:
|
|
value: static
|
|
{{ inline_var }}
|
|
{% for x in items %}
|
|
- name: {{ x }}
|
|
{% endfor %}
|
|
"""
|
|
When I analyze the YAML structure
|
|
Then template blocks and inline templates should be located
|
|
|
|
Scenario: Load file wrapper processes templates from disk
|
|
Given I have a temporary YAML file with template content:
|
|
"""
|
|
agent:
|
|
name: "{{ name }}"
|
|
role: static
|
|
"""
|
|
When I load the YAML file with context data
|
|
Then the file load result should merge templated values
|
|
|
|
Scenario: Rendering list template raises mapping ValueError
|
|
Given I have a templated YAML that renders to a list root:
|
|
"""
|
|
{% for item in items %}
|
|
- {{ item }}
|
|
{% endfor %}
|
|
"""
|
|
And I have a template context with list items
|
|
When I render the YAML expecting a non-mapping error
|
|
Then a ValueError should indicate rendered YAML must be a mapping
|
|
|
|
Scenario: Malformed rendered YAML triggers fallback fix path
|
|
Given I have templated YAML that renders invalid mappings:
|
|
"""
|
|
config: {{ messy_value }}
|
|
"""
|
|
And I have a messy value context for rendering
|
|
When I render the malformed YAML content
|
|
Then the parser should attempt fixes then raise YAML error
|
|
|
|
Scenario: Deferred templated list raises mapping ValueError
|
|
Given I have a deferred YAML template that becomes a list:
|
|
"""
|
|
- "{{ value }}"
|
|
"""
|
|
When I load YAML content without context for deferred rendering
|
|
Then a ValueError should be raised for non-mapping deferred templates
|
|
|
|
Scenario: Parse retry succeeds after YAML error
|
|
Given I have YAML with a placeholder causing parse retry:
|
|
"""
|
|
result: {{ value }}
|
|
"""
|
|
And I have a template context for retry parsing
|
|
When I render YAML with a transient YAML error on first parse
|
|
Then the rendering retry should yield a mapping result
|
|
|
|
Scenario: Parse retry raises ValueError when repaired YAML is not a mapping
|
|
Given I have YAML with a placeholder causing parse retry:
|
|
"""
|
|
result: {{ value }}
|
|
"""
|
|
And I have a template context for retry parsing
|
|
When rendering retry returns non-mapping after YAML error
|
|
Then a ValueError should be raised for non-mapping retry
|
|
|
|
Scenario: Fix common YAML issues splits multiple colons
|
|
Given I have inline YAML with multiple colons on one line:
|
|
"""
|
|
config: key1: val1 key2: val2
|
|
"""
|
|
When I apply the common YAML fixes
|
|
Then the multi-colon line should be split into nested entries
|
|
|
|
Scenario: Synthetic postprocess respects single-colon guard
|
|
Given I have synthetic YAML content for postprocess:
|
|
"""
|
|
config: alpha beta: gamma
|
|
"""
|
|
When I postprocess using a single-colon synthetic line
|
|
Then the synthetic postprocess should keep the line intact
|
|
|
|
Scenario: Load file without template markers
|
|
Given I have a YAML file without templates:
|
|
"""
|
|
config:
|
|
name: PlainConfig
|
|
version: 1.0
|
|
"""
|
|
When I load the YAML file without context
|
|
Then the YAML file should parse as a mapping
|
|
And the parsed YAML should include config name "PlainConfig"
|
|
|
|
Scenario: Load string without template markers
|
|
Given I have a YAML string without templates:
|
|
"""
|
|
simple:
|
|
key: value
|
|
list:
|
|
- item1
|
|
- item2
|
|
"""
|
|
When I load the string directly
|
|
Then the YAML string should parse as a mapping
|
|
And the parsed YAML string should include key value "value"
|
|
|
|
Scenario: Render context merges nested context
|
|
Given I have a template using nested context and overrides:
|
|
"""
|
|
result:
|
|
nested: "{{ context.shared }}"
|
|
explicit: "{{ value }}"
|
|
context_copy: "{{ context.explicit }}"
|
|
"""
|
|
And I have a template context with nested overrides
|
|
When I render the YAML with merged context
|
|
Then the render context should include nested and top-level values
|
|
|
|
Scenario: Utility functions are available during rendering
|
|
Given I have template using utility functions:
|
|
"""
|
|
utilities:
|
|
range_values: {{ range(3) | list }}
|
|
abs_value: {{ abs(-4) }}
|
|
round_value: {{ round(3.1415, 2) }}
|
|
"""
|
|
When I process with complete render context utilities
|
|
Then utility functions should be evaluated
|
|
|
|
Scenario: Sum filter surfaces errors for invalid sequences
|
|
Given I have non-summable values for the sum filter
|
|
When I apply the sum filter expecting an error
|
|
Then a ValueError should be raised for the sum filter
|
|
|
|
# -- New scenarios for additional coverage --
|
|
|
|
Scenario: Postprocess removes blank lines between top-level sections
|
|
Given I have rendered YAML with blank lines between sections:
|
|
"""
|
|
section_one:
|
|
key: value
|
|
|
|
section_two:
|
|
key: value2
|
|
"""
|
|
When I postprocess the rendered YAML for blank line cleanup
|
|
Then blank lines before top-level keys should be removed
|
|
|
|
Scenario: Postprocess keeps blank lines before indented content
|
|
Given I have rendered YAML with blank lines before indented content:
|
|
"""
|
|
section:
|
|
key1: value1
|
|
|
|
key2: value2
|
|
"""
|
|
When I postprocess the rendered YAML for blank line cleanup
|
|
Then blank lines before indented content should be kept
|
|
|
|
Scenario: Create render context without nested context key
|
|
Given I have a template context without nested context key
|
|
When I create the render context
|
|
Then the render context should have an empty context mapping
|
|
|
|
Scenario: Create render context with non-dict nested context
|
|
Given I have a template context with non-dict nested context
|
|
When I create the render context
|
|
Then the render context should override context with non-dict value
|
|
|
|
Scenario: Analyze YAML structure handles empty and blank lines
|
|
Given I have YAML with empty and blank lines for structure analysis:
|
|
"""
|
|
|
|
root:
|
|
nested: value
|
|
|
|
deep:
|
|
key: data
|
|
"""
|
|
When I analyze the YAML structure
|
|
Then hierarchy should contain root and nested keys
|
|
And blank lines should be skipped in analysis
|
|
|
|
Scenario: Analyze YAML structure pops path for dedented keys
|
|
Given I have YAML with dedented keys for structure analysis:
|
|
"""
|
|
parent:
|
|
child: value
|
|
sibling: other
|
|
"""
|
|
When I analyze the YAML structure
|
|
Then hierarchy paths should reflect dedentation correctly
|
|
|
|
Scenario: Fix common YAML issues handles colon-ending tokens
|
|
Given I have YAML with colon-ending tokens:
|
|
"""
|
|
config: key1: val1 key2: val2
|
|
"""
|
|
When I apply the common YAML fixes
|
|
Then colon-ending tokens should be split onto separate lines
|
|
|
|
Scenario: Fix common YAML issues preserves lines without multiple colons
|
|
Given I have YAML without multiple colons per line:
|
|
"""
|
|
simple: value
|
|
another: data
|
|
"""
|
|
When I apply the common YAML fixes
|
|
Then lines without multiple colons should remain unchanged
|
|
|
|
Scenario: Fix common YAML issues handles trailing tokens after colons
|
|
Given I have YAML with mixed colon tokens for fixing:
|
|
"""
|
|
config: key1: val1 remainder
|
|
"""
|
|
When I apply the common YAML fixes
|
|
Then the trailing tokens should be handled correctly
|
|
|
|
Scenario: Postprocess handles value with colon in subsequent words
|
|
Given I have rendered YAML with colon in value words:
|
|
"""
|
|
endpoint: http value:8080 extra
|
|
"""
|
|
When I postprocess the rendered YAML with colon values
|
|
Then the colon value should trigger line splitting
|
|
|
|
Scenario: Preprocess does not add hints for non-loop Jinja blocks
|
|
Given I have YAML with non-loop Jinja blocks:
|
|
"""
|
|
config:
|
|
{% if condition %}
|
|
enabled: true
|
|
{% endif %}
|
|
"""
|
|
When I preprocess the YAML content for rendering
|
|
Then no indentation hints should be added for non-loop blocks
|
|
|
|
Scenario: Simple template extraction raises on invalid YAML
|
|
Given I have invalid YAML for simple template extraction:
|
|
"""
|
|
invalid: [unterminated
|
|
"""
|
|
When I extract templates from invalid YAML
|
|
Then a YAML error should be raised during extraction
|
|
|
|
Scenario: Load string with templates and context calls render path
|
|
Given I have a YAML string with inline Jinja2 templates:
|
|
"""
|
|
greeting: "{{ message }}"
|
|
"""
|
|
And I have a simple template context with message
|
|
When I render the YAML with context
|
|
Then the rendered YAML should be parsed into a mapping
|
|
And the rendered result should contain the message value
|
|
|
|
Scenario: Selectattr filter returns attribute values for all matching objects
|
|
Given I have objects that all have the target attribute
|
|
When I apply the selectattr filter for attribute "name" with default "none"
|
|
Then all attribute values should be returned without defaults
|
|
|
|
Scenario: Selectattr filter uses default for all missing attributes
|
|
Given I have objects that all lack the target attribute
|
|
When I apply the selectattr filter for attribute "missing" with default -1
|
|
Then all values should be the default
|
|
|
|
Scenario: Indent filter applies custom spacing to multiline text
|
|
Given I have a multiline string for indentation
|
|
When I apply the indent filter with 4 spaces
|
|
Then each line should be indented by 4 spaces
|
|
|
|
Scenario: YAML filter serializes complex nested structures
|
|
Given I have a complex nested structure for YAML serialization
|
|
When I apply the YAML filter to serialize it
|
|
Then the serialized output should be valid YAML text
|
|
|
|
Scenario: Load string returns template content as context for deferred rendering
|
|
Given I have YAML with block-level templates for deferred loading:
|
|
"""
|
|
config:
|
|
name: "{{ agent_name }}"
|
|
version: 1
|
|
"""
|
|
When I load YAML content without context for deferred rendering
|
|
Then the deferred result should preserve quoted template strings
|