summaryrefslogblamecommitdiffstatshomepage
path: root/tests/api/test_sort.py
blob: 65a4990c4fc74a6f7057d1b3aabbeb05d4885177 (plain) (tree)
1
2
3
4

                                 
 
                                            




















                                         

















                                           
































































                                                                                       
























                                                                               














































                                                                                    
                                                                      





























                                                                              
import pytest
from conftest import DB, Response

from hircine.db.models import Namespace, Tag


@pytest.fixture
def query_comic_sort(execute_sort):
    query = """
    query comics($sort: ComicSortInput) {
        comics(sort: $sort) {
            __typename
            count
            edges {
                id
                title
            }
        }
    }
    """

    return execute_sort(query)


@pytest.fixture
def query_artist_sort(execute_sort):
    query = """
    query artists($sort: ArtistSortInput) {
        artists(sort: $sort) {
            __typename
            count
            edges {
                id
                name
            }
        }
    }
    """

    return execute_sort(query)


@pytest.fixture
def query_namespace_sort(execute_sort):
    query = """
    query namespaces($sort: NamespaceSortInput) {
        namespaces(sort: $sort) {
            __typename
            count
            edges {
                id
                name
            }
        }
    }
    """

    return execute_sort(query)


@pytest.mark.parametrize(
    "sort,reverse",
    [
        ({"on": "DATE"}, False),
        ({"on": "DATE", "direction": "DESCENDING"}, True),
        ({"on": "DATE", "direction": "ASCENDING"}, False),
    ],
    ids=[
        "ascending (default)",
        "descending",
        "ascending",
    ],
)
@pytest.mark.anyio
async def test_query_comics_sort_date(gen_comic, query_comic_sort, sort, reverse):
    comics = await DB.add_all(*gen_comic)
    ids = [c.id for c in sorted(comics, key=lambda c: c.date, reverse=reverse)]

    response = Response(await query_comic_sort(sort))
    response.assert_is("ComicFilterResult")

    assert ids == [edge["id"] for edge in response.edges]


@pytest.mark.parametrize(
    "sort,reverse",
    [
        ({"on": "TAG_COUNT"}, False),
        ({"on": "TAG_COUNT", "direction": "DESCENDING"}, True),
        ({"on": "TAG_COUNT", "direction": "ASCENDING"}, False),
    ],
    ids=[
        "ascending (default)",
        "descending",
        "ascending",
    ],
)
@pytest.mark.anyio
async def test_query_comics_sort_tag_count(gen_comic, query_comic_sort, sort, reverse):
    comics = await DB.add_all(*gen_comic)
    ids = [c.id for c in sorted(comics, key=lambda c: len(c.tags), reverse=reverse)]

    response = Response(await query_comic_sort(sort))
    response.assert_is("ComicFilterResult")

    assert ids == [edge["id"] for edge in response.edges]


@pytest.mark.parametrize(
    "sort,reverse,expect",
    [
        ({"on": "COMIC_COUNT"}, False, [2, 3, 1, 4]),
        ({"on": "COMIC_COUNT", "direction": "DESCENDING"}, True, [1, 4, 2, 3]),
        ({"on": "COMIC_COUNT", "direction": "ASCENDING"}, False, [2, 3, 1, 4]),
    ],
    ids=[
        "ascending (default)",
        "descending",
        "ascending",
    ],
)
@pytest.mark.anyio
async def test_query_artists_sort_comic_count(
    gen_comic, query_artist_sort, sort, reverse, expect
):
    await DB.add_all(*gen_comic)

    response = Response(await query_artist_sort(sort))
    response.assert_is("ArtistFilterResult")

    assert expect == [edge["id"] for edge in response.edges]


@pytest.mark.anyio
async def test_query_comics_sort_random(gen_comic, query_comic_sort):
    comics = await DB.add_all(*gen_comic)
    ids = set([c.id for c in comics])

    response = Response(await query_comic_sort({"on": "RANDOM"}))
    response.assert_is("ComicFilterResult")

    assert ids == set(edge["id"] for edge in response.edges)


@pytest.mark.anyio
async def test_query_comics_sort_random_seed_direction(gen_comic, query_comic_sort):
    comics = await DB.add_all(*gen_comic)
    ids = set([c.id for c in comics])

    response = Response(
        await query_comic_sort(
            {"on": "RANDOM", "seed": 42069, "direction": "ASCENDING"}
        )
    )
    response.assert_is("ComicFilterResult")

    ascending_ids = [edge["id"] for edge in response.edges]

    assert ids == set(ascending_ids)

    response = Response(
        await query_comic_sort(
            {"on": "RANDOM", "seed": 42069, "direction": "DESCENDING"}
        )
    )
    response.assert_is("ComicFilterResult")

    descending_ids = [edge["id"] for edge in response.edges]

    assert ascending_ids == descending_ids[::-1]


@pytest.mark.anyio
async def test_query_namespace_sort_sort_name(query_namespace_sort):
    await DB.add(Namespace(name="one", sort_name="2"))
    await DB.add(Namespace(name="two", sort_name="1"))

    response = Response(await query_namespace_sort({"on": "SORT_NAME"}))
    response.assert_is("NamespaceFilterResult")

    assert [edge["name"] for edge in response.edges] == ["two", "one"]

@pytest.mark.parametrize(
    "sort,reverse,expect",
    [
        ({"on": "TAG_COUNT"}, False, [2, 1]),
        ({"on": "TAG_COUNT", "direction": "DESCENDING"}, True, [1, 2]),
        ({"on": "TAG_COUNT", "direction": "ASCENDING"}, False, [2, 1]),
    ],
    ids=[
        "ascending (default)",
        "descending",
        "ascending",
    ],
)
@pytest.mark.anyio
async def test_query_namespace_sort_tag_count(
    gen_comic, query_namespace_sort, sort, reverse, expect
):
    namespace_foo = Namespace(id=1, name="foo")
    namespace_bar = Namespace(id=2, name="bar")

    tag_foo = Tag(id=1, name="foo", namespaces=[namespace_foo])
    tag_bar = Tag(id=2, name="bar", namespaces=[namespace_foo, namespace_bar])

    await DB.add_all(tag_foo, tag_bar)

    response = Response(await query_namespace_sort(sort))
    response.assert_is("NamespaceFilterResult")

    assert expect == [edge["id"] for edge in response.edges]