# (c) cavaliba.com - tests / navbar searchbar "query" context isolation

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

import app_home.cache as cache
from tests import helper

CLASSNAME = "navcoll"


class TestNavbarQueryDoesNotCollideWithPageSearch(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_admin_user(login="unittest")
        helper.add_schema(
            classname=CLASSNAME,
            field_definition={"mystring": {"dataformat": "string", "displayname": "MyString"}},
        )
        helper.add_instance(classname=CLASSNAME, keyname="obj-01", fields={"mystring": "hello"})

    def _navbar_input_value(self, content):
        idx = content.find('id="cv-searchbar-input"')
        self.assertNotEqual(idx, -1, "navbar searchbar input not found in response")
        snippet = content[idx : idx + 200]
        marker = 'value="'
        start = snippet.index(marker) + len(marker)
        end = snippet.index('"', start)
        return snippet[start:end]

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_instance_list_search_does_not_prefill_navbar(self):
        response = self.client.post(
            reverse("app_data:instance_list", kwargs={"classname": CLASSNAME}),
            {"query": "totally-unique-marker-xyz"},
        )
        content = response.content.decode()
        # the schema search box itself still carries the query...
        self.assertIn("totally-unique-marker-xyz", content)
        # ...but the top navbar searchbar must stay untouched by it
        self.assertEqual(self._navbar_input_value(content), "")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_navbar_search_results_page_still_shows_its_own_query(self):
        response = self.client.get(reverse("app_data:searchbar"), {"query": "hello"})
        content = response.content.decode()
        self.assertEqual(self._navbar_input_value(content), "hello")
