# (c) cavaliba.com - tests / loader csv _schema column

import os
import tempfile

from django.test import TestCase

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


class TestLoaderCsvSchemaColumn(TestCase):
    """A per-row "_schema" column resolves to "classname" (renamed by
    load_file_csv() itself, see its docstring) - locks in this behavior, and
    that the old bare "schema" header (pre-rename) no longer does, as a
    regression test."""

    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 _load(self, content):
        path = self._write_csv(content)
        try:
            datalist, err = load_file_csv(filename=path)
        finally:
            os.remove(path)
        return datalist, err

    def test_schema_column_resolves_classname(self):
        datalist, err = self._load("keyname,_schema\nrow1,csvtest\n")
        self.assertIsNone(err)
        self.assertEqual(datalist[0]["classname"], "csvtest")
        self.assertNotIn("_schema", datalist[0])

    def test_bare_schema_header_no_longer_resolves_classname(self):
        datalist, err = self._load("keyname,schema\nrow1,csvtest\n")
        self.assertIsNone(err)
        self.assertNotIn("classname", datalist[0])
        # the old header is left untouched as a plain (unmapped) column
        self.assertEqual(datalist[0]["schema"], "csvtest")

    def test_no_schema_column_no_classname_key(self):
        datalist, err = self._load("keyname,mystring\nrow1,hello\n")
        self.assertIsNone(err)
        self.assertNotIn("classname", datalist[0])
