Skip to content

Commit c93ea2f

Browse files
committed
Preserve multiple OpenCRE map analysis overlaps
1 parent a5d5548 commit c93ea2f

File tree

2 files changed

+71
-2
lines changed

2 files changed

+71
-2
lines changed

application/tests/web_main_test.py

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,70 @@ def test_gap_analysis_supports_opencre_as_standard(
729729
self.assertEqual(200, response.status_code)
730730
self.assertIn("result", payload)
731731
self.assertIn(opencre.id, payload["result"])
732-
self.assertIn(compare.id, payload["result"][opencre.id]["paths"])
732+
self.assertEqual(1, len(payload["result"][opencre.id]["paths"]))
733+
path = next(iter(payload["result"][opencre.id]["paths"].values()))
734+
self.assertEqual(compare.id, path["end"]["id"])
735+
schedule_mock.assert_not_called()
736+
737+
@patch.object(web_main.gap_analysis, "schedule")
738+
@patch.object(db, "Node_collection")
739+
def test_gap_analysis_preserves_multiple_opencre_overlaps(
740+
self, db_mock, schedule_mock
741+
) -> None:
742+
compare = defs.Standard(
743+
name="CWE",
744+
sectionID="1004",
745+
section="Sensitive Cookie Without 'HttpOnly' Flag",
746+
)
747+
opencre_documents = []
748+
internal_ids = []
749+
750+
for i in range(8):
751+
cre = defs.CRE(
752+
id=f"170-77{i}",
753+
name=f"Cryptography {i}",
754+
description="",
755+
)
756+
compare.add_link(
757+
defs.Link(ltype=defs.LinkTypes.LinkedTo, document=cre.shallow_copy())
758+
)
759+
opencre_documents.append(cre)
760+
internal_ids.append(SimpleNamespace(id=f"cre-internal-{i}"))
761+
762+
db_mock.return_value.get_gap_analysis_result.return_value = None
763+
db_mock.return_value.gap_analysis_exists.return_value = False
764+
db_mock.return_value.get_nodes.side_effect = lambda name=None, **kwargs: (
765+
[compare] if name == "CWE" else []
766+
)
767+
db_mock.return_value.session.query.return_value.all.return_value = internal_ids
768+
db_mock.return_value.get_CREs.side_effect = lambda internal_id=None, **kwargs: [
769+
next(
770+
cre
771+
for index, cre in enumerate(opencre_documents)
772+
if internal_id == f"cre-internal-{index}"
773+
)
774+
]
775+
776+
with self.app.test_client() as client:
777+
response = client.get(
778+
"/rest/v1/map_analysis?standard=CWE&standard=OpenCRE",
779+
headers={"Content-Type": "application/json"},
780+
)
781+
782+
payload = json.loads(response.data)
783+
self.assertEqual(200, response.status_code)
784+
self.assertIn("result", payload)
785+
self.assertIn(compare.id, payload["result"])
786+
self.assertEqual(8, len(payload["result"][compare.id]["paths"]))
787+
self.assertEqual(
788+
8,
789+
len(
790+
{
791+
path["end"]["id"]
792+
for path in payload["result"][compare.id]["paths"].values()
793+
}
794+
),
795+
)
733796
schedule_mock.assert_not_called()
734797

735798
def test_gap_analysis_weak_links_no_cache(self) -> None:

application/web/web_main.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,10 @@ def _build_direct_overlap_path(
380380
}
381381

382382

383+
def _make_direct_overlap_path_key(compare_document: defs.Document, cre_id: str) -> str:
384+
return f"{compare_document.id}::{cre_id}"
385+
386+
383387
def _build_direct_cre_overlap_map_analysis(
384388
standards: list[str],
385389
standards_hash: str,
@@ -406,7 +410,9 @@ def _build_direct_cre_overlap_map_analysis(
406410
path = _build_direct_overlap_path(base_node, cre_id, compare_node)
407411
if not path:
408412
continue
409-
shared_paths.setdefault(compare_node.id, path)
413+
shared_paths.setdefault(
414+
_make_direct_overlap_path_key(compare_node, cre_id), path
415+
)
410416

411417
if shared_paths:
412418
grouped_paths[base_node.id] = {

0 commit comments

Comments
 (0)