# (c) cavaliba.com - tests / loader csv multi-value split

import os
import tempfile

from django.test import TestCase

import app_home.cache as cache
from app_data.loader import load_file_csv


class TestLoaderCsvMultivalue(TestCase):
    """load_file_csv() has no Schema access, so - like cavctl - it auto-splits any
    "^"-joined cell unconditionally, regardless of the target field's declared
    cardinality. See no_multi= to disable this."""

    def setUp(self):
        cache.clear()

    def _write_csv(self, content):
        fd, path = tempfile.mkstemp(suffix=".csv")
        with os.fdopen(fd, "w", encoding="utf-8") as f:
            f.write(content)
        return path

    def test_caret_joined_cell_auto_splits(self):
        path = self._write_csv("keyname,tags\nrow1,a^b^c\n")
        try:
            datalist, err = load_file_csv(filename=path)
        finally:
            os.remove(path)

        self.assertEqual(datalist[0]["tags"], ["a", "b", "c"])

    def test_cell_without_caret_stays_a_string(self):
        path = self._write_csv("keyname,tags\nrow1,onlyone\n")
        try:
            datalist, err = load_file_csv(filename=path)
        finally:
            os.remove(path)

        self.assertEqual(datalist[0]["tags"], "onlyone")

    def test_no_multi_disables_auto_split(self):
        """no_multi=True keeps "^" verbatim - the escape hatch for a genuinely
        single-valued field that happens to contain a literal "^"."""

        path = self._write_csv("keyname,mystring\nrow1,a^b^c\n")
        try:
            datalist, err = load_file_csv(filename=path, no_multi=True)
        finally:
            os.remove(path)

        self.assertEqual(datalist[0]["mystring"], "a^b^c")

    def test_any_column_containing_caret_splits_by_default(self):
        """Splitting is column-name-agnostic - no schema is consulted, so any
        column with "^" in its value is split, declared multi-value or not."""

        path = self._write_csv("keyname,extra\nrow1,a^b\n")
        try:
            datalist, err = load_file_csv(filename=path)
        finally:
            os.remove(path)

        self.assertEqual(datalist[0]["extra"], ["a", "b"])
