from functools import partial
import pytest
from conftest import DB, Response
from hircine.db.models import Namespace, Tag
@pytest.fixture
def query_comic_tags(schema_execute):
query = """
query comicTags($forFilter: Boolean) {
comicTags(forFilter: $forFilter) {
edges {
__typename
id
name
}
count
}
}
"""
def wrapper(q):
async def _execute(for_filter=False):
return await schema_execute(q, {"forFilter": for_filter})
return _execute
return wrapper(query)
def build_item(namespace, tag):
nid, tid = "", ""
nname, tname = "", ""
if namespace:
nid, nname = namespace.id, namespace.name
if tag:
tid, tname = tag.id, tag.name
item = {
"__typename": "ComicTag",
"id": f"{nid}:{tid}",
"name": f"{nname}:{tname}",
}
return item
@pytest.mark.anyio
async def test_query_comic_tags_cross(query_comic_tags):
ns_foo = Namespace(id=1, name="foo")
ns_bar = Namespace(id=2, name="bar")
tag_qoo = Tag(id=1, name="qoo", namespaces=[ns_foo, ns_bar])
tag_qar = Tag(id=2, name="qar", namespaces=[ns_foo, ns_bar])
await DB.add_all(ns_foo, ns_bar)
await DB.add_all(tag_qoo, tag_qar)
builder = partial(build_item)
response = Response(await query_comic_tags())
assert response.data["edges"] == [
builder(ns_bar, tag_qar),
builder(ns_bar, tag_qoo),
builder(ns_foo, tag_qar),
builder(ns_foo, tag_qoo),
]
@pytest.mark.anyio
async def test_query_comic_tags_restricted_namespace(query_comic_tags):
ns_foo = Namespace(id=1, name="foo")
ns_bar = Namespace(id=2, name="bar")
tag_qoo = Tag(id=1, name="qoo", namespaces=[ns_bar])
tag_qar = Tag(id=2, name="qar", namespaces=[ns_foo])
await DB.add_all(ns_foo, ns_bar)
await DB.add_all(tag_qoo, tag_qar)
builder = partial(build_item)
response = Response(await query_comic_tags())
assert response.data["edges"] == [
builder(ns_bar, tag_qoo),
builder(ns_foo, tag_qar),
]
@pytest.mark.anyio
async def test_query_comic_tag_matchers_cross(query_comic_tags):
ns_foo = Namespace(id=1, name="foo")
ns_bar = Namespace(id=2, name="bar")
tag_qoo = Tag(id=1, name="qoo", namespaces=[ns_foo, ns_bar])
tag_qar = Tag(id=2, name="qar", namespaces=[ns_foo, ns_bar])
await DB.add_all(ns_foo, ns_bar, tag_qoo, tag_qar)
builder = partial(build_item)
response = Response(await query_comic_tags(for_filter=True))
assert response.data["edges"] == [
builder(ns_bar, None),
builder(ns_foo, None),
builder(None, tag_qar),
builder(None, tag_qoo),
builder(ns_bar, tag_qar),
builder(ns_bar, tag_qoo),
builder(ns_foo, tag_qar),
builder(ns_foo, tag_qoo),
]
@pytest.mark.anyio
async def test_query_comic_tag_matchers_restricted_namespace(query_comic_tags):
ns_foo = Namespace(id=1, name="foo")
ns_bar = Namespace(id=2, name="bar")
tag_qoo = Tag(id=1, name="qoo", namespaces=[ns_bar])
tag_qar = Tag(id=2, name="qar", namespaces=[ns_foo])
await DB.add_all(ns_foo, ns_bar, tag_qoo, tag_qar)
builder = partial(build_item)
response = Response(await query_comic_tags(for_filter=True))
assert response.data["edges"] == [
builder(ns_bar, None),
builder(ns_foo, None),
builder(None, tag_qar),
builder(None, tag_qoo),
builder(ns_bar, tag_qoo),
builder(ns_foo, tag_qar),
]