# (c) cavaliba.com - test_sidebar_cache

from unittest.mock import patch

from django.test import TestCase

import app_home.cache as cache
import app_home.sidebar as sidebar
from app_home.configuration import set_configuration
from app_home.sidebar import get_sidebar_cached, invalidate_sidebar_cache

AAA = {"perms": ["p_data_import"], "is_admin": False, "username": "cacheduser"}

REAL_COMPUTE_SIDEBAR = sidebar.compute_sidebar


class SidebarCacheTest(TestCase):
    def setUp(self):
        cache.clear()
        set_configuration(
            appname="home", keyname="SIDEBAR_CONTENT", value="- app: import\n", description="",
            page="", order=100,
        )  # fmt: skip
        cache.clear()

    def test_second_call_reuses_cached_value(self):
        with patch("app_home.sidebar.compute_sidebar", side_effect=REAL_COMPUTE_SIDEBAR) as mocked:
            get_sidebar_cached(AAA)
            get_sidebar_cached(AAA)
            self.assertEqual(mocked.call_count, 1)

    def test_different_users_get_independent_cache_entries(self):
        other_aaa = {"perms": [], "is_admin": False, "username": "otheruser"}
        with patch("app_home.sidebar.compute_sidebar", side_effect=REAL_COMPUTE_SIDEBAR) as mocked:
            get_sidebar_cached(AAA)
            get_sidebar_cached(other_aaa)
            self.assertEqual(mocked.call_count, 2)

    def test_invalidate_forces_recompute(self):
        with patch("app_home.sidebar.compute_sidebar", side_effect=REAL_COMPUTE_SIDEBAR) as mocked:
            get_sidebar_cached(AAA)
            invalidate_sidebar_cache(username=AAA["username"])
            get_sidebar_cached(AAA)
            self.assertEqual(mocked.call_count, 2)
