import pytest

from aiohttp.web import Application
from pytest_mock import MockerFixture

from ahriman import __version__
from ahriman.web.apispec import info
from ahriman.web.apispec.info import _info, _security, _servers, setup_apispec
from ahriman.web.keys import ConfigurationKey


def test_info() -> None:
    """
    must generate info object for swagger
    """
    info = _info()
    assert info["title"] == "ahriman"
    assert info["version"] == __version__


def test_security() -> None:
    """
    must generate security definitions for swagger
    """
    token = next(iter(_security()))["token"]
    assert token == {"type": "apiKey", "name": "AHRIMAN", "in": "cookie"}


def test_servers(application: Application) -> None:
    """
    must generate servers definitions
    """
    servers = _servers(application)
    assert servers == [{"url": "http://127.0.0.1:8080"}]


def test_servers_address(application: Application) -> None:
    """
    must generate servers definitions with address
    """
    application[ConfigurationKey].set_option("web", "address", "https://example.com")
    servers = _servers(application)
    assert servers == [{"url": "https://example.com"}]


def test_setup_apispec(application: Application, mocker: MockerFixture) -> None:
    """
    must set api specification
    """
    apispec_mock = mocker.patch("aiohttp_apispec.setup_aiohttp_apispec")

    setup_apispec(application)
    apispec_mock.assert_called_once_with(
        application,
        url="/api-docs/swagger.json",
        openapi_version="3.0.2",
        info=pytest.helpers.anyvar(int),
        servers=pytest.helpers.anyvar(int),
        security=pytest.helpers.anyvar(int),
    )


def test_setup_apispec_import_error(application: Application, mocker: MockerFixture) -> None:
    """
    must return none if apispec is not available
    """
    mocker.patch.object(info, "aiohttp_apispec", None)
    assert setup_apispec(application) is None
