mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-23 17:51:09 -05:00
Add standardized HTMX conventions, interaction patterns, and migration guide for ThrillWiki UX
This commit is contained in:
193
backend/tests/ux/test_breadcrumbs.py
Normal file
193
backend/tests/ux/test_breadcrumbs.py
Normal file
@@ -0,0 +1,193 @@
|
||||
"""
|
||||
Tests for breadcrumb utilities.
|
||||
|
||||
These tests verify that the breadcrumb system generates
|
||||
correct navigation structures and Schema.org markup.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
from django.test import RequestFactory
|
||||
from django.urls import reverse
|
||||
|
||||
from apps.core.utils.breadcrumbs import (
|
||||
Breadcrumb,
|
||||
BreadcrumbBuilder,
|
||||
build_breadcrumb,
|
||||
)
|
||||
|
||||
|
||||
class TestBreadcrumb:
|
||||
"""Tests for Breadcrumb dataclass."""
|
||||
|
||||
def test_basic_breadcrumb(self):
|
||||
"""Should create breadcrumb with required fields."""
|
||||
crumb = Breadcrumb(label="Home", url="/")
|
||||
assert crumb.label == "Home"
|
||||
assert crumb.url == "/"
|
||||
assert crumb.icon is None
|
||||
assert crumb.is_current is False
|
||||
|
||||
def test_breadcrumb_with_icon(self):
|
||||
"""Should accept icon parameter."""
|
||||
crumb = Breadcrumb(label="Home", url="/", icon="fas fa-home")
|
||||
assert crumb.icon == "fas fa-home"
|
||||
|
||||
def test_current_breadcrumb(self):
|
||||
"""Should mark breadcrumb as current."""
|
||||
crumb = Breadcrumb(label="Current Page", is_current=True)
|
||||
assert crumb.is_current is True
|
||||
assert crumb.url is None
|
||||
|
||||
def test_schema_position(self):
|
||||
"""Should have default schema position."""
|
||||
crumb = Breadcrumb(label="Test")
|
||||
assert crumb.schema_position == 1
|
||||
|
||||
|
||||
class TestBuildBreadcrumb:
|
||||
"""Tests for build_breadcrumb helper function."""
|
||||
|
||||
def test_basic_breadcrumb(self):
|
||||
"""Should create breadcrumb dict with defaults."""
|
||||
crumb = build_breadcrumb("Home", "/")
|
||||
assert crumb["label"] == "Home"
|
||||
assert crumb["url"] == "/"
|
||||
assert crumb["is_current"] is False
|
||||
|
||||
def test_current_breadcrumb(self):
|
||||
"""Should mark as current when specified."""
|
||||
crumb = build_breadcrumb("Current", is_current=True)
|
||||
assert crumb["is_current"] is True
|
||||
|
||||
def test_breadcrumb_with_icon(self):
|
||||
"""Should include icon when specified."""
|
||||
crumb = build_breadcrumb("Home", "/", icon="fas fa-home")
|
||||
assert crumb["icon"] == "fas fa-home"
|
||||
|
||||
|
||||
class TestBreadcrumbBuilder:
|
||||
"""Tests for BreadcrumbBuilder class."""
|
||||
|
||||
def test_empty_builder(self):
|
||||
"""Should build empty list when no crumbs added."""
|
||||
builder = BreadcrumbBuilder()
|
||||
crumbs = builder.build()
|
||||
assert crumbs == []
|
||||
|
||||
def test_add_home(self):
|
||||
"""Should add home breadcrumb with defaults."""
|
||||
builder = BreadcrumbBuilder()
|
||||
crumbs = builder.add_home().build()
|
||||
|
||||
assert len(crumbs) == 1
|
||||
assert crumbs[0].label == "Home"
|
||||
assert crumbs[0].url == "/"
|
||||
assert crumbs[0].icon == "fas fa-home"
|
||||
|
||||
def test_add_home_custom(self):
|
||||
"""Should allow customizing home breadcrumb."""
|
||||
builder = BreadcrumbBuilder()
|
||||
crumbs = builder.add_home(
|
||||
label="Dashboard",
|
||||
url="/dashboard/",
|
||||
icon="fas fa-tachometer-alt",
|
||||
).build()
|
||||
|
||||
assert crumbs[0].label == "Dashboard"
|
||||
assert crumbs[0].url == "/dashboard/"
|
||||
assert crumbs[0].icon == "fas fa-tachometer-alt"
|
||||
|
||||
def test_add_breadcrumb(self):
|
||||
"""Should add breadcrumb with label and URL."""
|
||||
builder = BreadcrumbBuilder()
|
||||
crumbs = builder.add("Parks", "/parks/").build()
|
||||
|
||||
assert len(crumbs) == 1
|
||||
assert crumbs[0].label == "Parks"
|
||||
assert crumbs[0].url == "/parks/"
|
||||
|
||||
def test_add_current(self):
|
||||
"""Should add current page breadcrumb."""
|
||||
builder = BreadcrumbBuilder()
|
||||
crumbs = builder.add_current("Current Page").build()
|
||||
|
||||
assert len(crumbs) == 1
|
||||
assert crumbs[0].label == "Current Page"
|
||||
assert crumbs[0].is_current is True
|
||||
assert crumbs[0].url is None
|
||||
|
||||
def test_add_current_with_icon(self):
|
||||
"""Should add current page with icon."""
|
||||
builder = BreadcrumbBuilder()
|
||||
crumbs = builder.add_current("Settings", icon="fas fa-cog").build()
|
||||
|
||||
assert crumbs[0].icon == "fas fa-cog"
|
||||
|
||||
def test_chain_multiple_breadcrumbs(self):
|
||||
"""Should chain multiple breadcrumbs."""
|
||||
builder = BreadcrumbBuilder()
|
||||
crumbs = (
|
||||
builder.add_home()
|
||||
.add("Parks", "/parks/")
|
||||
.add("California", "/parks/california/")
|
||||
.add_current("Disneyland")
|
||||
.build()
|
||||
)
|
||||
|
||||
assert len(crumbs) == 4
|
||||
assert crumbs[0].label == "Home"
|
||||
assert crumbs[1].label == "Parks"
|
||||
assert crumbs[2].label == "California"
|
||||
assert crumbs[3].label == "Disneyland"
|
||||
assert crumbs[3].is_current is True
|
||||
|
||||
def test_schema_positions_auto_assigned(self):
|
||||
"""Should auto-assign schema positions."""
|
||||
builder = BreadcrumbBuilder()
|
||||
crumbs = (
|
||||
builder.add_home().add("Parks", "/parks/").add_current("Test").build()
|
||||
)
|
||||
|
||||
assert crumbs[0].schema_position == 1
|
||||
assert crumbs[1].schema_position == 2
|
||||
assert crumbs[2].schema_position == 3
|
||||
|
||||
def test_builder_is_reusable(self):
|
||||
"""Builder should be reusable after build."""
|
||||
builder = BreadcrumbBuilder()
|
||||
builder.add_home()
|
||||
|
||||
crumbs1 = builder.build()
|
||||
builder.add("New", "/new/")
|
||||
crumbs2 = builder.build()
|
||||
|
||||
assert len(crumbs1) == 1
|
||||
assert len(crumbs2) == 2
|
||||
|
||||
|
||||
class TestBreadcrumbContextProcessor:
|
||||
"""Tests for breadcrumb context processor."""
|
||||
|
||||
def test_empty_breadcrumbs_when_not_set(self):
|
||||
"""Should return empty list when not set on request."""
|
||||
from apps.core.context_processors import breadcrumbs
|
||||
|
||||
factory = RequestFactory()
|
||||
request = factory.get("/")
|
||||
|
||||
context = breadcrumbs(request)
|
||||
assert context["breadcrumbs"] == []
|
||||
|
||||
def test_returns_breadcrumbs_from_request(self):
|
||||
"""Should return breadcrumbs when set on request."""
|
||||
from apps.core.context_processors import breadcrumbs
|
||||
|
||||
factory = RequestFactory()
|
||||
request = factory.get("/")
|
||||
request.breadcrumbs = [
|
||||
build_breadcrumb("Home", "/"),
|
||||
build_breadcrumb("Test", is_current=True),
|
||||
]
|
||||
|
||||
context = breadcrumbs(request)
|
||||
assert len(context["breadcrumbs"]) == 2
|
||||
Reference in New Issue
Block a user