# (c) cavaliba.com - tests / data / field enumerate invalid subfield

from django.test import TestCase

import app_home.cache as cache
from app_data.data import Instance
from tests.helper import add_instance, add_schema

BAD_SUBFIELD_ENUM_CONTENT = (
    '- value: "A"\n'
    '  widget: "green_circle"\n'
    "  enumdate: date 2026-1-5\n"
    "  enumint: int notanumber\n"
    "  enumfloat: float notanumber\n"
    '- value: "B"\n'
    '  widget: "yellow_circle"\n'
    "  enumdate: date 2026-01-15\n"
    "  enumint: int 42\n"
    "  enumfloat: float 4.2\n"
)


class TestDataFieldEnumerateInvalidSubfield(TestCase):
    def setUp(self):
        cache.clear()
        add_instance(
            classname="_enumerate",
            keyname="enumerate_badsub",
            fields={"content": BAD_SUBFIELD_ENUM_CONTENT},
        )
        add_schema(
            classname="testenumbad",
            field_definition={
                "myenum": {
                    "dataformat": "enumerate",
                    "displayname": "MyEnum",
                    "dataformat_ext": "enumerate_badsub",
                },
            },
        )

    def test_malformed_subfields_load_empty(self):
        instance = Instance(classname="testenumbad", keyname="obj-bad")
        instance.merge_import({"myenum": "A"})
        instance.expand_injected()

        self.assertEqual(instance.fields["myenum__enumdate"].value, [])
        self.assertEqual(instance.fields["myenum__enumint"].value, [])
        self.assertEqual(instance.fields["myenum__enumfloat"].value, [])

    def test_wellformed_subfields_still_load(self):
        instance = Instance(classname="testenumbad", keyname="obj-good")
        instance.merge_import({"myenum": "B"})
        instance.expand_injected()

        self.assertEqual(instance.fields["myenum__enumdate"].value, ["2026-01-15"])
        self.assertEqual(instance.fields["myenum__enumint"].value, [42])
        self.assertEqual(instance.fields["myenum__enumfloat"].value, [4.2])

    def test_instance_is_valid_ignores_injected_field_failure(self):
        instance = Instance(classname="testenumbad", keyname="obj-bad2")
        instance.merge_import({"myenum": "A"})
        instance.expand_injected()

        # sanity: the injected date field, if forced non-empty and malformed,
        # would itself be invalid ; here it's loaded empty so it already
        # passes, but is_valid() must ignore injected fields regardless.
        self.assertTrue(instance.fields["myenum__enumdate"].is_injected)
        self.assertTrue(instance.is_valid())

    def test_instance_is_valid_skips_injected_even_when_forced_invalid(self):
        instance = Instance(classname="testenumbad", keyname="obj-bad3")
        instance.merge_import({"myenum": "B"})
        instance.expand_injected()

        # force the injected field into an invalid state to prove is_valid()
        # skips it purely based on is_injected, not because it happens to pass
        instance.fields["myenum__enumdate"].value = ["not-a-date"]
        self.assertFalse(instance.fields["myenum__enumdate"].is_valid())
        self.assertTrue(instance.is_valid())
