Skip to content

Commit 4e049cb

Browse files
committed
fix: clean up alpine importer and add pipeline tests
1 parent 562b016 commit 4e049cb

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

vulnerabilities/pipelines/v2_importers/alpine_security_importer.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@
2929
BRANCH_URL = "https://security.alpinelinux.org/branch/{branch}"
3030
ADVISORY_HEADERS = {"Accept": "application/ld+json"}
3131

32-
# EOL branches with data that no longer appear in the root API index.
33-
# 3.13 through 3.16 are omitted because the API returns 0 items for them.
32+
# EOL branches absent from root API index; 3.13-3.16 omitted (return 0 items)
3433
HISTORICAL_BRANCHES = [
3534
"3.22-community",
3635
"3.18-main",

vulnerabilities/tests/test_alpine_security_importer.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99

1010
import os
1111
from unittest import TestCase
12+
from unittest.mock import MagicMock
13+
from unittest.mock import patch
1214

15+
from vulnerabilities.pipelines.v2_importers.alpine_security_importer import (
16+
AlpineSecurityImporterPipeline,
17+
)
1318
from vulnerabilities.pipelines.v2_importers.alpine_security_importer import parse_advisory
1419
from vulnerabilities.tests import util_tests
1520
from vulnerabilities.utils import load_json
@@ -83,3 +88,28 @@ def test_parse_advisory_skips_unfixed_states(self):
8388
result = parse_advisory(data)
8489
self.assertIsNotNone(result)
8590
self.assertEqual(result.affected_packages, [])
91+
92+
93+
class TestAlpineSecurityImporterPipeline(TestCase):
94+
@patch("vulnerabilities.pipelines.v2_importers.alpine_security_importer.get_branches")
95+
@patch("vulnerabilities.pipelines.v2_importers.alpine_security_importer.requests.get")
96+
def test_collect_advisories_yields_advisory(self, mock_get, mock_branches):
97+
mock_branches.return_value = ["3.19-main"]
98+
data = load_json(os.path.join(TEST_DATA, "alpine_security_mock1.json"))
99+
resp = MagicMock()
100+
resp.json.return_value = {"items": [data]}
101+
resp.raise_for_status.return_value = None
102+
mock_get.return_value = resp
103+
advisories = list(AlpineSecurityImporterPipeline().collect_advisories())
104+
self.assertGreater(len(advisories), 0)
105+
106+
@patch("vulnerabilities.pipelines.v2_importers.alpine_security_importer.get_branches")
107+
@patch("vulnerabilities.pipelines.v2_importers.alpine_security_importer.requests.get")
108+
def test_collect_advisories_http_error_logs_and_continues(self, mock_get, mock_branches):
109+
mock_branches.return_value = ["3.19-main"]
110+
mock_get.side_effect = Exception("timeout")
111+
logger_name = "vulnerabilities.pipelines.v2_importers.alpine_security_importer"
112+
with self.assertLogs(logger_name, level="ERROR") as cm:
113+
advisories = list(AlpineSecurityImporterPipeline().collect_advisories())
114+
self.assertEqual(advisories, [])
115+
self.assertTrue(any("timeout" in msg for msg in cm.output))

0 commit comments

Comments
 (0)