# (c) cavaliba.com - test / home / save_form

from django.test import TestCase

import app_home.cache as cache
from app_home.configuration import save_form
from app_home.configuration_form import AppHomeConfigurationForm
from app_home.models import CavalibaConfiguration

BASE_DATA = {
    "GLOBAL_APPNAME": "Cavaliba",
    "CSV_DELIMITER": ",",
    "LOGO_SIZE": 0,
    "LOG_DEBUG": "yes",
    "LOG_KEEP_DAYS_DEBUG": 7,
    "LOG_KEEP_DAYS_INFO": 120,
    "LOG_KEEP_DAYS_WARNING": 365,
    "LOG_KEEP_DAYS_ERROR": 365,
    "LOG_KEEP_DAYS_CRITICAL": 99999,
    "LOG_MAX_ENTRIES": 2200000,
    "LOG_EXCLUDED_IP": "",
    "BETA_PREVIEW": "no",
    "SIDEBAR_COLOR": "#000000",
    "SIDEBAR_ENV": "",
    "REVISION_DISPLAY": 10,
    "REVISION_KEEP_DAYS": 999,
}


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

    def _valid_form(self, **overrides):
        data = dict(BASE_DATA, **overrides)
        form = AppHomeConfigurationForm(data=data)
        self.assertTrue(form.is_valid(), form.errors)
        return form

    def test_resubmitting_unchanged_values_writes_nothing(self):
        save_form(self._valid_form(CSV_DELIMITER=";"), appname="home")
        cache.clear()

        changed = save_form(self._valid_form(CSV_DELIMITER=";"), appname="home")

        self.assertEqual(changed, [])

    def test_single_changed_field_is_written_and_returned(self):
        changed = save_form(self._valid_form(CSV_DELIMITER=";"), appname="home")

        self.assertEqual(changed, ["CSV_DELIMITER"])
        entry = CavalibaConfiguration.objects.get(appname="home", keyname="CSV_DELIMITER")
        self.assertEqual(entry.value, ";")

    def test_multiple_changed_fields_are_all_returned(self):
        changed = save_form(
            self._valid_form(CSV_DELIMITER=";", GLOBAL_APPNAME="Acme"), appname="home"
        )

        self.assertCountEqual(changed, ["CSV_DELIMITER", "GLOBAL_APPNAME"])

    def test_unrelated_field_untouched_by_partial_change(self):
        save_form(self._valid_form(CSV_DELIMITER=";"), appname="home")
        cache.clear()

        changed = save_form(
            self._valid_form(CSV_DELIMITER=";", GLOBAL_APPNAME="Acme"), appname="home"
        )

        self.assertEqual(changed, ["GLOBAL_APPNAME"])
