add key-import button to interface

This commit is contained in:
2022-11-25 02:12:05 +02:00
parent 766081d212
commit 5073c80af1
41 changed files with 727 additions and 177 deletions

View File

@ -2,7 +2,7 @@ import json
import logging
import pytest
from aiohttp.web_exceptions import HTTPBadRequest, HTTPInternalServerError, HTTPNoContent, HTTPUnauthorized
from aiohttp.web import HTTPBadRequest, HTTPInternalServerError, HTTPNoContent, HTTPUnauthorized
from pytest_mock import MockerFixture
from typing import Any
from unittest.mock import AsyncMock, MagicMock

View File

@ -21,18 +21,26 @@ async def test_post(client: TestClient, mocker: MockerFixture) -> None:
must call post request correctly
"""
add_mock = mocker.patch("ahriman.core.spawn.Spawn.packages_add")
response = await client.post("/api/v1/service/add", json={"packages": ["ahriman"]})
response = await client.post("/api/v1/service/add", json={"packages": ["ahriman"]})
assert response.ok
add_mock.assert_called_once_with(["ahriman"], now=True)
async def test_post_update(client: TestClient, mocker: MockerFixture) -> None:
async def test_post_empty(client: TestClient, mocker: MockerFixture) -> None:
"""
must call post request correctly for alias
must call raise 400 on empty request
"""
add_mock = mocker.patch("ahriman.core.spawn.Spawn.packages_add")
response = await client.post("/api/v1/service/update", json={"packages": ["ahriman"]})
assert response.ok
add_mock.assert_called_once_with(["ahriman"], now=True)
response = await client.post("/api/v1/service/add", json={"packages": [""]})
assert response.status == 400
add_mock.assert_not_called()
response = await client.post("/api/v1/service/add", json={"packages": []})
assert response.status == 400
add_mock.assert_not_called()
response = await client.post("/api/v1/service/add", json={})
assert response.status == 400
add_mock.assert_not_called()

View File

@ -0,0 +1,75 @@
import pytest
from aiohttp.test_utils import TestClient
from pytest_mock import MockerFixture
from ahriman.models.user_access import UserAccess
from ahriman.web.views.service.pgp import PGPView
async def test_get_permission() -> None:
"""
must return correct permission for the request
"""
for method in ("GET", "HEAD"):
request = pytest.helpers.request("", "", method)
assert await PGPView.get_permission(request) == UserAccess.Reporter
for method in ("POST",):
request = pytest.helpers.request("", "", method)
assert await PGPView.get_permission(request) == UserAccess.Full
async def test_get(client: TestClient, mocker: MockerFixture) -> None:
"""
must retrieve key from the keyserver
"""
import_mock = mocker.patch("ahriman.core.sign.gpg.GPG.key_download", return_value="imported")
response = await client.get("/api/v1/service/pgp", params={"key": "0xdeadbeaf", "server": "keyserver.ubuntu.com"})
assert response.ok
import_mock.assert_called_once_with("keyserver.ubuntu.com", "0xdeadbeaf")
assert await response.json() == {"key": "imported"}
async def test_get_empty(client: TestClient, mocker: MockerFixture) -> None:
"""
must raise 400 on missing parameters
"""
import_mock = mocker.patch("ahriman.core.sign.gpg.GPG.key_download")
response = await client.get("/api/v1/service/pgp")
assert response.status == 400
import_mock.assert_not_called()
async def test_get_process_exception(client: TestClient, mocker: MockerFixture) -> None:
"""
must raise 404 on invalid PGP server response
"""
import_mock = mocker.patch("ahriman.core.sign.gpg.GPG.key_download", side_effect=Exception())
response = await client.get("/api/v1/service/pgp", params={"key": "0xdeadbeaf", "server": "keyserver.ubuntu.com"})
assert response.status == 404
import_mock.assert_called_once_with("keyserver.ubuntu.com", "0xdeadbeaf")
async def test_post(client: TestClient, mocker: MockerFixture) -> None:
"""
must call post request correctly
"""
import_mock = mocker.patch("ahriman.core.spawn.Spawn.key_import")
response = await client.post("/api/v1/service/pgp", json={"key": "0xdeadbeaf", "server": "keyserver.ubuntu.com"})
assert response.ok
import_mock.assert_called_once_with("0xdeadbeaf", "keyserver.ubuntu.com")
async def test_post_exception(client: TestClient, mocker: MockerFixture) -> None:
"""
must raise exception on missing key payload
"""
import_mock = mocker.patch("ahriman.core.spawn.Spawn.key_import")
response = await client.post("/api/v1/service/pgp")
assert response.status == 400
import_mock.assert_not_called()

View File

@ -21,8 +21,8 @@ async def test_post(client: TestClient, mocker: MockerFixture) -> None:
must call post request correctly
"""
remove_mock = mocker.patch("ahriman.core.spawn.Spawn.packages_remove")
response = await client.post("/api/v1/service/remove", json={"packages": ["ahriman"]})
response = await client.post("/api/v1/service/remove", json={"packages": ["ahriman"]})
assert response.ok
remove_mock.assert_called_once_with(["ahriman"])
@ -32,7 +32,7 @@ async def test_post_exception(client: TestClient, mocker: MockerFixture) -> None
must raise exception on missing packages payload
"""
remove_mock = mocker.patch("ahriman.core.spawn.Spawn.packages_remove")
response = await client.post("/api/v1/service/remove")
response = await client.post("/api/v1/service/remove")
assert response.status == 400
remove_mock.assert_not_called()

View File

@ -21,8 +21,8 @@ async def test_post(client: TestClient, mocker: MockerFixture) -> None:
must call post request correctly
"""
add_mock = mocker.patch("ahriman.core.spawn.Spawn.packages_add")
response = await client.post("/api/v1/service/request", json={"packages": ["ahriman"]})
response = await client.post("/api/v1/service/request", json={"packages": ["ahriman"]})
assert response.ok
add_mock.assert_called_once_with(["ahriman"], now=False)
@ -32,7 +32,7 @@ async def test_post_exception(client: TestClient, mocker: MockerFixture) -> None
must raise exception on missing packages payload
"""
add_mock = mocker.patch("ahriman.core.spawn.Spawn.packages_add")
response = await client.post("/api/v1/service/request")
response = await client.post("/api/v1/service/request")
assert response.status == 400
add_mock.assert_not_called()

View File

@ -22,8 +22,8 @@ async def test_get(client: TestClient, aur_package_ahriman: AURPackage, mocker:
must call get request correctly
"""
mocker.patch("ahriman.core.alpm.remote.AUR.multisearch", return_value=[aur_package_ahriman])
response = await client.get("/api/v1/service/search", params={"for": "ahriman"})
response = await client.get("/api/v1/service/search", params={"for": "ahriman"})
assert response.ok
assert await response.json() == [{"package": aur_package_ahriman.package_base,
"description": aur_package_ahriman.description}]
@ -33,11 +33,20 @@ async def test_get_exception(client: TestClient, mocker: MockerFixture) -> None:
"""
must raise 400 on empty search string
"""
search_mock = mocker.patch("ahriman.core.alpm.remote.AUR.multisearch", return_value=[])
response = await client.get("/api/v1/service/search")
search_mock = mocker.patch("ahriman.core.alpm.remote.AUR.multisearch")
response = await client.get("/api/v1/service/search")
assert response.status == 400
search_mock.assert_not_called()
async def test_get_empty(client: TestClient, mocker: MockerFixture) -> None:
"""
must raise 404 on empty search result
"""
mocker.patch("ahriman.core.alpm.remote.AUR.multisearch", return_value=[])
response = await client.get("/api/v1/service/search", params={"for": "ahriman"})
assert response.status == 404
search_mock.assert_called_once_with(pacman=pytest.helpers.anyvar(int))
async def test_get_join(client: TestClient, mocker: MockerFixture) -> None:
@ -45,7 +54,7 @@ async def test_get_join(client: TestClient, mocker: MockerFixture) -> None:
must join search args with space
"""
search_mock = mocker.patch("ahriman.core.alpm.remote.AUR.multisearch")
response = await client.get("/api/v1/service/search", params=[("for", "ahriman"), ("for", "maybe")])
response = await client.get("/api/v1/service/search", params=[("for", "ahriman"), ("for", "maybe")])
assert response.ok
search_mock.assert_called_once_with("ahriman", "maybe", pacman=pytest.helpers.anyvar(int))

View File

@ -0,0 +1,13 @@
from aiohttp.test_utils import TestClient
from pytest_mock import MockerFixture
async def test_post_update(client: TestClient, mocker: MockerFixture) -> None:
"""
must call post request correctly for alias
"""
update_mock = mocker.patch("ahriman.core.spawn.Spawn.packages_update")
response = await client.post("/api/v1/service/update")
assert response.ok
update_mock.assert_called_once_with()

View File

@ -12,13 +12,6 @@ def test_configuration(base: BaseView) -> None:
assert base.configuration
def test_database(base: BaseView) -> None:
"""
must return database
"""
assert base.database
def test_service(base: BaseView) -> None:
"""
must return service
@ -50,6 +43,24 @@ async def test_get_permission(base: BaseView) -> None:
assert await base.get_permission(request) == "permission"
def test_get_non_empty() -> None:
"""
must correctly extract non-empty values
"""
assert BaseView.get_non_empty(lambda k: k, "key")
with pytest.raises(KeyError):
BaseView.get_non_empty(lambda k: None, "key")
with pytest.raises(KeyError):
BaseView.get_non_empty(lambda k: "", "key")
assert BaseView.get_non_empty(lambda k: [k], "key")
with pytest.raises(KeyError):
BaseView.get_non_empty(lambda k: [], "key")
async def test_extract_data_json(base: BaseView) -> None:
"""
must parse and return json