# (c) cavaliba.com - tests dataview columns {label, fieldname, popover, filter} structure

from django.test import TestCase

import app_home.cache as cache
from app_data.dataview import DataView
from tests import helper


class TestDataViewColumnsStruct(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_schema(
            classname="colstruct",
            field_definition={
                "mystring": {"dataformat": "string", "displayname": "MyString"},
            },
        )
        helper.add_instance(
            classname="_dataview",
            keyname="colstruct_view",
            fields={
                "target_class": "colstruct",
                "content": (
                    "columns:\n"
                    "  - keyname\n"
                    "  - Login:\n"
                    "      from: mystring\n"
                    "  - noop: {}\n"
                    "  - owner__email:\n"
                    "      filter: no\n"
                    "  - Widget:\n"
                    "      from: my_enumerate_subfields__widget\n"
                    "      popover: no\n"
                    "      filter: no\n"
                ),
            },
        )

    def test_plain_column_label_equals_fieldname(self):
        dataview = DataView(keyname="colstruct_view")
        col = dataview.columns[0]
        self.assertEqual(col["label"], "keyname")
        self.assertEqual(col["fieldname"], "keyname")
        self.assertTrue(col["popover"])
        self.assertTrue(col["filter"])

    def test_renamed_column_keeps_custom_label_with_real_fieldname(self):
        dataview = DataView(keyname="colstruct_view")
        col = dataview.columns[1]
        self.assertEqual(col["label"], "Login")
        self.assertEqual(col["fieldname"], "mystring")
        self.assertTrue(col["popover"])
        self.assertTrue(col["filter"])

    def test_dict_column_without_from_or_flags_has_no_fieldname(self):
        dataview = DataView(keyname="colstruct_view")
        col = dataview.columns[2]
        self.assertEqual(col["label"], "noop")
        self.assertIsNone(col["fieldname"])
        # defaults stay True even with no real field - harmless, template
        # gates rendering on fieldname being truthy too
        self.assertTrue(col["popover"])
        self.assertTrue(col["filter"])

    def test_dict_column_with_only_filter_override_resolves_fieldname_from_key(self):
        # no "from:" - the dict's own key ("owner__email") is used as the
        # fieldname, since "filter:" alone signals "same field, just a flag"
        dataview = DataView(keyname="colstruct_view")
        col = dataview.columns[3]
        self.assertEqual(col["label"], "owner__email")
        self.assertEqual(col["fieldname"], "owner__email")
        self.assertTrue(col["popover"])
        self.assertFalse(col["filter"])

    def test_renamed_column_with_both_overrides(self):
        dataview = DataView(keyname="colstruct_view")
        col = dataview.columns[4]
        self.assertEqual(col["label"], "Widget")
        self.assertEqual(col["fieldname"], "my_enumerate_subfields__widget")
        self.assertFalse(col["popover"])
        self.assertFalse(col["filter"])

    def test_builtin_default_view_columns_struct(self):
        dataview = DataView(keyname=None)
        self.assertEqual(
            dataview.columns,
            [
                {"label": "keyname", "fieldname": "keyname", "popover": True, "filter": True},
                {
                    "label": "displayname",
                    "fieldname": "displayname",
                    "popover": True,
                    "filter": True,
                },
                {
                    "label": "last_update",
                    "fieldname": "last_update",
                    "popover": True,
                    "filter": True,
                },
            ],
        )
