feat: Implement MFA authentication, add ride statistics model, and update various services, APIs, and tests across the application.

This commit is contained in:
pacnpal
2025-12-28 17:32:53 -05:00
parent aa56c46c27
commit c95f99ca10
452 changed files with 7948 additions and 6073 deletions

View File

@@ -6,14 +6,14 @@ for testing FSM transitions, HTMX interactions, and other common scenarios.
"""
from .fsm_test_helpers import (
create_test_submission,
assert_state_log_created,
assert_status_changed,
assert_toast_triggered,
create_test_park,
create_test_ride,
assert_status_changed,
assert_state_log_created,
assert_toast_triggered,
wait_for_htmx_swap,
create_test_submission,
verify_transition_buttons_visible,
wait_for_htmx_swap,
)
__all__ = [

View File

@@ -9,10 +9,11 @@ Reusable utility functions for testing FSM transitions:
"""
import json
from typing import Any, Dict, List, Optional, Type
from django.db.models import Model
from typing import Any
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType
from django.db.models import Model
from django.http import HttpResponse
User = get_user_model()
@@ -25,10 +26,10 @@ User = get_user_model()
def create_test_submission(
status: str = "PENDING",
user: Optional[User] = None,
park: Optional[Model] = None,
user: User | None = None,
park: Model | None = None,
submission_type: str = "EDIT",
changes: Optional[Dict[str, Any]] = None,
changes: dict[str, Any] | None = None,
reason: str = "Test submission",
**kwargs
) -> "EditSubmission":
@@ -87,8 +88,8 @@ def create_test_submission(
def create_test_park(
status: str = "OPERATING",
name: Optional[str] = None,
slug: Optional[str] = None,
name: str | None = None,
slug: str | None = None,
**kwargs
) -> "Park":
"""
@@ -125,9 +126,9 @@ def create_test_park(
def create_test_ride(
status: str = "OPERATING",
name: Optional[str] = None,
slug: Optional[str] = None,
park: Optional[Model] = None,
name: str | None = None,
slug: str | None = None,
park: Model | None = None,
**kwargs
) -> "Ride":
"""
@@ -170,8 +171,8 @@ def create_test_ride(
def create_test_photo_submission(
status: str = "PENDING",
user: Optional[User] = None,
park: Optional[Model] = None,
user: User | None = None,
park: Model | None = None,
**kwargs
) -> "PhotoSubmission":
"""
@@ -254,8 +255,8 @@ def assert_status_changed(obj: Model, expected_status: str) -> None:
def assert_state_log_created(
obj: Model,
transition_name: str,
user: Optional[User] = None,
expected_state: Optional[str] = None
user: User | None = None,
expected_state: str | None = None
) -> None:
"""
Assert that a StateLog entry was created for a transition.
@@ -295,7 +296,7 @@ def assert_state_log_created(
def assert_toast_triggered(
response: HttpResponse,
message: Optional[str] = None,
message: str | None = None,
toast_type: str = "success"
) -> None:
"""
@@ -375,9 +376,9 @@ def wait_for_htmx_swap(
def verify_transition_buttons_visible(
page,
transitions: List[str],
transitions: list[str],
container_selector: str = "[data-status-actions]"
) -> Dict[str, bool]:
) -> dict[str, bool]:
"""
Verify which transition buttons are visible on the page.
@@ -487,7 +488,7 @@ def click_and_confirm(page, button_locator, accept: bool = True) -> None:
# =============================================================================
def make_htmx_post(client, url: str, data: Optional[Dict] = None) -> HttpResponse:
def make_htmx_post(client, url: str, data: dict | None = None) -> HttpResponse:
"""
Make a POST request with HTMX headers.
@@ -529,7 +530,7 @@ def get_fsm_transition_url(
pk: int,
transition_name: str,
use_slug: bool = False,
slug: Optional[str] = None
slug: str | None = None
) -> str:
"""
Generate the URL for an FSM transition.