# (c) cavaliba.com - test_sidebar_config_validation

from django.test import TestCase

from app_home.configuration_form import AppHomeConfigurationForm
from app_home.sidebar import validate_sidebar_yaml


class SidebarConfigValidationTest(TestCase):
    def _form_data(self, sidebar_content):
        # AppHomeConfigurationForm has other required-looking fields with
        # ChoiceField defaults; only SIDEBAR_CONTENT is under test here, so
        # supply the minimal set needed for the other fields to clean OK.
        return {
            "LOG_DEBUG": "yes",
            "SIDEBAR_CONTENT": sidebar_content,
        }

    def test_valid_yaml_passes(self):
        errors = validate_sidebar_yaml("- app: import\n")
        self.assertEqual(errors, [])

    def test_empty_value_is_valid(self):
        errors = validate_sidebar_yaml("")
        self.assertEqual(errors, [])

    def test_invalid_yaml_syntax_rejected(self):
        errors = validate_sidebar_yaml("not: [valid, yaml, structure")
        self.assertTrue(errors)
        self.assertIn("invalid YAML", errors[0])

    def test_non_list_top_level_rejected(self):
        errors = validate_sidebar_yaml("just_a_string")
        self.assertEqual(errors, ["sidebar_content must be a YAML list"])

    def test_unknown_app_key_rejected(self):
        errors = validate_sidebar_yaml("- app: totally_bogus_app\n")
        self.assertTrue(any("unknown app" in e for e in errors))

    def test_missing_link_value_rejected(self):
        errors = validate_sidebar_yaml("- link: \n")
        self.assertTrue(any("'link' value required" in e for e in errors))

    def test_item_with_no_recognized_type_rejected(self):
        errors = validate_sidebar_yaml("- foo: bar\n")
        self.assertTrue(any("exactly one of" in e for e in errors))

    def test_nested_section_rejected(self):
        errors = validate_sidebar_yaml(
            "- section: outer\n  entries:\n    - section: inner\n      entries: []\n"
        )
        self.assertTrue(any("cannot be nested" in e for e in errors))

    def test_form_rejects_invalid_sidebar_content(self):
        form = AppHomeConfigurationForm(data=self._form_data("- app: totally_bogus_app\n"))
        self.assertFalse(form.is_valid())
        self.assertIn("SIDEBAR_CONTENT", form.errors)

    def test_form_accepts_valid_sidebar_content(self):
        form = AppHomeConfigurationForm(data=self._form_data("- app: import\n"))
        form.is_valid()
        self.assertNotIn("SIDEBAR_CONTENT", form.errors)
