# (c) cavaliba.com - tests / instance_list column-header field-name popover

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

import app_home.cache as cache
from tests import helper

CLASSNAME = "colpopover"


class TestInstanceListColumnPopover(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"})
        helper.add_instance(
            classname="_dataview",
            keyname="colpopover_view",
            fields={
                "target_class": CLASSNAME,
                "content": (
                    "columns:\n"
                    "  - keyname\n"
                    "  - mystring\n"
                    "  - Custom:\n"
                    "      from: mystring\n"
                    "  - noop: {}\n"
                ),
            },
        )

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_plain_column_header_shows_fieldname_popover(self):
        response = self.client.get(
            reverse("app_data:instance_list", kwargs={"classname": CLASSNAME}),
            {"dv": "colpopover_view"},
        )
        content = response.content.decode()
        self.assertIn('data-bs-html="true"', content)
        self.assertIn("Field:</b> mystring", content)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_renamed_column_popover_shows_real_fieldname_not_label(self):
        response = self.client.get(
            reverse("app_data:instance_list", kwargs={"classname": CLASSNAME}),
            {"dv": "colpopover_view"},
        )
        content = response.content.decode()
        # "Custom" is the header text, but the popover must reveal the real
        # underlying field name ("mystring"), not the label itself
        self.assertIn(">Custom<", content)
        self.assertNotIn("Field:</b> Custom", content)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_column_without_fieldname_has_no_popover(self):
        response = self.client.get(
            reverse("app_data:instance_list", kwargs={"classname": CLASSNAME}),
            {"dv": "colpopover_view"},
        )
        content = response.content.decode()
        self.assertIn(">noop<", content)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_popover_has_filter_button_with_real_fieldname(self):
        response = self.client.get(
            reverse("app_data:instance_list", kwargs={"classname": CLASSNAME}),
            {"dv": "colpopover_view"},
        )
        content = response.content.decode()
        self.assertIn("cv-filter-button", content)
        self.assertIn("data-fieldname='mystring'", content)
