|
10 | 10 | import json |
11 | 11 | import os |
12 | 12 | from unittest import TestCase |
| 13 | +from unittest.mock import MagicMock |
| 14 | +from unittest.mock import patch |
13 | 15 |
|
| 16 | +from vulnerabilities.pipelines.v2_importers.collabora_importer import CollaboraImporterPipeline |
14 | 17 | from vulnerabilities.pipelines.v2_importers.collabora_importer import parse_advisory |
15 | 18 |
|
16 | 19 | TEST_DATA = os.path.join(os.path.dirname(__file__), "test_data", "collabora") |
@@ -109,3 +112,42 @@ def test_parse_advisory_original_text_is_json(self): |
109 | 112 | self.assertIsNotNone(advisory) |
110 | 113 | parsed = json.loads(advisory.original_advisory_text) |
111 | 114 | self.assertEqual(parsed["ghsa_id"], data["ghsa_id"]) |
| 115 | + |
| 116 | + |
| 117 | +class TestCollaboraImporterPipeline(TestCase): |
| 118 | + def _mock_response(self, data, next_url=None): |
| 119 | + resp = MagicMock() |
| 120 | + resp.json.return_value = data |
| 121 | + resp.raise_for_status.return_value = None |
| 122 | + resp.links = {"next": {"url": next_url}} if next_url else {} |
| 123 | + return resp |
| 124 | + |
| 125 | + @patch("vulnerabilities.pipelines.v2_importers.collabora_importer.requests.get") |
| 126 | + def test_collect_advisories_single_page(self, mock_get): |
| 127 | + data = load_json("collabora_mock1.json") |
| 128 | + mock_get.return_value = self._mock_response([data]) |
| 129 | + advisories = list(CollaboraImporterPipeline().collect_advisories()) |
| 130 | + self.assertEqual(len(advisories), 1) |
| 131 | + self.assertEqual(advisories[0].advisory_id, data["ghsa_id"]) |
| 132 | + |
| 133 | + @patch("vulnerabilities.pipelines.v2_importers.collabora_importer.requests.get") |
| 134 | + def test_collect_advisories_pagination(self, mock_get): |
| 135 | + data1 = load_json("collabora_mock1.json") |
| 136 | + data2 = load_json("collabora_mock2.json") |
| 137 | + mock_get.side_effect = [ |
| 138 | + self._mock_response([data1], next_url="https://api.github.com/page2"), |
| 139 | + self._mock_response([data2]), |
| 140 | + ] |
| 141 | + advisories = list(CollaboraImporterPipeline().collect_advisories()) |
| 142 | + self.assertEqual(len(advisories), 2) |
| 143 | + self.assertEqual(advisories[0].advisory_id, data1["ghsa_id"]) |
| 144 | + self.assertEqual(advisories[1].advisory_id, data2["ghsa_id"]) |
| 145 | + |
| 146 | + @patch("vulnerabilities.pipelines.v2_importers.collabora_importer.requests.get") |
| 147 | + def test_collect_advisories_http_error_logs_and_stops(self, mock_get): |
| 148 | + mock_get.side_effect = Exception("connection refused") |
| 149 | + logger_name = "vulnerabilities.pipelines.v2_importers.collabora_importer" |
| 150 | + with self.assertLogs(logger_name, level="ERROR") as cm: |
| 151 | + advisories = list(CollaboraImporterPipeline().collect_advisories()) |
| 152 | + self.assertEqual(advisories, []) |
| 153 | + self.assertTrue(any("connection refused" in msg for msg in cm.output)) |
0 commit comments