mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-04-24 07:17:17 +00:00
Same old song, after migraiton to packages some optional modules are being imported globally which lead to making hard dependency
182 lines
6.5 KiB
Python
182 lines
6.5 KiB
Python
import pytest
|
|
|
|
from asyncio import BaseEventLoop
|
|
from aiohttp import web
|
|
from aiohttp.test_utils import TestClient
|
|
from pytest_mock import MockerFixture
|
|
from typing import Any, Dict, Optional
|
|
from unittest.mock import MagicMock
|
|
|
|
import ahriman.core.auth.helpers
|
|
|
|
from ahriman.core.auth.oauth import OAuth
|
|
from ahriman.core.configuration import Configuration
|
|
from ahriman.core.database import SQLite
|
|
from ahriman.core.repository import Repository
|
|
from ahriman.core.spawn import Spawn
|
|
from ahriman.models.user import User
|
|
from ahriman.web.web import setup_service
|
|
|
|
|
|
@pytest.helpers.register
|
|
def request(app: web.Application, path: str, method: str, json: Any = None, data: Any = None,
|
|
extra: Optional[Dict[str, Any]] = None) -> MagicMock:
|
|
"""
|
|
request generator helper
|
|
|
|
Args:
|
|
app(web.Application): application fixture
|
|
path(str): path for the request
|
|
method(str): method for the request
|
|
json(Any, optional): json payload of the request (Default value = None)
|
|
data(Any, optional): form data payload of the request (Default value = None)
|
|
extra(Optional[Dict[str, Any]], optional): extra info which will be injected for ``get_extra_info`` command
|
|
|
|
Returns:
|
|
MagicMock: dummy request mock
|
|
"""
|
|
request_mock = MagicMock()
|
|
request_mock.app = app
|
|
request_mock.path = path
|
|
request_mock.method = method
|
|
request_mock.json = json
|
|
request_mock.post = data
|
|
|
|
extra = extra or {}
|
|
request_mock.get_extra_info.side_effect = lambda key: extra.get(key)
|
|
|
|
return request_mock
|
|
|
|
|
|
@pytest.fixture
|
|
def application(configuration: Configuration, spawner: Spawn, database: SQLite, repository: Repository,
|
|
mocker: MockerFixture) -> web.Application:
|
|
"""
|
|
application fixture
|
|
|
|
Args:
|
|
configuration(Configuration): configuration fixture
|
|
spawner(Spawn): spawner fixture
|
|
database(SQLite): database fixture
|
|
repository(Repository): repository fixture
|
|
mocker(MockerFixture): mocker object
|
|
|
|
Returns:
|
|
web.Application: application test instance
|
|
"""
|
|
mocker.patch("ahriman.core.database.SQLite.load", return_value=database)
|
|
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
|
|
mocker.patch.object(ahriman.core.auth.helpers, "_has_aiohttp_security", False)
|
|
return setup_service("x86_64", configuration, spawner)
|
|
|
|
|
|
@pytest.fixture
|
|
def application_with_auth(configuration: Configuration, user: User, spawner: Spawn, database: SQLite,
|
|
repository: Repository, mocker: MockerFixture) -> web.Application:
|
|
"""
|
|
application fixture with auth enabled
|
|
|
|
Args:
|
|
configuration(Configuration): configuration fixture
|
|
user(User): user descriptor fixture
|
|
spawner(Spawn): spawner fixture
|
|
database(SQLite): database fixture
|
|
repository(Repository): repository fixture
|
|
mocker(MockerFixture): mocker object
|
|
|
|
Returns:
|
|
web.Application: application test instance
|
|
"""
|
|
configuration.set_option("auth", "target", "configuration")
|
|
mocker.patch("ahriman.core.database.SQLite.load", return_value=database)
|
|
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
|
|
mocker.patch.object(ahriman.core.auth.helpers, "_has_aiohttp_security", True)
|
|
application = setup_service("x86_64", configuration, spawner)
|
|
|
|
generated = user.hash_password(application["validator"].salt)
|
|
mocker.patch("ahriman.core.database.SQLite.user_get", return_value=generated)
|
|
|
|
return application
|
|
|
|
|
|
@pytest.fixture
|
|
def application_with_debug(configuration: Configuration, user: User, spawner: Spawn, database: SQLite,
|
|
repository: Repository, mocker: MockerFixture) -> web.Application:
|
|
"""
|
|
application fixture with debug enabled
|
|
|
|
Args:
|
|
configuration(Configuration): configuration fixture
|
|
user(User): user descriptor fixture
|
|
spawner(Spawn): spawner fixture
|
|
database(SQLite): database fixture
|
|
repository(Repository): repository fixture
|
|
mocker(MockerFixture): mocker object
|
|
|
|
Returns:
|
|
web.Application: application test instance
|
|
"""
|
|
configuration.set_option("web", "debug", "yes")
|
|
mocker.patch("ahriman.core.database.SQLite.load", return_value=database)
|
|
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
|
|
mocker.patch.object(ahriman.core.auth.helpers, "_has_aiohttp_security", False)
|
|
return setup_service("x86_64", configuration, spawner)
|
|
|
|
|
|
@pytest.fixture
|
|
def client(application: web.Application, event_loop: BaseEventLoop,
|
|
aiohttp_client: Any, mocker: MockerFixture) -> TestClient:
|
|
"""
|
|
web client fixture
|
|
|
|
Args:
|
|
application(web.Application): application fixture
|
|
event_loop(BaseEventLoop): context event loop
|
|
aiohttp_client(Any): aiohttp client fixture
|
|
mocker(MockerFixture): mocker object
|
|
|
|
Returns:
|
|
TestClient: web client test instance
|
|
"""
|
|
mocker.patch("pathlib.Path.iterdir", return_value=[])
|
|
return event_loop.run_until_complete(aiohttp_client(application))
|
|
|
|
|
|
@pytest.fixture
|
|
def client_with_auth(application_with_auth: web.Application, event_loop: BaseEventLoop,
|
|
aiohttp_client: Any, mocker: MockerFixture) -> TestClient:
|
|
"""
|
|
web client fixture with full authorization functions
|
|
|
|
Args:
|
|
application_with_auth(web.Application): application fixture
|
|
event_loop(BaseEventLoop): context event loop
|
|
aiohttp_client(Any): aiohttp client fixture
|
|
mocker(MockerFixture): mocker object
|
|
|
|
Returns:
|
|
TestClient: web client test instance
|
|
"""
|
|
mocker.patch("pathlib.Path.iterdir", return_value=[])
|
|
return event_loop.run_until_complete(aiohttp_client(application_with_auth))
|
|
|
|
|
|
@pytest.fixture
|
|
def client_with_oauth_auth(application_with_auth: web.Application, event_loop: BaseEventLoop,
|
|
aiohttp_client: Any, mocker: MockerFixture) -> TestClient:
|
|
"""
|
|
web client fixture with full authorization functions
|
|
|
|
Args:
|
|
application_with_auth(web.Application): application fixture
|
|
event_loop(BaseEventLoop): context event loop
|
|
aiohttp_client(Any): aiohttp client fixture
|
|
mocker(MockerFixture): mocker object
|
|
|
|
Returns:
|
|
TestClient: web client test instance
|
|
"""
|
|
mocker.patch("pathlib.Path.iterdir", return_value=[])
|
|
application_with_auth["validator"] = MagicMock(spec=OAuth)
|
|
return event_loop.run_until_complete(aiohttp_client(application_with_auth))
|