From 661226a8f58460dd5d1f94bdc5d3900ae65e289c Mon Sep 17 00:00:00 2001 From: Asger Geel Weirsoee Date: Fri, 27 Feb 2026 13:22:16 +0100 Subject: [PATCH] test(lobby): cover host create and player join flow --- lobby/tests.py | 82 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/lobby/tests.py b/lobby/tests.py index 7ce503c..5dc6733 100644 --- a/lobby/tests.py +++ b/lobby/tests.py @@ -1,3 +1,83 @@ +from django.contrib.auth import get_user_model from django.test import TestCase +from django.urls import reverse -# Create your tests here. +from fupogfakta.models import GameSession, Player + +User = get_user_model() + + +class LobbyFlowTests(TestCase): + def setUp(self): + self.host = User.objects.create_user(username="host", password="secret123") + + def test_create_session_requires_login(self): + response = self.client.post(reverse("lobby:create_session")) + + self.assertEqual(response.status_code, 302) + self.assertEqual(GameSession.objects.count(), 0) + + def test_host_can_create_session(self): + self.client.login(username="host", password="secret123") + + response = self.client.post(reverse("lobby:create_session")) + + self.assertEqual(response.status_code, 201) + body = response.json() + self.assertEqual(body["session"]["status"], GameSession.Status.LOBBY) + self.assertEqual(len(body["session"]["code"]), 6) + + session = GameSession.objects.get(code=body["session"]["code"]) + self.assertEqual(session.host, self.host) + + def test_player_can_join_with_code(self): + session = GameSession.objects.create(host=self.host, code="ABCD23") + + response = self.client.post( + reverse("lobby:join_session"), + data={"code": "abcd23", "nickname": "Luna"}, + content_type="application/json", + ) + + self.assertEqual(response.status_code, 201) + body = response.json() + self.assertEqual(body["session"]["code"], "ABCD23") + self.assertEqual(body["player"]["nickname"], "Luna") + self.assertTrue(Player.objects.filter(session=session, nickname="Luna").exists()) + + def test_join_rejects_duplicate_nickname_case_insensitive(self): + session = GameSession.objects.create(host=self.host, code="QWER12") + Player.objects.create(session=session, nickname="Luna") + + response = self.client.post( + reverse("lobby:join_session"), + data={"code": "QWER12", "nickname": "lUna"}, + content_type="application/json", + ) + + self.assertEqual(response.status_code, 409) + self.assertEqual(response.json()["error"], "Nickname already taken") + + def test_join_rejects_non_joinable_session(self): + GameSession.objects.create(host=self.host, code="ZXCV98", status=GameSession.Status.FINISHED) + + response = self.client.post( + reverse("lobby:join_session"), + data={"code": "ZXCV98", "nickname": "Kai"}, + content_type="application/json", + ) + + self.assertEqual(response.status_code, 400) + self.assertEqual(response.json()["error"], "Session is not joinable") + + def test_session_detail_returns_players(self): + session = GameSession.objects.create(host=self.host, code="LMNO45") + Player.objects.create(session=session, nickname="Mia", score=7) + Player.objects.create(session=session, nickname="Bo", score=2) + + response = self.client.get(reverse("lobby:session_detail", kwargs={"code": "lmno45"})) + + self.assertEqual(response.status_code, 200) + payload = response.json() + self.assertEqual(payload["session"]["players_count"], 2) + self.assertEqual([p["nickname"] for p in payload["players"]], ["Bo", "Mia"])