diff --git a/cve_bin_tool/data_sources/osv_source.py b/cve_bin_tool/data_sources/osv_source.py index 1266db1358..25342ef252 100644 --- a/cve_bin_tool/data_sources/osv_source.py +++ b/cve_bin_tool/data_sources/osv_source.py @@ -387,3 +387,8 @@ async def get_cve_data(self): await self.update_cve_entries() return self.format_data(self.all_cve_entries), self.source_name +import pytest +from unittest.mock import AsyncMock, patch + +from cve_bin_tool.data_sources.osv_source import OSV_Source + diff --git a/test/test_osv_source.py b/test/test_osv_source.py new file mode 100644 index 0000000000..d8d40885be --- /dev/null +++ b/test/test_osv_source.py @@ -0,0 +1,36 @@ +import pytest +from unittest.mock import patch +from cve_bin_tool.data_sources.osv_source import OSV_Source + +@pytest.mark.asyncio +async def test_update_ecosystems_mocked(): + # Create an instance of OSV_Source + osv = OSV_Source() + + with patch("cve_bin_tool.data_sources.osv_source.aio_run_command") as mock_run: + # Mock gsutil ls and gsutil ls for all.zip + mock_run.side_effect = [ + (b"gs://osv-vulnerabilities/ecosystem1/\n", b"", b""), # gsutil ls base + (b"gs://osv-vulnerabilities/ecosystem1/all.zip\n", b"", b""), # gsutil ls all.zip + (b"", b"", b"") # fallback mock result + ] + + await osv.update_ecosystems() + + assert osv.ecosystems == ["ecosystem1"] + +@pytest.mark.asyncio +@patch("cve_bin_tool.data_sources.osv_source.aio_run_command", new_callable=AsyncMock) +async def test_update_ecosystems(mock_aio_run_command): + # Mock gsutil output: two folders, one of them contains all.zip + mock_aio_run_command.side_effect = [ + b"https://osv-vulnerabilities/python/\nhttps://osv-vulnerabilities/rust/\n", + b"https://osv-vulnerabilities/python/all.zip\n", + b"", # rust does not contain all.zip + ] + + osv = OSV_Source() + await osv.update_ecosystems() + + assert "python" in osv.ecosystems + assert "rust" not in osv.ecosystems