mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-06-28 06:41:43 +00:00
add key-import button to interface
This commit is contained in:
@ -17,7 +17,7 @@ def _default_args(args: argparse.Namespace) -> argparse.Namespace:
|
||||
argparse.Namespace: generated arguments for these test cases
|
||||
"""
|
||||
args.key = "0xE989490C"
|
||||
args.key_server = "pgp.mit.edu"
|
||||
args.key_server = "keyserver.ubuntu.com"
|
||||
return args
|
||||
|
||||
|
||||
|
@ -81,9 +81,9 @@ def test_key_download(gpg: GPG, mocker: MockerFixture) -> None:
|
||||
must download the key from public server
|
||||
"""
|
||||
requests_mock = mocker.patch("requests.get")
|
||||
gpg.key_download("pgp.mit.edu", "0xE989490C")
|
||||
gpg.key_download("keyserver.ubuntu.com", "0xE989490C")
|
||||
requests_mock.assert_called_once_with(
|
||||
"http://pgp.mit.edu/pks/lookup",
|
||||
"https://keyserver.ubuntu.com/pks/lookup",
|
||||
params={"op": "get", "options": "mr", "search": "0xE989490C"},
|
||||
timeout=gpg.DEFAULT_TIMEOUT)
|
||||
|
||||
@ -94,7 +94,7 @@ def test_key_download_failure(gpg: GPG, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
mocker.patch("requests.get", side_effect=requests.exceptions.HTTPError())
|
||||
with pytest.raises(requests.exceptions.HTTPError):
|
||||
gpg.key_download("pgp.mit.edu", "0xE989490C")
|
||||
gpg.key_download("keyserver.ubuntu.com", "0xE989490C")
|
||||
|
||||
|
||||
def test_key_import(gpg: GPG, mocker: MockerFixture) -> None:
|
||||
@ -104,7 +104,7 @@ def test_key_import(gpg: GPG, mocker: MockerFixture) -> None:
|
||||
mocker.patch("ahriman.core.sign.gpg.GPG.key_download", return_value="key")
|
||||
check_output_mock = mocker.patch("ahriman.core.sign.gpg.GPG._check_output")
|
||||
|
||||
gpg.key_import("pgp.mit.edu", "0xE989490C")
|
||||
gpg.key_import("keyserver.ubuntu.com", "0xE989490C")
|
||||
check_output_mock.assert_called_once_with("gpg", "--import", input_data="key", logger=pytest.helpers.anyvar(int))
|
||||
|
||||
|
||||
|
@ -36,6 +36,24 @@ def test_process_error(spawner: Spawn) -> None:
|
||||
assert spawner.queue.empty()
|
||||
|
||||
|
||||
def test_key_import(spawner: Spawn, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must call key import
|
||||
"""
|
||||
spawn_mock = mocker.patch("ahriman.core.spawn.Spawn.spawn_process")
|
||||
spawner.key_import("0xdeadbeaf", None)
|
||||
spawn_mock.assert_called_once_with("key-import", "0xdeadbeaf")
|
||||
|
||||
|
||||
def test_key_import_with_server(spawner: Spawn, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must call key import with server specified
|
||||
"""
|
||||
spawn_mock = mocker.patch("ahriman.core.spawn.Spawn.spawn_process")
|
||||
spawner.key_import("0xdeadbeaf", "keyserver.ubuntu.com")
|
||||
spawn_mock.assert_called_once_with("key-import", "0xdeadbeaf", **{"key-server": "keyserver.ubuntu.com"})
|
||||
|
||||
|
||||
def test_packages_add(spawner: Spawn, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must call package addition
|
||||
@ -54,15 +72,6 @@ def test_packages_add_with_build(spawner: Spawn, mocker: MockerFixture) -> None:
|
||||
spawn_mock.assert_called_once_with("package-add", "ahriman", "linux", source="aur", now="")
|
||||
|
||||
|
||||
def test_packages_add_update(spawner: Spawn, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must call repo update
|
||||
"""
|
||||
spawn_mock = mocker.patch("ahriman.core.spawn.Spawn.spawn_process")
|
||||
spawner.packages_add([], now=False)
|
||||
spawn_mock.assert_called_once_with("repo-update")
|
||||
|
||||
|
||||
def test_packages_remove(spawner: Spawn, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must call package removal
|
||||
@ -72,6 +81,15 @@ def test_packages_remove(spawner: Spawn, mocker: MockerFixture) -> None:
|
||||
spawn_mock.assert_called_once_with("package-remove", "ahriman", "linux")
|
||||
|
||||
|
||||
def test_packages_update(spawner: Spawn, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must call repo update
|
||||
"""
|
||||
spawn_mock = mocker.patch("ahriman.core.spawn.Spawn.spawn_process")
|
||||
spawner.packages_update()
|
||||
spawn_mock.assert_called_once_with("repo-update")
|
||||
|
||||
|
||||
def test_spawn_process(spawner: Spawn, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must correctly spawn child process
|
||||
|
@ -325,6 +325,7 @@ def test_walk(resource_path_root: Path) -> None:
|
||||
resource_path_root / "models" / "package_tpacpi-bat-git_srcinfo",
|
||||
resource_path_root / "models" / "package_yay_srcinfo",
|
||||
resource_path_root / "web" / "templates" / "build-status" / "failed-modal.jinja2",
|
||||
resource_path_root / "web" / "templates" / "build-status" / "key-import-modal.jinja2",
|
||||
resource_path_root / "web" / "templates" / "build-status" / "login-modal.jinja2",
|
||||
resource_path_root / "web" / "templates" / "build-status" / "package-add-modal.jinja2",
|
||||
resource_path_root / "web" / "templates" / "build-status" / "package-info-modal.jinja2",
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
75
tests/ahriman/web/views/service/test_views_service_pgp.py
Normal file
75
tests/ahriman/web/views/service/test_views_service_pgp.py
Normal 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()
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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))
|
||||
|
13
tests/ahriman/web/views/service/test_views_service_update.py
Normal file
13
tests/ahriman/web/views/service/test_views_service_update.py
Normal 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()
|
@ -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
|
||||
|
Reference in New Issue
Block a user