StrictDoc Documentation
tests/unit/strictdoc/export/html/form_objects/test_requirement_form_object_markup_validation.py
Source file coverage
Path:
tests/unit/strictdoc/export/html/form_objects/test_requirement_form_object_markup_validation.py
Lines:
105
Non-empty lines:
90
Non-empty lines covered with requirements:
90 / 90 (100.0%)
Functions:
4
Functions covered by requirements:
4 / 4 (100.0%)
1
"""
2
@relation(SDOC-SRS-55, scope=file)
3
"""
4
 
5
from strictdoc.backend.sdoc.constants import SDocMarkup
6
from strictdoc.core.document_tree import DocumentTree
7
from strictdoc.core.project_config import ProjectConfig
8
from strictdoc.core.traceability_index import TraceabilityIndex
9
from strictdoc.core.traceability_index_builder import TraceabilityIndexBuilder
10
from strictdoc.export.html.form_objects.requirement_form_object import (
11
    RequirementFormObject,
12
)
13
from tests.unit.helpers.document_builder import DocumentBuilder
14
 
15
# A Markdown pipe table. It is valid Markdown but not valid RST: the separator
16
# row "|---|...|" is not a valid line-block continuation of the header row,
17
# which docutils reports as "Line block ends without a blank line".
18
MARKDOWN_TABLE = (
19
    "|   | Action | Verify |\n"
20
    "|---|--------|--------|\n"
21
    "| 1 | Do the thing | |\n"
22
    "| 2 | Do another thing | |\n"
23
)
24
 
25
 
26
def _build_index_with_single_requirement():
27
    document_builder = DocumentBuilder()
28
    requirement = document_builder.add_requirement("REQ-001")
29
    document = document_builder.build()
30
 
31
    document_tree = DocumentTree(
32
        file_tree=[],
33
        document_list=[document],
34
        map_docs_by_paths={},
35
        map_docs_by_rel_paths={},
36
        map_grammars_by_filenames={},
37
    )
38
    traceability_index: TraceabilityIndex = (
39
        TraceabilityIndexBuilder.create_from_document_tree(
40
            document_tree, project_config=document_builder.project_config
41
        )
42
    )
43
    traceability_index.document_tree = document_tree
44
    return traceability_index, document, requirement
45
 
46
 
47
def _make_form_object_with_statement(requirement, document, statement_value):
48
    form_object: RequirementFormObject = (
49
        RequirementFormObject.create_from_requirement(
50
            requirement=requirement,
51
            revision=0,
52
            context_document_mid=document.reserved_mid,
53
        )
54
    )
55
    for field in form_object.fields["STATEMENT"]:
56
        field.field_value = statement_value
57
    return form_object
58
 
59
 
60
def test_markdown_document_validates_field_as_markdown():
61
    """
62
    In a Markdown document, a field containing a Markdown table validates
63
    without errors.
64
    """
65
    traceability_index, document, requirement = (
66
        _build_index_with_single_requirement()
67
    )
68
    document.config.markup = SDocMarkup.MARKDOWN
69
 
70
    form_object = _make_form_object_with_statement(
71
        requirement, document, MARKDOWN_TABLE
72
    )
73
    form_object.validate(
74
        traceability_index=traceability_index,
75
        context_document=document,
76
        config=ProjectConfig.default_config(),
77
        existing_revision=0,
78
    )
79
 
80
    assert not form_object.any_errors()
81
    assert form_object.get_errors("STATEMENT") == []
82
 
83
 
84
def test_rst_document_validates_field_as_rst():
85
    """
86
    In an RST document, a field is validated as RST. The pipe table is not
87
    valid RST, so validation reports an error against the field.
88
    """
89
    traceability_index, document, requirement = (
90
        _build_index_with_single_requirement()
91
    )
92
    document.config.markup = SDocMarkup.RST
93
 
94
    form_object = _make_form_object_with_statement(
95
        requirement, document, MARKDOWN_TABLE
96
    )
97
    form_object.validate(
98
        traceability_index=traceability_index,
99
        context_document=document,
100
        config=ProjectConfig.default_config(),
101
        existing_revision=0,
102
    )
103
 
104
    assert form_object.any_errors()
105
    assert len(form_object.get_errors("STATEMENT")) > 0