{% set suite = suites if suites else None %} {# ------------------------------------------------------------ Template helpers ------------------------------------------------------------ #} {% macro suite_icon(is_folder) -%} {%- if is_folder -%} {%- else -%} {%- endif -%} {%- endmacro %}
{{ title }}
Test Documentation
{% if suite %}
{{ suite.test_count }} Tests
{% endif %} {% if suite %} {% endif %}
{# ------------------------------------------------------------ PoC: Keyword documentation metadata We keep the lexer + Pygments highlighting unchanged. Instead, we embed resolved keyword docs (already available in the parsed model) as NDJSON per test block. The frontend can then add a small info button next to each keyword call line. ------------------------------------------------------------ #} {% macro emit_kw_doc_ndjson(items) %} {% for item in (items or []) %} {% if item.type == 'KEYWORD' and item.keyword_doc %} {{ {'name': item.name, 'owner': item.keyword_owner, 'doc': item.keyword_doc, 'args': item.args} | dump_json }} {% endif %} {% if item.body %} {{ emit_kw_doc_ndjson(item.body) }} {% endif %} {% endfor %} {% endmacro %} {% macro render_suite_block(s, level) %}
{% if s.is_folder %}Directory{% else %}Suite{% endif %}

{{ s.name }}

{{ s.test_count }} Total
{% if s.tests %}
{{ s.tests | length }} Direct
{% endif %}
Suite Details General information about this test suite
Name
{{ s.name }}
Source
{% if s.custom_source %} {{ s.custom_source }} {% else %} {{ s.source }} {% endif %}
Tests (total)
{{ s.test_count }}
Tests (direct)
{{ s.tests | length }}
{% if s.doc %}
Documentation
{{ s.doc }}
{% endif %} {% if s.setup or s.teardown %}
Suite Setup & Teardown Lifecycle keywords for this suite
{% set setup_line = [s.setup] | format_test_body | join('') if s.setup else '' %} {% set teardown_line = [s.teardown] | format_test_body | join('') if s.teardown else '' %} {% set code -%} *** Settings *** {% if s.setup %}Suite Setup {{ setup_line }} {% endif %}{% if s.teardown %}Suite Teardown {{ teardown_line }} {% endif %} {%- endset %} {{ code | highlight_robot_in_pre | safe }}
{% endif %} {% if s.metadata %}
Metadata Additional suite information
Entries
{% endif %} {% if s.user_keywords %}
User Keywords Defined in this suite
{% set code -%} *** Keywords *** {{ s.user_keywords | join('\n') }} {%- endset %} {{ code | highlight_robot_in_pre | safe }}
{% endif %} {% if s.tests %}
Test Case Overview All {{ s.tests | length }} tests in this suite
{% set code -%} *** Test Cases *** {{ s.tests | map(attribute='name') | join('\n') }} {%- endset %} {{ code | highlight_robot_in_pre | safe }}
Test Case Details Per-test documentation and steps
{% for test in s.tests %} {%- set _test_tags = [] -%} {%- for _t in (test.tags or []) -%}{%- if _test_tags.append((_t.name if _t is mapping else _t) | string) -%}{%- endif -%}{%- endfor -%} {% endfor %}
{% endif %} {% if s.suites %}
Sub-Suites Nested suite structure
{% macro render_suite_details(s2, level2) %} {% for child in s2.suites %} {{ render_suite_details(child, level2 + 1) }} {% endfor %} {% endmacro %} {{ render_suite_details(s, 0) }}
{% endif %}
{# /content-body #}
{% for child in s.suites %} {{ render_suite_block(child, level + 1) }} {% endfor %} {% endmacro %}
{% if suites %} {{ render_suite_block(suites, 0) }} {% else %}

No suites available.

{% endif %}
{# /suiteContent #}