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

import os
import tempfile

from django.test import TestCase

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


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

    def _write_yaml(self, content):
        fd, path = tempfile.mkstemp(suffix=".yml")
        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_yaml()

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

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

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

    def test_syntax_error_returns_none_and_error(self):
        path = self._write_yaml("keyname: [1, 2\n")
        try:
            datalist, err = load_file_yaml(filename=path)
        finally:
            os.remove(path)

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

    def test_valid_yaml_not_a_list_returns_none_and_error(self):
        path = self._write_yaml("keyname: row1\n")
        try:
            datalist, err = load_file_yaml(filename=path)
        finally:
            os.remove(path)

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

    def test_valid_yaml_list_returns_data_and_no_error(self):
        path = self._write_yaml("- keyname: row1\n")
        try:
            datalist, err = load_file_yaml(filename=path)
        finally:
            os.remove(path)

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