base web tests

This commit is contained in:
Evgenii Alekseev 2021-03-28 06:45:16 +03:00
parent a5716fa8a8
commit 2c90efc339
9 changed files with 73 additions and 13 deletions

View File

@ -36,6 +36,7 @@ setup(
],
tests_require=[
"pytest",
"pytest-asyncio",
"pytest-cov",
"pytest-helpers-namespace",
"pytest-mock",

View File

@ -40,4 +40,4 @@ class Web(Handler):
"""
from ahriman.web.web import run_server, setup_service
application = setup_service(architecture, config)
run_server(application, architecture)
run_server(application)

View File

@ -51,15 +51,14 @@ async def on_startup(application: web.Application) -> None:
raise InitializeException()
def run_server(application: web.Application, architecture: str) -> None:
def run_server(application: web.Application) -> None:
"""
run web application
:param application: web application instance
:param architecture: repository architecture
"""
application.logger.info("start server")
section = application["config"].get_section_name("web", architecture)
section = application["config"].get_section_name("web", application["architecture"])
host = application["config"].get(section, "host")
port = application["config"].getint(section, "port")
@ -88,6 +87,7 @@ def setup_service(architecture: str, config: Configuration) -> web.Application:
application.logger.info("setup configuration")
application["config"] = config
application["architecture"] = architecture
application.logger.info("setup watcher")
application["watcher"] = Watcher(architecture, config)

View File

@ -1,9 +1,11 @@
import pytest
from pathlib import Path
from pytest_mock import MockerFixture
from typing import Any, Type, TypeVar
from ahriman.core.configuration import Configuration
from ahriman.core.status.watcher import Watcher
from ahriman.models.package import Package
from ahriman.models.package_desciption import PackageDescription
from ahriman.models.repository_paths import RepositoryPaths
@ -85,3 +87,9 @@ def repository_paths() -> RepositoryPaths:
return RepositoryPaths(
architecture="x86_64",
root=Path("/var/lib/ahriman"))
@pytest.fixture
def watcher(configuration: Configuration, mocker: MockerFixture) -> Watcher:
mocker.patch("pathlib.Path.mkdir")
return Watcher("x86_64", configuration)

View File

@ -1,11 +1,8 @@
import pytest
from pytest_mock import MockerFixture
from typing import Any, Dict
from ahriman.core.configuration import Configuration
from ahriman.core.status.client import Client
from ahriman.core.status.watcher import Watcher
from ahriman.core.status.web_client import WebClient
from ahriman.models.build_status import BuildStatus, BuildStatusEnum
from ahriman.models.package import Package
@ -28,12 +25,6 @@ def client() -> Client:
return Client()
@pytest.fixture
def watcher(configuration: Configuration, mocker: MockerFixture) -> Watcher:
mocker.patch("pathlib.Path.mkdir")
return Watcher("x86_64", configuration)
@pytest.fixture
def web_client() -> WebClient:
return WebClient("localhost", 8080)

View File

@ -0,0 +1,13 @@
import pytest
from aiohttp import web
from pytest_mock import MockerFixture
from ahriman.core.configuration import Configuration
from ahriman.web.web import setup_service
@pytest.fixture
def application(configuration: Configuration, mocker: MockerFixture) -> web.Application:
mocker.patch("pathlib.Path.mkdir")
return setup_service("x86_64", configuration)

View File

View File

@ -0,0 +1,47 @@
import pytest
from aiohttp import web
from pytest_mock import MockerFixture
from ahriman.core.exceptions import InitializeException
from ahriman.core.status.watcher import Watcher
from ahriman.web.web import on_startup, run_server
@pytest.mark.asyncio
async def test_on_startup(application: web.Application, watcher: Watcher, mocker: MockerFixture) -> None:
"""
must call load method
"""
mocker.patch("aiohttp.web.Application.__getitem__", return_value=watcher)
load_mock = mocker.patch("ahriman.core.status.watcher.Watcher.load")
await on_startup(application)
load_mock.assert_called_once()
@pytest.mark.asyncio
async def test_on_startup_exception(application: web.Application, watcher: Watcher, mocker: MockerFixture) -> None:
"""
must throw exception on load error
"""
mocker.patch("aiohttp.web.Application.__getitem__", return_value=watcher)
mocker.patch("ahriman.core.status.watcher.Watcher.load", side_effect=Exception())
with pytest.raises(InitializeException):
await on_startup(application)
def test_run(application: web.Application, mocker: MockerFixture) -> None:
"""
must run application
"""
host = "localhost"
port = 8080
application["config"].set("web", "host", host)
application["config"].set("web", "port", str(port))
run_app_mock = mocker.patch("aiohttp.web.run_app")
run_server(application)
run_app_mock.assert_called_with(application, host=host, port=port,
handle_signals=False, access_log=pytest.helpers.anyvar(int))