"""Tests of the patatools-cache command."""

# pylint: disable=too-few-public-methods

import os
import shutil
import unittest

from patacrep.files import chdir
from patacrep.tools.__main__ import main as tools_main
from patacrep.tools.cache.__main__ import main as cache_main
from patacrep.songbook.__main__ import main as songbook_main

from .. import logging_reduced

CACHEDIR = os.path.join(os.path.dirname(__file__), "test_cache_datadir", ".cache")

class TestCache(unittest.TestCase):
    """Test of the "patatools cache" subcommand"""

    def setUp(self):
        """Remove cache."""
        self._remove_cache()
        self.assertFalse(os.path.exists(CACHEDIR))

    def tearDown(self):
        """Remove cache."""
        self._remove_cache()
        self.assertFalse(os.path.exists(CACHEDIR))

    @staticmethod
    def _remove_cache():
        """Delete cache."""
        shutil.rmtree(CACHEDIR, ignore_errors=True)

    def _system(self, main, args):
        with chdir(os.path.dirname(__file__)):
            try:
                main(args)
            except SystemExit as systemexit:
                self.assertEqual(systemexit.code, 0)

    def test_clean_exists(self):
        """Test of the "patatools cache clean" subcommand"""
        for main, args in [
                (tools_main, ["patatools", "cache", "clean", "test_cache.yaml"]),
                (cache_main, ["patatools-cache", "clean", "test_cache.yaml"]),
            ]:
            with self.subTest(main=main, args=args):
                # First compilation. Ensure that cache exists afterwards
                with logging_reduced('patacrep.build'):
                    self._system(
                        songbook_main,
                        ["songbook", "--steps", "tex,clean", "test_cache.yaml"]
                    )
                self.assertTrue(os.path.exists(CACHEDIR))

                # Clean cache
                with logging_reduced('patatools.cache'):
                    self._system(main, args)

                # Ensure that cache does not exist
                self.assertFalse(os.path.exists(CACHEDIR))

    def test_clean_not_exists(self):
        """Test of the "patatools cache clean" subcommand"""
        # Clean non-existent cache
        for main, args in [
                (tools_main, ["patatools", "cache", "clean", "test_cache.yaml"]),
                (cache_main, ["patatools-cache", "clean", "test_cache.yaml"]),
            ]:
            with self.subTest(main=main, args=args):
                # Clean cache
                with logging_reduced('patatools.cache'):
                    self._system(main, args)