# (c) cavaliba.com - tests / CSV export driven by a dataview's own columns: pure
# passthrough, plus the always-present "_schema" first column

from django.test import TestCase, override_settings
from django.urls import reverse

import app_home.cache as cache
from tests import helper


class DataExportCsvDataviewPassthroughViewTest(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_admin_user(login="unittest")
        helper.add_schema(
            classname="csvviewtest",
            field_definition={
                "keep_me": {"dataformat": "string", "displayname": "Keep Me"},
                "drop_me": {"dataformat": "string", "displayname": "Drop Me"},
            },
        )
        helper.add_instance(
            classname="csvviewtest",
            keyname="obj01",
            fields={"keep_me": "keepvalue", "drop_me": "dropvalue"},
        )
        helper.add_instance(
            classname="_dataview",
            keyname="csvviewtest_view",
            fields={
                "target_class": "csvviewtest",
                "content": "columns:\n  - keep_me\n",
            },
        )

    def _post(self, extra=None):
        data = {
            "schema": "csvviewtest",
            "columns": "keep_me",
            "query": "",
            "format": "csv",
        }
        if extra:
            data.update(extra)
        return self.client.post(reverse("app_data:data_exporter"), data)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_header_is_exactly_view_fieldnames_no_identity_forced(self):
        response = self._post()
        self.assertEqual(response.status_code, 200)
        header = response.content.decode().strip().splitlines()[0]
        self.assertEqual(header, "_schema,keep_me")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_drop_me_absent_when_not_in_view(self):
        response = self._post()
        content = response.content.decode()
        self.assertIn("keepvalue", content)
        self.assertNotIn("dropvalue", content)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_explicit_column_list_controls_output(self):
        response = self._post({"columns": "drop_me"})
        content = response.content.decode()
        header = content.strip().splitlines()[0]
        self.assertEqual(header, "_schema,drop_me")
        self.assertIn("dropvalue", content)
        self.assertNotIn("keepvalue", content)
