# (c) cavaliba.com - test / search / searchbar hide_from_search option

from django.test import TestCase

import app_home.cache as cache
from app_data.search import searchbar
from tests import helper

ADMIN_AAA = {"perms": ["p_data_admin"]}

HIDDEN_SCHEMA = "sb_hidden"
VISIBLE_SCHEMA = "sb_visible"


class SearchbarHideFromSearchTest(TestCase):
    def setUp(self):
        """One hidden schema (hide_from_search: true) and one plain schema,
        each with a matching instance, to check the flag only affects the
        hidden one."""
        cache.clear()
        helper.add_schema(
            classname=HIDDEN_SCHEMA, displayname="HiddenMarkerSchema",
            options={"hide_from_search": True},
        )  # fmt: skip
        helper.add_schema(classname=VISIBLE_SCHEMA, displayname="VisibleMarkerSchema")

        helper.add_instance(
            classname=HIDDEN_SCHEMA, keyname="hidden-mmarker-obj",
            fields={"displayname": "Hidden mmarker instance"},
        )  # fmt: skip
        helper.add_instance(
            classname=VISIBLE_SCHEMA, keyname="visible-mmarker-obj",
            fields={"displayname": "Visible mmarker instance"},
        )  # fmt: skip

    def test_hidden_schema_instances_excluded(self):
        reply = searchbar(query="mmarker", aaa=ADMIN_AAA)
        keynames = {r["keyname"] for r in reply["results"]}
        self.assertIn("visible-mmarker-obj", keynames)
        self.assertNotIn("hidden-mmarker-obj", keynames)

    def test_hidden_schema_name_excluded_from_schema_stage(self):
        reply = searchbar(query="hiddenmarkerschema", aaa=ADMIN_AAA)
        classnames = {r["classname"] for r in reply["results"] if r["type"] == "schema"}
        self.assertNotIn(HIDDEN_SCHEMA, classnames)

    def test_visible_schema_name_still_matches_schema_stage(self):
        reply = searchbar(query="visiblemarkerschema", aaa=ADMIN_AAA)
        classnames = {r["classname"] for r in reply["results"] if r["type"] == "schema"}
        self.assertIn(VISIBLE_SCHEMA, classnames)

    def test_schema_prefix_on_hidden_schema_falls_back_to_literal(self):
        reply = searchbar(query=f"{HIDDEN_SCHEMA}:mmarker", aaa=ADMIN_AAA)
        self.assertIsNone(reply["error"])
        self.assertEqual(reply["results"], [])

    def test_schema_prefix_on_visible_schema_still_scopes(self):
        reply = searchbar(query=f"{VISIBLE_SCHEMA}:mmarker", aaa=ADMIN_AAA)
        classnames = {r["classname"] for r in reply["results"]}
        self.assertEqual(classnames, {VISIBLE_SCHEMA})
