# (c) cavaliba.com - tests / views_importer - page/size row range

from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase, override_settings
from django.urls import reverse

import app_home.cache as cache
from app_data.data import Instance
from tests import helper

CSV_5_ROWS = (
    "classname,keyname,mystring\n"
    "pstest,row1,a\n"
    "pstest,row2,b\n"
    "pstest,row3,c\n"
    "pstest,row4,d\n"
    "pstest,row5,e\n"
)


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

    def _post(self, extra):
        data = {
            "file": SimpleUploadedFile(
                "data.csv", CSV_5_ROWS.encode("utf-8"), content_type="text/csv"
            ),
            "pipeline": "",
            "encoding": "utf-8",
            "separator": ",",
            "split_multivalue": "on",
            "submit": "import",
        }
        data.update(extra)
        return self.client.post(reverse("app_data:data_import"), data, follow=True)

    def _exists(self, keyname):
        return Instance.from_keyname(classname="pstest", keyname=keyname, expand=False) is not None

    def test_size_limits_import_row_count(self):
        self._post({"size": "2"})
        self.assertTrue(self._exists("row1"))
        self.assertTrue(self._exists("row2"))
        self.assertFalse(self._exists("row3"))
        self.assertFalse(self._exists("row4"))
        self.assertFalse(self._exists("row5"))

    def test_page_and_size_select_second_page(self):
        self._post({"page": "2", "size": "2"})
        self.assertFalse(self._exists("row1"))
        self.assertFalse(self._exists("row2"))
        self.assertTrue(self._exists("row3"))
        self.assertTrue(self._exists("row4"))
        self.assertFalse(self._exists("row5"))

    def test_page_without_size_is_rejected(self):
        response = self._post({"page": "2"})
        self.assertEqual(response.redirect_chain, [])
        self.assertEqual(response.status_code, 200)
        self.assertTrue(response.context["form"].errors.get("size"))
        rendered = [str(m) for m in response.context["messages"]]
        self.assertFalse(any("Import OK" in m for m in rendered))
        self.assertFalse(self._exists("row1"))
