from unittest import mock import pytest from django.apps import AppConfig from django.core.exceptions import ImproperlyConfigured from django.urls import include, path from oscar.apps.dashboard.nav import _dashboard_url_names_to_config from oscar.core.application import OscarDashboardConfig class PathAppConfig(AppConfig): path = 'fake' class DashConfig(OscarDashboardConfig): path = 'fake' def get_urls(self): return [ path('a', lambda x:x, name='lol'), path('b', lambda x:x), path('c', include([ path('d', lambda x:x, name='foo'), ])) ] def test_only_returns_dashboard_urls(): with mock.patch('oscar.apps.dashboard.nav.apps.get_app_configs') as mock_configs: mock_configs.return_value = [PathAppConfig('name', 'module')] output = _dashboard_url_names_to_config.__wrapped__() assert not output def test_only_returns_named_urls_and_skips_includes(): config = DashConfig('name', 'module') with mock.patch('oscar.apps.dashboard.nav.apps.get_app_configs') as mock_configs: mock_configs.return_value = [config] output = _dashboard_url_names_to_config.__wrapped__() assert output == {"lol": config} def test_raises_if_same_name_in_different_configs(): config_a = DashConfig('a_name', 'a_module') config_b = DashConfig('b_name', 'b_module') with mock.patch('oscar.apps.dashboard.nav.apps.get_app_configs') as mock_configs: mock_configs.return_value = [config_a, config_b] with pytest.raises(ImproperlyConfigured): _dashboard_url_names_to_config.__wrapped__()