ttvdrops/config/tests/test_urls.py
Joakim Helleśen d99579ed2b
All checks were successful
Deploy to Server / deploy (push) Successful in 49s
Add Redis configuration, integrate Celery, and sort fields in models
2026-03-21 19:12:47 +01:00

97 lines
3.5 KiB
Python

import importlib
from typing import TYPE_CHECKING
import pytest
from django.conf import settings
from django.test.utils import override_settings
from django.urls import resolve
from django.urls import reverse
from config.urls import urlpatterns
if TYPE_CHECKING:
from collections.abc import Iterable
from types import ModuleType
def _pattern_strings(module: ModuleType) -> Iterable[str]:
"""Return string representations of the URL patterns' route/regex."""
return (str(p.pattern) for p in module.urlpatterns)
def _reload_urls_with(**overrides) -> ModuleType:
"""Reload `config.urls` while temporarily overriding Django settings.
Returns:
ModuleType: The `config.urls` module as imported under the
overridden settings. The real `config.urls` module is reloaded
back to the test-default settings before this function returns.
"""
# Import under overridden settings
with override_settings(**overrides):
mod = importlib.reload(importlib.import_module("config.urls"))
# Restore to the normal test settings to avoid leaking changes to other tests
importlib.reload(importlib.import_module("config.urls"))
return mod
def test_top_level_named_routes_available() -> None:
"""Top-level routes defined in `config.urls` are reversible."""
assert reverse("sitemap") == "/sitemap.xml"
# ensure the included `twitch` namespace is present
msg: str = f"Expected 'twitch:dashboard' to reverse to '/twitch/', got {reverse('twitch:dashboard')}"
assert reverse("twitch:dashboard") == "/twitch/", msg
youtube_msg: str = f"Expected 'youtube:index' to reverse to '/youtube/', got {reverse('youtube:index')}"
assert reverse("youtube:index") == "/youtube/", youtube_msg
def test_debug_tools_not_present_while_testing() -> None:
"""`silk` and Django Debug Toolbar URL patterns are not present while running tests."""
# Default test environment should *not* expose debug routes.
mod = _reload_urls_with(TESTING=True)
patterns = list(_pattern_strings(mod))
assert not any("silk" in p for p in patterns)
assert not any("__debug__" in p or "debug" in p for p in patterns)
@pytest.mark.parametrize(
"url_name",
[
"sitemap",
"sitemap-static",
"sitemap-twitch-channels",
"sitemap-twitch-drops",
"sitemap-twitch-others",
"sitemap-kick",
"sitemap-youtube",
],
)
def test_static_sitemap_urls(url_name: str) -> None:
"""Test that static sitemap URLs resolve correctly."""
url: str = reverse(url_name)
resolved_view: str = resolve(url).view_name
assert resolved_view == url_name
def test_app_url_inclusion() -> None:
"""Test that app-specific URLs are included in urlpatterns."""
assert any("core.urls" in str(pattern) for pattern in urlpatterns)
assert any("twitch.urls" in str(pattern) for pattern in urlpatterns)
assert any("kick.urls" in str(pattern) for pattern in urlpatterns)
assert any("youtube.urls" in str(pattern) for pattern in urlpatterns)
def test_media_serving_in_development() -> None:
"""Test that media URLs are served in development mode."""
if settings.DEBUG:
assert any("MEDIA_URL" in str(pattern) for pattern in urlpatterns)
def test_debug_toolbar_and_silk_urls() -> None:
"""Test that debug toolbar and Silk URLs are included when appropriate."""
if not settings.TESTING:
assert any("silk.urls" in str(pattern) for pattern in urlpatterns)
assert any("debug_toolbar" in str(pattern) for pattern in urlpatterns)