# (c) cavaliba.com - test / schema / description

from django.test import TestCase

import app_home.cache as cache
from app_data.models import DataClass
from app_data.schema import Schema
from tests import helper


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

    def test_description_persists_via_save_and_from_name(self):
        helper.add_schema(classname="descschema", verbose=False)
        schema = Schema.from_name("descschema")
        schema.description = "<p>Help text</p>"
        schema.save()

        reloaded = Schema.from_name("descschema")
        self.assertEqual(reloaded.description, "<p>Help text</p>")
        self.assertEqual(
            DataClass.objects.get(keyname="descschema").description, "<p>Help text</p>"
        )

    def test_description_defaults_to_empty_string(self):
        helper.add_schema(classname="descschema2", verbose=False)
        schema = Schema.from_name("descschema2")
        self.assertEqual(schema.description, "")

    def test_to_dict_nests_description_under_options(self):
        helper.add_schema(classname="descschema3", verbose=False)
        schema = Schema.from_name("descschema3")
        schema.description = "help text"
        schema.save()

        reloaded = Schema.from_name("descschema3")
        d = reloaded.to_dict()
        self.assertEqual(d["_options"]["description"], "help text")

    def test_update_from_dict_reads_description_from_options(self):
        schema = Schema()
        schema.classname = "descschema4"
        schema.update_from_dict(
            {"keyname": "descschema4", "_options": {"description": "from yaml"}}
        )
        self.assertEqual(schema.description, "from yaml")

    def test_schema_description_does_not_collide_with_field_named_description(self):
        # a field literally named "description" (e.g. builtin/init/100-site.yml's
        # own site-description field) must survive a schema-level description
        # save/reload round trip untouched
        helper.add_schema(
            classname="descschema5",
            field_definition={"description": {"dataformat": "string", "displayname": "Notes"}},
            verbose=False,
        )
        schema = Schema.from_name("descschema5")
        self.assertIn("description", schema.fields)

        schema.description = "schema-level help text"
        schema.save()

        reloaded = Schema.from_name("descschema5")
        self.assertEqual(reloaded.description, "schema-level help text")
        self.assertIn("description", reloaded.fields)
        self.assertEqual(reloaded.fields["description"]["displayname"], "Notes")

    def test_to_dict_field_named_description_not_overwritten_by_schema_description(self):
        helper.add_schema(
            classname="descschema6",
            field_definition={"description": {"dataformat": "string", "displayname": "Notes"}},
            verbose=False,
        )
        schema = Schema.from_name("descschema6")
        schema.description = "schema-level help text"
        schema.save()

        reloaded = Schema.from_name("descschema6")
        d = reloaded.to_dict()
        self.assertEqual(d["_options"]["description"], "schema-level help text")
        self.assertEqual(d["description"]["displayname"], "Notes")
