# (c) cavaliba.com - tests / loader json error paths

import os
import tempfile

from django.test import TestCase

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


class TestLoaderJsonErrors(TestCase):
    def setUp(self):
        cache.clear()

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

    def test_no_filename_and_no_file_returns_none_and_error(self):
        datalist, err = load_file_json()

        self.assertIsNone(datalist)
        self.assertEqual(err, "missing filename")

    def test_missing_file_returns_none_and_error(self):
        datalist, err = load_file_json(filename="/no/such/file.json")

        self.assertIsNone(datalist)
        self.assertIn("not a file", err)

    def test_syntax_error_returns_none_and_error(self):
        path = self._write_json("{ this is not valid json")
        try:
            datalist, err = load_file_json(filename=path)
        finally:
            os.remove(path)

        self.assertIsNone(datalist)
        self.assertIn("JSON syntax error", err)

    def test_valid_json_not_a_list_returns_none_and_error(self):
        path = self._write_json('{"keyname": "row1"}')
        try:
            datalist, err = load_file_json(filename=path)
        finally:
            os.remove(path)

        self.assertIsNone(datalist)
        self.assertIn("not a LIST", err)

    def test_valid_json_list_returns_data_and_no_error(self):
        path = self._write_json('[{"keyname": "row1"}]')
        try:
            datalist, err = load_file_json(filename=path)
        finally:
            os.remove(path)

        self.assertIsNone(err)
        self.assertEqual(datalist, [{"keyname": "row1"}])
