# (c) cavaliba.com - test_dashboard_schema_wildcard

from django.test import TestCase

import app_home.cache as cache
from app_home.configuration import set_configuration
from app_home.dashboard import compute_dashboard
from tests import helper

AAA_READ = {"perms": ["p_data_read"], "is_admin": False, "username": "reader"}


class DashboardSchemaWildcardTest(TestCase):
    def setUp(self):
        cache.clear()

    def _set_content(self, yaml_text):
        set_configuration(
            appname="home", keyname="DASHBOARD_CONTENT", value=yaml_text, description="",
            page="", order=100,
        )  # fmt: skip
        cache.clear()

    def _labels(self, sections):
        return [c["label"] for section in sections for c in section["cards"]]

    def test_wildcard_expands_to_all_unlisted_schemas_without_duplicating_explicit_ones(self):
        helper.add_schema(classname="wcarda", displayname="wcarda", verbose=False)
        helper.add_schema(classname="wcardb", displayname="wcardb", verbose=False)
        helper.add_schema(classname="wcardc", displayname="wcardc", verbose=False)
        self._set_content(
            """
            - section: "All"
              entries:
                - schema: wcarda
                - schema: "@ALL"
            """
        )
        labels = self._labels(compute_dashboard(AAA_READ))
        self.assertEqual(labels.count("wcarda"), 1)
        self.assertEqual(sorted(labels), ["wcarda", "wcardb", "wcardc"])

    def test_negated_schema_never_renders_and_is_excluded_from_wildcard(self):
        helper.add_schema(classname="wneg_a", displayname="wneg_a", verbose=False)
        helper.add_schema(classname="wneg_b", displayname="wneg_b", verbose=False)
        self._set_content(
            """
            - section: "All"
              entries:
                - schema: "!wneg_b"
                - schema: "@ALL"
            """
        )
        labels = self._labels(compute_dashboard(AAA_READ))
        self.assertEqual(labels, ["wneg_a"])

    def test_dedup_is_global_across_sections(self):
        helper.add_schema(classname="wglobal_a", displayname="wglobal_a", verbose=False)
        helper.add_schema(classname="wglobal_b", displayname="wglobal_b", verbose=False)
        self._set_content(
            """
            - section: "Explicit"
              entries:
                - schema: wglobal_a
            - section: "Everything else"
              entries:
                - schema: "@ALL"
            """
        )
        sections = compute_dashboard(AAA_READ)
        everything_else_labels = [c["label"] for c in sections[1]["cards"]]
        self.assertNotIn("wglobal_a", everything_else_labels)
        self.assertIn("wglobal_b", everything_else_labels)

    def test_wildcard_skips_schema_without_read_permission(self):
        helper.add_schema(classname="wopen", displayname="wopen", verbose=False)
        helper.add_schema(
            classname="wrestricted", displayname="wrestricted",
            options={"p_read": "p_wildcard_special"}, verbose=False,
        )  # fmt: skip
        self._set_content('- section: All\n  entries:\n    - schema: "@ALL"\n')
        labels = self._labels(compute_dashboard(AAA_READ))
        self.assertIn("wopen", labels)
        self.assertNotIn("wrestricted", labels)

    def test_schema_card_includes_instance_count(self):
        helper.add_schema(classname="wcounted", displayname="wcounted", verbose=False)
        helper.add_instance(classname="wcounted", keyname="one")
        helper.add_instance(classname="wcounted", keyname="two")
        self._set_content("- section: All\n  entries:\n    - schema: wcounted\n")
        sections = compute_dashboard(AAA_READ)
        self.assertEqual(sections[0]["cards"][0]["count"], 2)
