@@ -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 :
0 commit comments