From 7aba67186fa1725635450d6c666b348445a58c4e Mon Sep 17 00:00:00 2001 From: Evgenii Alekseev Date: Wed, 3 Jan 2024 03:26:16 +0200 Subject: [PATCH] feat: raise 404 in case if package is unknown for logs and patches --- src/ahriman/web/views/v1/status/logs.py | 2 +- src/ahriman/web/views/v1/status/patch.py | 12 ++++++++---- src/ahriman/web/views/v1/status/patches.py | 9 +++++++-- src/ahriman/web/views/v2/status/logs.py | 8 ++++++-- .../views/v1/status/test_view_v1_status_patch.py | 13 +++++++++++++ .../views/v1/status/test_view_v1_status_patches.py | 11 +++++++++++ .../web/views/v2/status/test_view_v2_status_logs.py | 11 +++++++++++ 7 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/ahriman/web/views/v1/status/logs.py b/src/ahriman/web/views/v1/status/logs.py index fecdf4b3..b7548a56 100644 --- a/src/ahriman/web/views/v1/status/logs.py +++ b/src/ahriman/web/views/v1/status/logs.py @@ -103,9 +103,9 @@ class LogsView(StatusViewGuard, BaseView): try: _, status = self.service().package_get(package_base) + logs = self.service().logs_get(package_base) except UnknownPackageError: raise HTTPNotFound(reason=f"Package {package_base} is unknown") - logs = self.service().logs_get(package_base) response = { "package_base": package_base, diff --git a/src/ahriman/web/views/v1/status/patch.py b/src/ahriman/web/views/v1/status/patch.py index 75f70cce..b37bf853 100644 --- a/src/ahriman/web/views/v1/status/patch.py +++ b/src/ahriman/web/views/v1/status/patch.py @@ -21,6 +21,7 @@ import aiohttp_apispec # type: ignore[import-untyped] from aiohttp.web import HTTPNoContent, HTTPNotFound, Response, json_response +from ahriman.core.exceptions import UnknownPackageError from ahriman.models.user_access import UserAccess from ahriman.web.schemas import AuthSchema, ErrorSchema, PatchNameSchema, PatchSchema from ahriman.web.views.base import BaseView @@ -75,7 +76,7 @@ class PatchView(StatusViewGuard, BaseView): 200: {"description": "Success response", "schema": PatchSchema}, 401: {"description": "Authorization required", "schema": ErrorSchema}, 403: {"description": "Access is forbidden", "schema": ErrorSchema}, - 404: {"description": "Patch name is unknown", "schema": ErrorSchema}, + 404: {"description": "Package base and/or patch name are unknown", "schema": ErrorSchema}, 500: {"description": "Internal server error", "schema": ErrorSchema}, }, security=[{"token": [GET_PERMISSION]}], @@ -95,10 +96,13 @@ class PatchView(StatusViewGuard, BaseView): package_base = self.request.match_info["package"] variable = self.request.match_info["patch"] - patches = self.service().patches_get(package_base, variable) - selected = next((patch for patch in patches if patch.key == variable), None) + try: + patches = self.service().patches_get(package_base, variable) + except UnknownPackageError: + raise HTTPNotFound(reason=f"Package {package_base} is unknown") + selected = next((patch for patch in patches if patch.key == variable), None) if selected is None: - raise HTTPNotFound + raise HTTPNotFound(reason=f"Patch {variable} is unknown") return json_response(selected.view()) diff --git a/src/ahriman/web/views/v1/status/patches.py b/src/ahriman/web/views/v1/status/patches.py index 935a8e20..f5773d6c 100644 --- a/src/ahriman/web/views/v1/status/patches.py +++ b/src/ahriman/web/views/v1/status/patches.py @@ -19,8 +19,9 @@ # import aiohttp_apispec # type: ignore[import-untyped] -from aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response +from aiohttp.web import HTTPBadRequest, HTTPNoContent, HTTPNotFound, Response, json_response +from ahriman.core.exceptions import UnknownPackageError from ahriman.models.pkgbuild_patch import PkgbuildPatch from ahriman.models.user_access import UserAccess from ahriman.web.schemas import AuthSchema, ErrorSchema, PackageNameSchema, PatchSchema @@ -49,6 +50,7 @@ class PatchesView(StatusViewGuard, BaseView): 200: {"description": "Success response", "schema": PatchSchema(many=True)}, 401: {"description": "Authorization required", "schema": ErrorSchema}, 403: {"description": "Access is forbidden", "schema": ErrorSchema}, + 404: {"description": "Package base is unknown", "schema": ErrorSchema}, 500: {"description": "Internal server error", "schema": ErrorSchema}, }, security=[{"token": [GET_PERMISSION]}], @@ -66,7 +68,10 @@ class PatchesView(StatusViewGuard, BaseView): HTTPNotFound: if package base is unknown """ package_base = self.request.match_info["package"] - patches = self.service().patches_get(package_base, None) + try: + patches = self.service().patches_get(package_base, None) + except UnknownPackageError: + raise HTTPNotFound(reason=f"Package {package_base} is unknown") response = [patch.view() for patch in patches] return json_response(response) diff --git a/src/ahriman/web/views/v2/status/logs.py b/src/ahriman/web/views/v2/status/logs.py index e383276a..e98838b5 100644 --- a/src/ahriman/web/views/v2/status/logs.py +++ b/src/ahriman/web/views/v2/status/logs.py @@ -19,8 +19,9 @@ # import aiohttp_apispec # type: ignore[import-untyped] -from aiohttp.web import Response, json_response +from aiohttp.web import HTTPNotFound, Response, json_response +from ahriman.core.exceptions import UnknownPackageError from ahriman.models.user_access import UserAccess from ahriman.web.schemas import AuthSchema, ErrorSchema, LogSchema, PackageNameSchema, PaginationSchema from ahriman.web.views.base import BaseView @@ -67,7 +68,10 @@ class LogsView(StatusViewGuard, BaseView): """ package_base = self.request.match_info["package"] limit, offset = self.page() - logs = self.service().logs_get(package_base, limit, offset) + try: + logs = self.service().logs_get(package_base, limit, offset) + except UnknownPackageError: + raise HTTPNotFound(reason=f"Package {package_base} is unknown") response = [ { diff --git a/tests/ahriman/web/views/v1/status/test_view_v1_status_patch.py b/tests/ahriman/web/views/v1/status/test_view_v1_status_patch.py index 231e751e..31d77dbf 100644 --- a/tests/ahriman/web/views/v1/status/test_view_v1_status_patch.py +++ b/tests/ahriman/web/views/v1/status/test_view_v1_status_patch.py @@ -79,3 +79,16 @@ async def test_get_not_found(client: TestClient, package_ahriman: Package) -> No response = await client.get(f"/api/v1/packages/{package_ahriman.base}/patches/random") assert response.status == 404 assert not response_schema.validate(await response.json()) + + +async def test_get_patch_not_found(client: TestClient, package_ahriman: Package) -> None: + """ + must return not found for missing patch + """ + await client.post(f"/api/v1/packages/{package_ahriman.base}", + json={"status": BuildStatusEnum.Success.value, "package": package_ahriman.view()}) + response_schema = pytest.helpers.schema_response(PatchView.get, code=404) + + response = await client.get(f"/api/v1/packages/{package_ahriman.base}/patches/random") + assert response.status == 404 + assert not response_schema.validate(await response.json()) diff --git a/tests/ahriman/web/views/v1/status/test_view_v1_status_patches.py b/tests/ahriman/web/views/v1/status/test_view_v1_status_patches.py index b1279c71..7a57ab3f 100644 --- a/tests/ahriman/web/views/v1/status/test_view_v1_status_patches.py +++ b/tests/ahriman/web/views/v1/status/test_view_v1_status_patches.py @@ -46,6 +46,17 @@ async def test_get(client: TestClient, package_ahriman: Package) -> None: assert patches == [patch.view()] +async def test_get_not_found(client: TestClient, package_ahriman: Package) -> None: + """ + must return not found for missing package + """ + response_schema = pytest.helpers.schema_response(PatchesView.get, code=404) + + response = await client.get(f"/api/v1/packages/{package_ahriman.base}/patches") + assert response.status == 404 + assert not response_schema.validate(await response.json()) + + async def test_post(client: TestClient, package_ahriman: Package) -> None: """ must create patch diff --git a/tests/ahriman/web/views/v2/status/test_view_v2_status_logs.py b/tests/ahriman/web/views/v2/status/test_view_v2_status_logs.py index b97f4ab7..cfc7ad42 100644 --- a/tests/ahriman/web/views/v2/status/test_view_v2_status_logs.py +++ b/tests/ahriman/web/views/v2/status/test_view_v2_status_logs.py @@ -96,3 +96,14 @@ async def test_get_bad_request(client: TestClient, package_ahriman: Package) -> response = await client.get(f"/api/v2/packages/{package_ahriman.base}/logs", params={"offset": "offset"}) assert response.status == 400 assert not response_schema.validate(await response.json()) + + +async def test_get_not_found(client: TestClient, package_ahriman: Package) -> None: + """ + must return not found for missing package + """ + response_schema = pytest.helpers.schema_response(LogsView.get, code=404) + + response = await client.get(f"/api/v2/packages/{package_ahriman.base}/logs") + assert response.status == 404 + assert not response_schema.validate(await response.json())