# (c) cavaliba.com - tests / data / exporter column selector POST parsing

from django.http import QueryDict
from django.test import TestCase, override_settings

import app_home.cache as cache
from app_data.exporter import spec_from_post
from tests import helper


def _post(columns=None, **kwargs):
    # the column selector posts one "columns" value per checked box
    qd = QueryDict(mutable=True)
    base = {"schema": "expmulti", "format": "csv"}
    base.update(kwargs)
    for key, value in base.items():
        qd[key] = value
    for name in columns or []:
        qd.appendlist("columns", name)
    return qd


class ExporterColumnsMultiPostTest(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_admin_user(login="unittest")
        helper.add_schema(
            classname="expmulti",
            field_definition={
                "mystring": {"dataformat": "string", "displayname": "MyString"},
            },
        )

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_repeated_values_are_joined_in_dom_order(self):
        spec, err = spec_from_post(_post(columns=["_schema", "keyname", "mystring"]))

        self.assertIsNone(err)
        self.assertEqual(spec.columns, "_schema,keyname,mystring")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_selector_order_is_preserved_not_sorted(self):
        spec, err = spec_from_post(_post(columns=["_schema", "mystring", "keyname"]))

        self.assertIsNone(err)
        self.assertEqual(spec.columns, "_schema,mystring,keyname")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_blank_values_are_dropped(self):
        spec, err = spec_from_post(_post(columns=["_schema", "", "keyname"]))

        self.assertIsNone(err)
        self.assertEqual(spec.columns, "_schema,keyname")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_a_single_value_still_works(self):
        spec, err = spec_from_post(_post(columns=["keyname"]))

        self.assertIsNone(err)
        self.assertEqual(spec.columns, "keyname")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_no_column_posted_falls_back_to_the_filter_default(self):
        # an API/CLI caller that never mentions columns keeps the documented "*"
        spec, err = spec_from_post(_post())

        self.assertIsNone(err)
        self.assertEqual(spec.columns, "*")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_a_single_filter_expression_is_still_accepted(self):
        spec, err = spec_from_post(_post(columns=["!mystring"]))

        self.assertIsNone(err)
        self.assertEqual(spec.columns, "!mystring")
