Skip to content

Commit

Permalink
aio.api.nist: Improve error handling
Browse files Browse the repository at this point in the history
Signed-off-by: Ryan Northey <ryan@synca.io>
  • Loading branch information
phlax committed Oct 28, 2023
1 parent da20c78 commit 7a6e0f1
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 21 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ pypi: https://pypi.org/project/aio.api.github

#### [aio.api.nist](aio.api.nist)

version: 0.0.4.dev0
version: 0.0.4

pypi: https://pypi.org/project/aio.api.nist

Expand Down
2 changes: 1 addition & 1 deletion aio.api.nist/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.0.4-dev
0.0.4
1 change: 1 addition & 0 deletions aio.api.nist/aio/api/nist/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ toolshed_library(
"//deps:reqs#abstracts",
"//deps:reqs#aio.core",
"//deps:reqs#aiohttp",
"//deps:reqs#packaging",
],
sources=[
"abstract/__init__.py",
Expand Down
5 changes: 4 additions & 1 deletion aio.api.nist/aio/api/nist/abstract/downloader.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from aio.core.functional import async_property, QueryDict
from aio.core.tasks import concurrent

from aio.api.nist import abstract, interface, typing
from aio.api.nist import abstract, exceptions, interface, typing


logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -166,6 +166,9 @@ async def download_and_parse(
download = None
if not data:
download = await self.download(url)
if download.status != 200:
raise exceptions.CVEDownloadError(
f"Download failed {url}: {download.reason}")
data = await download.read()
self.add(*await self.parse(url, data))
logger.debug(f"CVE data saved: {url}")
Expand Down
4 changes: 4 additions & 0 deletions aio.api.nist/aio/api/nist/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,7 @@ class CVEError(NISTError):

class CVECheckError(NISTError):
pass


class CVEDownloadError(NISTError):
pass
66 changes: 48 additions & 18 deletions aio.api.nist/tests/test_abstract_downloader.py
Original file line number Diff line number Diff line change
Expand Up @@ -284,42 +284,72 @@ def test_downloader_add(patches):
== [(cpe_revmap, ), {}])


async def test_downloader_download_and_parse(patches):
@pytest.mark.parametrize("data", [True, False])
@pytest.mark.parametrize("raises", [True, False])
async def test_downloader_download_and_parse(patches, data, raises):
downloader = DummyNISTDownloader("URLS", "TRACKED_CPES")
patched = patches(
"logger",
("ANISTDownloader.session",
dict(new_callable=PropertyMock)),
"ANISTDownloader.download",
"ANISTDownloader.add",
"ANISTDownloader.parse",
"Predownload",
prefix="aio.api.nist.abstract.downloader")
url = MagicMock()
_data = MagicMock()
kwargs = (
dict(data=_data)
if data
else {})

with patched as (m_logger, m_session, m_add, m_parse):
with patched as (m_logger, m_download, m_add, m_parse, m_pre):
m_download.return_value.status = (
200
if not raises
else 500)
m_parse.return_value = "FOO", "BAR"
m_session.return_value.get = AsyncMock()
if raises and not data:
with pytest.raises(nist.exceptions.CVEDownloadError) as e:
await downloader.download_and_parse(url, **kwargs)
else:
assert (
await downloader.download_and_parse(url, **kwargs)
== (m_download.return_value
if not data
else m_pre.return_value))

if data:
assert not m_download.called
else:
assert not m_pre.called
assert (
await downloader.download_and_parse(url)
== m_session.return_value.get.return_value)

m_download.call_args
== [(url, ), {}])
if not raises:
assert (
m_download.return_value.read.call_args
== [(), {}])
else:
assert (
e.value.args[0]
== f"Download failed {url}: {m_download.return_value.reason}")
assert not m_add.called
assert not m_parse.called
assert not m_logger.debug.called
return
assert (
m_session.return_value.get.call_args
== [(url, ), {}])
assert (
m_logger.debug.call_args_list
== [[(f"Downloading CVE data: {url}", ), {}],
[(f"CVE data saved: {url}", ), {}]])
m_logger.debug.call_args
== [(f"CVE data saved: {url}", ), {}])
assert (
m_add.call_args
== [("FOO", "BAR"), {}])
assert (
m_parse.call_args
== [(url,
m_session.return_value.get.return_value.read.return_value, ),
(m_download.return_value.read.return_value
if not data
else _data), ),
{}])
assert (
m_session.return_value.get.return_value.read.call_args
== [(), {}])


async def test_downloader_parse(patches):
Expand Down

0 comments on commit 7a6e0f1

Please sign in to comment.