Skip to content

Commit 3392144

Browse files
committed
Add package-first tests for elixir security v2 importer #1933
Signed-off-by: Michael Ehab Mikhail <[email protected]>
1 parent 0e9158a commit 3392144

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

vulnerabilities/tests/pipelines/test_elixir_security_v2_importer.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from unittest.mock import patch
1414

1515
import pytest
16+
from packageurl import PackageURL
1617

1718
from vulnerabilities.importer import AdvisoryData
1819
from vulnerabilities.pipelines.v2_importers.elixir_security_importer import (
@@ -106,3 +107,108 @@ def test_collect_advisories_skips_invalid_cve(mock_fetch_via_vcs, tmp_path):
106107
importer.clone()
107108
advisories = list(importer.collect_advisories())
108109
assert len(advisories) == 0
110+
111+
112+
@pytest.fixture
113+
def test_data_dir():
114+
return Path(__file__).parent.parent / "test_data" / "elixir_security"
115+
116+
117+
@patch("requests.get")
118+
def test_package_first_mode_success(mock_get, test_data_dir):
119+
directory_response = MagicMock()
120+
directory_response.status_code = 200
121+
directory_response.json.return_value = [
122+
{"name": "test_file.yml", "path": "packages/coherence/test_file.yml"}
123+
]
124+
125+
advisory_file_path = test_data_dir / "test_file.yml"
126+
advisory_content = advisory_file_path.read_text()
127+
128+
content_response = MagicMock()
129+
content_response.status_code = 200
130+
content_response.text = advisory_content
131+
132+
mock_get.side_effect = [directory_response, content_response]
133+
134+
purl = PackageURL(type="hex", name="coherence")
135+
importer = ElixirSecurityImporterPipeline(purl=purl)
136+
advisories = list(importer.collect_advisories())
137+
138+
assert len(advisories) == 1
139+
advisory = advisories[0]
140+
assert "CVE-2018-20301" in advisory.aliases
141+
assert advisory.summary == 'The Coherence library has "Mass Assignment"-like vulnerabilities.'
142+
assert len(advisory.affected_packages) == 1
143+
assert advisory.affected_packages[0].package.name == "coherence"
144+
145+
146+
@patch("requests.get")
147+
def test_package_first_mode_with_version_filter(mock_get, test_data_dir):
148+
directory_response = MagicMock()
149+
directory_response.status_code = 200
150+
directory_response.json.return_value = [
151+
{"name": "test_file.yml", "path": "packages/coherence/test_file.yml"}
152+
]
153+
154+
advisory_file_path = test_data_dir / "test_file.yml"
155+
advisory_content = advisory_file_path.read_text()
156+
157+
content_response = MagicMock()
158+
content_response.status_code = 200
159+
content_response.text = advisory_content
160+
161+
mock_get.side_effect = [directory_response, content_response]
162+
163+
# Version affected
164+
purl = PackageURL(type="hex", name="coherence", version="0.5.1")
165+
importer = ElixirSecurityImporterPipeline(purl=purl)
166+
advisories = list(importer.collect_advisories())
167+
assert len(advisories) == 1
168+
169+
# Version not affected
170+
mock_get.side_effect = [directory_response, content_response]
171+
purl = PackageURL(type="hex", name="coherence", version="0.5.2")
172+
importer = ElixirSecurityImporterPipeline(purl=purl)
173+
advisories = list(importer.collect_advisories())
174+
assert len(advisories) == 0
175+
176+
177+
@patch("requests.get")
178+
def test_package_first_mode_no_advisories(mock_get):
179+
mock_response = MagicMock()
180+
mock_response.status_code = 404
181+
mock_get.return_value = mock_response
182+
183+
purl = PackageURL(type="hex", name="nonexistent-package")
184+
importer = ElixirSecurityImporterPipeline(purl=purl)
185+
advisories = list(importer.collect_advisories())
186+
assert len(advisories) == 0
187+
188+
189+
@patch("requests.get")
190+
def test_package_first_mode_api_error(mock_get):
191+
directory_response = MagicMock()
192+
directory_response.status_code = 200
193+
directory_response.json.return_value = [
194+
{"name": "test_file.yml", "path": "packages/coherence/test_file.yml"}
195+
]
196+
197+
content_response = MagicMock()
198+
content_response.status_code = 500
199+
200+
mock_get.side_effect = [directory_response, content_response]
201+
202+
purl = PackageURL(type="hex", name="coherence")
203+
importer = ElixirSecurityImporterPipeline(purl=purl)
204+
advisories = list(importer.collect_advisories())
205+
assert len(advisories) == 0
206+
207+
208+
def test_package_first_mode_non_hex_purl():
209+
purl = PackageURL(type="npm", name="some-package")
210+
importer = ElixirSecurityImporterPipeline(purl=purl)
211+
advisories = list(importer.collect_advisories())
212+
assert len(advisories) == 0
213+
advisories = list(importer.collect_advisories())
214+
assert len(advisories) == 0

0 commit comments

Comments
 (0)