# (c) cavaliba.com - tests / dataview "query" field loaded on a ?dv= switch

"""
A _dataview can carry its own "query" (search filter). Switching to that view
from the dropdown (?dv=NAME) loads it into the list page's search box and
filters the rows, and resets the paginator to page 1 - a narrowing filter on a
remembered page 2 would otherwise show nothing.
"""

from django.test import TestCase, override_settings
from django.urls import reverse

import app_home.cache as cache
from tests import helper

CLASSNAME = "dvqswitch"


@override_settings(CAVALIBA_AUTH_MODE="unittest")
class TestDataViewQuerySwitch(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_admin_user(login="unittest")
        helper.add_schema(
            classname=CLASSNAME,
            field_definition={"status": {"dataformat": "string", "displayname": "Status"}},
        )
        helper.add_instance(classname=CLASSNAME, keyname="obj-ok", fields={"status": "ok"})
        helper.add_instance(classname=CLASSNAME, keyname="obj-old1", fields={"status": "obsolete"})
        helper.add_instance(classname=CLASSNAME, keyname="obj-old2", fields={"status": "obsolete"})
        helper.add_instance(
            classname="_dataview",
            keyname="dvqswitch_obsolete",
            fields={
                "target_class": CLASSNAME,
                "query": "status:obsolete",
                "content": "columns:\n  - keyname\n  - status\n",
            },
        )
        self.url = reverse("app_data:instance_list", kwargs={"classname": CLASSNAME})

    def test_switch_loads_the_view_query_into_the_search_box(self):
        response = self.client.get(self.url, {"dv": "dvqswitch_obsolete"})
        self.assertContains(response, 'value="status:obsolete"')

    def test_switch_filters_the_rows(self):
        response = self.client.get(self.url, {"dv": "dvqswitch_obsolete"})
        content = response.content.decode()
        self.assertIn("obj-old1", content)
        self.assertIn("obj-old2", content)
        self.assertNotIn("obj-ok", content)

    def test_switch_remembers_the_query_in_the_session(self):
        self.client.get(self.url, {"dv": "dvqswitch_obsolete"})
        self.assertEqual(self.client.session["query"][CLASSNAME], "status:obsolete")

    def test_query_survives_a_later_plain_get(self):
        self.client.get(self.url, {"dv": "dvqswitch_obsolete"})
        response = self.client.get(self.url)
        self.assertContains(response, 'value="status:obsolete"')

    def test_switch_resets_the_remembered_page(self):
        self.client.get(self.url, {"page": 2, "size": 1})
        self.assertEqual(self.client.session[CLASSNAME + "_page"], 2)

        self.client.get(self.url, {"dv": "dvqswitch_obsolete"})
        self.assertEqual(self.client.session[CLASSNAME + "_page"], 1)
