from django.apps import apps
from django.test import TestCase

from .. import migrationutils
from ..models import SettingsGroup


class DBConfMigrationUtilsTests(TestCase):
    def setUp(self):
        self.test_group = {
            "key": "test_group",
            "name": "Test settings",
            "description": "Those are test settings.",
            "settings": [
                {
                    "setting": "fish_name",
                    "name": "Fish's name",
                    "value": "Eric",
                    "field_extra": {"min_length": 2, "max_length": 255},
                },
                {
                    "setting": "fish_license_no",
                    "name": "Fish's license number",
                    "default_value": "123-456",
                    "field_extra": {"max_length": 255},
                },
            ],
        }

        migrationutils.migrate_settings_group(apps, self.test_group)
        self.groups_count = SettingsGroup.objects.count()

    def test_get_custom_group_and_settings(self):
        """tests setup created settings group"""
        custom_group = migrationutils.get_group(
            apps.get_model("misago_conf", "SettingsGroup"), self.test_group["key"]
        )

        self.assertEqual(custom_group.key, self.test_group["key"])
        self.assertEqual(custom_group.name, self.test_group["name"])
        self.assertEqual(custom_group.description, self.test_group["description"])

        custom_settings = migrationutils.get_custom_settings_values(custom_group)

        self.assertEqual(custom_settings["fish_name"], "Eric")
        self.assertTrue("fish_license_no" not in custom_settings)

    def test_change_group_key(self):
        """migrate_settings_group changed group key"""

        new_group = {
            "key": "new_test_group",
            "name": "New test settings",
            "description": "Those are updated test settings.",
            "settings": [
                {
                    "setting": "fish_new_name",
                    "name": "Fish's new name",
                    "value": "Eric",
                    "field_extra": {"min_length": 2, "max_length": 255},
                },
                {
                    "setting": "fish_new_license_no",
                    "name": "Fish's changed license number",
                    "default_value": "123-456",
                    "field_extra": {"max_length": 255},
                },
            ],
        }

        migrationutils.migrate_settings_group(
            apps, new_group, old_group_key=self.test_group["key"]
        )

        db_group = migrationutils.get_group(
            apps.get_model("misago_conf", "SettingsGroup"), new_group["key"]
        )

        self.assertEqual(SettingsGroup.objects.count(), self.groups_count)
        self.assertEqual(db_group.key, new_group["key"])
        self.assertEqual(db_group.name, new_group["name"])
        self.assertEqual(db_group.description, new_group["description"])

        for setting in new_group["settings"]:
            db_setting = db_group.setting_set.get(setting=setting["setting"])
            self.assertEqual(db_setting.name, setting["name"])