Path:
tests/unit/strictdoc/core/test_traceability_index_cycles.py
Lines:
303
Non-empty lines:
274
Non-empty lines covered with requirements:
274 / 274 (100.0%)
Functions:
6
Functions covered by requirements:
6 / 6 (100.0%)
1
"""2
@relation(SDOC-SRS-30, scope=file)3
"""4
5
import pytest
6
7
from strictdoc.backend.sdoc.errors.document_tree_error import DocumentTreeError
8
from strictdoc.core.document_tree import DocumentTree
9
from strictdoc.core.traceability_index import TraceabilityIndex
10
from strictdoc.core.traceability_index_builder import TraceabilityIndexBuilder
11
from tests.unit.helpers.document_builder import DocumentBuilder
12
13
14
def test_invalid_01_2_reqs_cycled():
15
document_builder = DocumentBuilder()
16
document_builder.add_requirement("REQ-001")
17
document_builder.add_requirement("REQ-002")
18
document_builder.add_requirement_relation(
19
relation_type="Parent",
20
source_requirement_id="REQ-002",
21
target_requirement_id="REQ-001",
22
role=None,
23
)24
document_builder.add_requirement_relation(
25
relation_type="Parent",
26
source_requirement_id="REQ-001",
27
target_requirement_id="REQ-002",
28
role=None,
29
)30
31
document_1 = document_builder.build()
32
file_tree = []
33
document_list = [document_1]
34
map_docs_by_paths = {}
35
document_tree = DocumentTree(
36
file_tree=file_tree,
37
document_list=document_list,
38
map_docs_by_paths=map_docs_by_paths,
39
map_docs_by_rel_paths={},
40
map_grammars_by_filenames={},
41
)42
with pytest.raises(DocumentTreeError):
43
_ = TraceabilityIndexBuilder.create_from_document_tree(
44
document_tree, project_config=document_builder.project_config
45
)46
47
48
def test_invalid_02_4_reqs_cycled():
49
document_builder = DocumentBuilder()
50
_ = document_builder.add_requirement("REQ-001")
51
_ = document_builder.add_requirement("REQ-002")
52
_ = document_builder.add_requirement("REQ-003")
53
_ = document_builder.add_requirement("REQ-004")
54
document_builder.add_requirement_relation(
55
relation_type="Parent",
56
source_requirement_id="REQ-004",
57
target_requirement_id="REQ-003",
58
role=None,
59
)60
document_builder.add_requirement_relation(
61
relation_type="Parent",
62
source_requirement_id="REQ-003",
63
target_requirement_id="REQ-002",
64
role=None,
65
)66
document_builder.add_requirement_relation(
67
relation_type="Parent",
68
source_requirement_id="REQ-002",
69
target_requirement_id="REQ-001",
70
role=None,
71
)72
document_builder.add_requirement_relation(
73
relation_type="Parent",
74
source_requirement_id="REQ-001",
75
target_requirement_id="REQ-004",
76
role=None,
77
)78
79
document_1 = document_builder.build()
80
81
file_tree = []
82
document_list = [document_1]
83
map_docs_by_paths = {}
84
document_tree = DocumentTree(
85
file_tree=file_tree,
86
document_list=document_list,
87
map_docs_by_paths=map_docs_by_paths,
88
map_docs_by_rel_paths={},
89
map_grammars_by_filenames={},
90
)91
with pytest.raises(DocumentTreeError):
92
_ = TraceabilityIndexBuilder.create_from_document_tree(
93
document_tree, project_config=document_builder.project_config
94
)95
96
97
def test_invalid_03_3_reqs_cycled():
98
document_builder = DocumentBuilder()
99
_ = document_builder.add_requirement("REQ-001")
100
_ = document_builder.add_requirement("REQ-002")
101
_ = document_builder.add_requirement("REQ-003")
102
document_builder.add_requirement_relation(
103
relation_type="Parent",
104
source_requirement_id="REQ-003",
105
target_requirement_id="REQ-001",
106
role=None,
107
)108
document_builder.add_requirement_relation(
109
relation_type="Parent",
110
source_requirement_id="REQ-003",
111
target_requirement_id="REQ-002",
112
role=None,
113
)114
document_builder.add_requirement_relation(
115
relation_type="Parent",
116
source_requirement_id="REQ-002",
117
target_requirement_id="REQ-003",
118
role=None,
119
)120
121
document_1 = document_builder.build()
122
123
file_tree = []
124
document_list = [document_1]
125
map_docs_by_paths = {}
126
document_tree = DocumentTree(
127
file_tree=file_tree,
128
document_list=document_list,
129
map_docs_by_paths=map_docs_by_paths,
130
map_docs_by_rel_paths={},
131
map_grammars_by_filenames={},
132
)133
with pytest.raises(DocumentTreeError):
134
_ = TraceabilityIndexBuilder.create_from_document_tree(
135
document_tree, project_config=document_builder.project_config
136
)137
138
139
def test_invalid_04_5_reqs_cycled():
140
document_builder = DocumentBuilder()
141
_ = document_builder.add_requirement("REQ-001")
142
_ = document_builder.add_requirement("REQ-002")
143
_ = document_builder.add_requirement("REQ-003")
144
_ = document_builder.add_requirement("REQ-004")
145
_ = document_builder.add_requirement("REQ-005")
146
document_builder.add_requirement_relation(
147
relation_type="Parent",
148
source_requirement_id="REQ-002",
149
target_requirement_id="REQ-001",
150
role=None,
151
)152
document_builder.add_requirement_relation(
153
relation_type="Parent",
154
source_requirement_id="REQ-003",
155
target_requirement_id="REQ-002",
156
role=None,
157
)158
document_builder.add_requirement_relation(
159
relation_type="Parent",
160
source_requirement_id="REQ-004",
161
target_requirement_id="REQ-003",
162
role=None,
163
)164
document_builder.add_requirement_relation(
165
relation_type="Parent",
166
source_requirement_id="REQ-005",
167
target_requirement_id="REQ-004",
168
role=None,
169
)170
document_builder.add_requirement_relation(
171
relation_type="Parent",
172
source_requirement_id="REQ-003",
173
target_requirement_id="REQ-005",
174
role=None,
175
)176
177
document_1 = document_builder.build()
178
179
file_tree = []
180
document_list = [document_1]
181
map_docs_by_paths = {}
182
document_tree = DocumentTree(
183
file_tree=file_tree,
184
document_list=document_list,
185
map_docs_by_paths=map_docs_by_paths,
186
map_docs_by_rel_paths={},
187
map_grammars_by_filenames={},
188
)189
with pytest.raises(DocumentTreeError) as exc_info:
190
_ = TraceabilityIndexBuilder.create_from_document_tree(
191
document_tree, project_config=document_builder.project_config
192
)193
194
exception: DocumentTreeError = exc_info.value
195
assert exception.problem_uid == "REQ-003"
196
assert exception.cycled_uids == [
197
"REQ-001",
198
"REQ-002",
199
"REQ-003",
200
"REQ-004",
201
"REQ-005",
202
]203
204
205
def test_invalid_05_4_reqs_good_then_3_cycled():
206
document_builder = DocumentBuilder()
207
_ = document_builder.add_requirement("REQ-001")
208
_ = document_builder.add_requirement("REQ-002")
209
_ = document_builder.add_requirement("REQ-003")
210
_ = document_builder.add_requirement("REQ-004")
211
212
document_builder.add_requirement_relation(
213
relation_type="Parent",
214
source_requirement_id="REQ-004",
215
target_requirement_id="REQ-003",
216
role=None,
217
)218
document_builder.add_requirement_relation(
219
relation_type="Parent",
220
source_requirement_id="REQ-003",
221
target_requirement_id="REQ-002",
222
role=None,
223
)224
document_builder.add_requirement_relation(
225
relation_type="Parent",
226
source_requirement_id="REQ-002",
227
target_requirement_id="REQ-001",
228
role=None,
229
)230
231
_ = document_builder.add_requirement("REQ-005")
232
_ = document_builder.add_requirement("REQ-006")
233
_ = document_builder.add_requirement("REQ-007")
234
235
document_builder.add_requirement_relation(
236
relation_type="Parent",
237
source_requirement_id="REQ-006",
238
target_requirement_id="REQ-005",
239
role=None,
240
)241
document_builder.add_requirement_relation(
242
relation_type="Parent",
243
source_requirement_id="REQ-007",
244
target_requirement_id="REQ-006",
245
role=None,
246
)247
document_builder.add_requirement_relation(
248
relation_type="Parent",
249
source_requirement_id="REQ-005",
250
target_requirement_id="REQ-007",
251
role=None,
252
)253
254
document_1 = document_builder.build()
255
256
file_tree = []
257
document_list = [document_1]
258
map_docs_by_paths = {}
259
document_tree = DocumentTree(
260
file_tree=file_tree,
261
document_list=document_list,
262
map_docs_by_paths=map_docs_by_paths,
263
map_docs_by_rel_paths={},
264
map_grammars_by_filenames={},
265
)266
with pytest.raises(DocumentTreeError):
267
_ = TraceabilityIndexBuilder.create_from_document_tree(
268
document_tree, project_config=document_builder.project_config
269
)270
271
272
def test__adding_parent_link__03__two_requirements_disallow_cycle():
273
document_builder = DocumentBuilder()
274
requirement1 = document_builder.add_requirement("REQ-001")
275
requirement2 = document_builder.add_requirement("REQ-002")
276
document_1 = document_builder.build()
277
278
file_tree = []
279
document_list = [document_1]
280
map_docs_by_paths = {}
281
document_tree = DocumentTree(
282
file_tree=file_tree,
283
document_list=document_list,
284
map_docs_by_paths=map_docs_by_paths,
285
map_docs_by_rel_paths={},
286
map_grammars_by_filenames={},
287
)288
traceability_index: TraceabilityIndex = (
289
TraceabilityIndexBuilder.create_from_document_tree(
290
document_tree, project_config=document_builder.project_config
291
)292
)293
traceability_index.update_requirement_parent_uid(
294
requirement2, "REQ-001", None
295
)296
with pytest.raises(DocumentTreeError) as exc_info:
297
traceability_index.update_requirement_parent_uid(
298
requirement1, "REQ-002", role=None
299
)300
301
exception: DocumentTreeError = exc_info.value
302
assert exception.problem_uid == "REQ-001"
303
assert exception.cycled_uids == ["REQ-001", "REQ-002"]