import pytest

from openlobby.core.api.paginator import Paginator, encode_cursor
from openlobby.core.search import query_reports, reports_by_author

from .dummy import prepare_reports


pytestmark = [pytest.mark.django_db, pytest.mark.usefixtures('django_es')]


@pytest.mark.parametrize('query, expected_ids', [
    ('', [3, 2, 1]),
    ('sauron', [3, 2]),
    ('towers', [2]),
    ('Aragorn Gandalf', [3, 1]),
])
def test_query_reports(query, expected_ids):
    prepare_reports()
    paginator = Paginator()
    response = query_reports(query, paginator)
    assert expected_ids == [int(r.meta.id) for r in response]


def test_query_reports__highlight():
    prepare_reports()
    paginator = Paginator()
    query = 'King'
    response = query_reports(query, paginator, highlight=True)
    doc = response.hits[0]
    assert '<mark>King</mark>' in doc.meta.highlight.title[0]
    assert '<mark>King</mark>' in doc.meta.highlight.body[0]


@pytest.mark.parametrize('first, after, expected_ids', [
    (2, None, [3, 2]),
    (2, encode_cursor(1), [2, 1]),
])
def test_query_reports__pagination(first, after, expected_ids):
    prepare_reports()
    query = ''
    paginator = Paginator(first=first, after=after)
    response = query_reports(query, paginator)
    assert expected_ids == [int(r.meta.id) for r in response]


def test_reports_by_author():
    prepare_reports()
    author_id = 1
    paginator = Paginator()
    response = reports_by_author(author_id, paginator)
    assert [3, 1] == [int(r.meta.id) for r in response]


@pytest.mark.parametrize('first, after, expected_ids', [
    (1, None, [3]),
    (1, encode_cursor(1), [1]),
])
def test_reports_by_author__pagination(first, after, expected_ids):
    prepare_reports()
    author_id = 1
    paginator = Paginator(first=first, after=after)
    response = reports_by_author(author_id, paginator)
    assert expected_ids == [int(r.meta.id) for r in response]