# (c) cavaliba.com - tests / sidebar + dashboard entries for the Exporter and Download pages

from django.test import TestCase, override_settings
from django.urls import reverse

import app_home.cache as cache
from app_home.configuration_default import (
    DASHBOARD_CONTENT_DEFAULT,
    SIDEBAR_CONTENT_DEFAULT,
)
from app_home.home import APP_REGISTRY
from app_home.sidebar import compute_sidebar, validate_sidebar_yaml

AAA_EXPORT = {"perms": ["p_data_export"], "is_admin": False, "username": "exporter"}
AAA_VIEWER = {"perms": ["p_data_export_viewer"], "is_admin": False, "username": "viewer"}


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

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_export_key_points_at_the_exporter(self):
        # the registry key is unchanged, so an install that already stores a
        # SIDEBAR_CONTENT referencing "export" keeps working and now lands on
        # the Exporter without any migration
        self.assertEqual(APP_REGISTRY["export"]["url_name"], "app_data:data_exporter")
        self.assertEqual(APP_REGISTRY["export"]["permission"], "p_data_export")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_download_key_registered(self):
        self.assertEqual(APP_REGISTRY["download"]["url_name"], "app_data:data_download")
        self.assertEqual(APP_REGISTRY["download"]["permission"], "p_data_export_viewer")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_defaults_list_both_entries(self):
        self.assertIn("- app: export", SIDEBAR_CONTENT_DEFAULT)
        self.assertIn("- app: download", SIDEBAR_CONTENT_DEFAULT)
        self.assertIn("- app: download", DASHBOARD_CONTENT_DEFAULT)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_default_sidebar_yaml_still_validates(self):
        errors = validate_sidebar_yaml(SIDEBAR_CONTENT_DEFAULT)

        self.assertFalse(errors)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_exporter_entry_shown_with_p_data_export(self):
        urls = self._urls(compute_sidebar(AAA_EXPORT))

        self.assertIn(reverse("app_data:data_exporter"), urls)
        self.assertNotIn(reverse("app_data:data_download"), urls)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_download_entry_shown_with_p_data_export_viewer(self):
        urls = self._urls(compute_sidebar(AAA_VIEWER))

        self.assertIn(reverse("app_data:data_download"), urls)
        self.assertNotIn(reverse("app_data:data_exporter"), urls)

    def _urls(self, rows):
        # compute_sidebar() returns a flat row list (headers + entries)
        return [row.get("url") for row in rows if row.get("url")]
