# (c) cavaliba.com - tests / data / private schema list ordering

from types import SimpleNamespace

from django.test import TestCase, override_settings

from app_data.views import _private_schema_order


def _schema(classname, displayname=None):
    """Build a minimal schema-like object for _private_schema_order()."""

    return SimpleNamespace(classname=classname, displayname=displayname or classname)


class DataPrivateSchemaOrder(TestCase):
    def test_default_alphabetical(self):
        schemas = [_schema("charlie"), _schema("alpha"), _schema("bravo")]
        with override_settings(SCHEMA_LIST_ORDER=[]):
            result = _private_schema_order(schemas)
        self.assertEqual([s.classname for s in result], ["alpha", "bravo", "charlie"])

    def test_pin_first_and_last(self):
        schemas = [_schema("charlie"), _schema("alpha"), _schema("bravo"), _schema("delta")]
        with override_settings(SCHEMA_LIST_ORDER=["^delta", "$alpha"]):
            result = _private_schema_order(schemas)
        self.assertEqual([s.classname for s in result], ["delta", "bravo", "charlie", "alpha"])

    def test_hide(self):
        schemas = [_schema("charlie"), _schema("alpha"), _schema("bravo")]
        with override_settings(SCHEMA_LIST_ORDER=["-bravo"]):
            result = _private_schema_order(schemas)
        self.assertEqual([s.classname for s in result], ["alpha", "charlie"])

    def test_sort_by_classname_not_displayname(self):
        schemas = [
            _schema("z_first", displayname="Alpha"),
            _schema("a_second", displayname="Bravo"),
        ]
        with override_settings(SCHEMA_LIST_ORDER=[]):
            result = _private_schema_order(schemas)
        self.assertEqual([s.classname for s in result], ["a_second", "z_first"])

    def test_pinned_name_missing_is_ignored(self):
        schemas = [_schema("alpha"), _schema("bravo")]
        with override_settings(SCHEMA_LIST_ORDER=["^ghost", "$alpha"]):
            result = _private_schema_order(schemas)
        self.assertEqual([s.classname for s in result], ["bravo", "alpha"])

    def test_default_sirene_message_last(self):
        schemas = [_schema("sirene_message"), _schema("alpha"), _schema("zeta")]
        result = _private_schema_order(schemas)
        self.assertEqual([s.classname for s in result], ["alpha", "zeta", "sirene_message"])
