feat(session): in-place row swap for finish/reset with OOB navbar
Delete stale _session_row_fragment; end_session and reset_session_start return the canonical row plus an OOB navbar-playtime fragment. Clone keeps HX-Refresh since it changes row count. Fixes #53. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
import pytest
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
|
||||
from games.models import Device, Game, Platform, Session
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def auth_client(client, django_user_model):
|
||||
user = django_user_model.objects.create_user(username="u", password="p")
|
||||
client.force_login(user)
|
||||
return client
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def running_session(db):
|
||||
platform = Platform.objects.create(name="PC")
|
||||
game = Game.objects.create(name="Hades", platform=platform)
|
||||
device = Device.objects.create(name="Deck")
|
||||
return Session.objects.create(
|
||||
game=game, device=device, timestamp_start=timezone.now()
|
||||
)
|
||||
|
||||
|
||||
def test_end_session_htmx_returns_row_and_oob_navbar(auth_client, running_session):
|
||||
url = reverse("games:list_sessions_end_session", args=[running_session.pk])
|
||||
response = auth_client.get(url, HTTP_HX_REQUEST="true")
|
||||
body = response.content.decode()
|
||||
assert response.status_code == 200
|
||||
assert f'id="session-row-{running_session.pk}"' in body
|
||||
assert 'id="navbar-playtime"' in body
|
||||
assert 'hx-swap-oob="true"' in body
|
||||
running_session.refresh_from_db()
|
||||
assert running_session.timestamp_end is not None
|
||||
|
||||
|
||||
def test_reset_session_start_htmx_returns_row_no_refresh_header(
|
||||
auth_client, running_session
|
||||
):
|
||||
original_start = running_session.timestamp_start
|
||||
url = reverse(
|
||||
"games:list_sessions_reset_session_start", args=[running_session.pk]
|
||||
)
|
||||
response = auth_client.get(url, HTTP_HX_REQUEST="true")
|
||||
body = response.content.decode()
|
||||
assert response.status_code == 200
|
||||
assert f'id="session-row-{running_session.pk}"' in body
|
||||
assert 'id="navbar-playtime"' in body
|
||||
assert "HX-Refresh" not in response.headers
|
||||
running_session.refresh_from_db()
|
||||
assert running_session.timestamp_start > original_start
|
||||
|
||||
|
||||
def test_clone_htmx_returns_hx_refresh(auth_client, running_session):
|
||||
url = reverse(
|
||||
"games:list_sessions_start_session_from_session",
|
||||
args=[running_session.pk],
|
||||
)
|
||||
before = Session.objects.count()
|
||||
response = auth_client.get(url, HTTP_HX_REQUEST="true")
|
||||
assert response.status_code == 204
|
||||
assert response.headers.get("HX-Refresh") == "true"
|
||||
assert Session.objects.count() == before + 1
|
||||
|
||||
|
||||
def test_end_session_non_htmx_redirects(auth_client, running_session):
|
||||
url = reverse("games:list_sessions_end_session", args=[running_session.pk])
|
||||
response = auth_client.get(url)
|
||||
assert response.status_code == 302
|
||||
assert response.url == reverse("games:list_sessions")
|
||||
Reference in New Issue
Block a user