Coverage for backend/tests/test_game_state.py: 100%

31 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-04-17 17:55 +0000

1import queue 

2 

3import pytest 

4 

5from backend.game_state import Lobby, Player 

6from backend.models import Role 

7 

8type LobbyFixture = tuple[Lobby, queue.Queue[int], queue.Queue[int], queue.Queue[int]] 

9 

10 

11@pytest.fixture 

12def lobby() -> LobbyFixture: 

13 """Setup a Lobby with channels for 2 players.""" 

14 lobby_q = queue.Queue() 

15 a_q = queue.Queue() 

16 b_q = queue.Queue() 

17 

18 lobby = Lobby( 

19 code=("Lettuce", "Tomato", "Onion"), 

20 players={"A": Player(a_q, Role.manager), "B": Player(b_q, Role.burger)}, 

21 channel=lobby_q, 

22 ) 

23 

24 return lobby, lobby_q, a_q, b_q 

25 

26 

27def test_lobby_broadcast(lobby: LobbyFixture) -> None: 

28 """Broadcasted messages are received by multiple players.""" 

29 lobb, _, a_q, b_q = lobby 

30 

31 lobb.broadcast(3) # pyright: ignore[reportArgumentType] 

32 

33 assert a_q.get() == 3 

34 assert b_q.get() == 3 

35 

36 

37def test_lobby_broadcast_exclude(lobby: LobbyFixture) -> None: 

38 """Broadcasted messages are received by players that are not excluded.""" 

39 lobb, _, a_q, b_q = lobby 

40 

41 # pick player A to exclude :( 

42 exclude = lobb.players["A"].id 

43 lobb.broadcast(3, exclude=[exclude]) # pyright: ignore[reportArgumentType] 

44 

45 assert b_q.get() == 3 

46 

47 with pytest.raises(queue.Empty): 

48 # should be empty 

49 a_q.get(block=False) 

50 

51 

52def test_messages_receives_msg(lobby: LobbyFixture) -> None: 

53 """Test iterator over multiple players.""" 

54 lobb, lobby_q, _, _ = lobby 

55 

56 lobby_q.put(3) 

57 lobby_q.put(6) 

58 

59 i = iter(lobb.messages()) 

60 

61 assert next(i) == 3 

62 assert next(i) == 6