Coverage for backend/tests/test_models.py: 100%
5 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-17 17:55 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-17 17:55 +0000
1import pytest
3from backend.models import (
4 Burger,
5 Chat,
6 DayEnd,
7 Drink,
8 GameEnd,
9 GameStart,
10 Initializer,
11 Message,
12 NewOrder,
13 Order,
14 OrderComponent,
15 OrderScore,
16 OrderSubmission,
17 PlayerJoin,
18 PlayerLeave,
19 Role,
20 RoleAssignment,
21 Side,
22)
25@pytest.mark.parametrize(
26 ["inp", "exp"],
27 [
28 pytest.param(
29 '{"data": {"type": "initializer", "code": ["Lettuce", "Tomato", "Onion"], "id": "id"}}',
30 Message(data=Initializer(code=("Lettuce", "Tomato", "Onion"), id="id")),
31 id="Initializer",
32 ),
33 pytest.param(
34 """\
35 {
36 "data": {
37 "type": "game_state",
38 "game_state_update_type": "new_order",
39 "order": {
40 "burger": {"ingredients": ["bread", "bread"]},
41 "side": {"table_state": "fries"},
42 "drink": {"color": "green", "fill": 0, "ice": true, "size": "S"}
43 }
44 }
45 }""",
46 Message(
47 data=NewOrder(
48 order=Order(
49 burger=Burger(ingredients=["bread", "bread"]),
50 side=Side(table_state="fries"),
51 drink=Drink(color="green", fill=0, size="S"),
52 )
53 )
54 ),
55 id="NewOrder",
56 ),
57 pytest.param(
58 """\
59 {
60 "data": {
61 "type": "game_state",
62 "game_state_update_type": "role_assignment",
63 "role": "manager"
64 }
65 }""",
66 Message(data=RoleAssignment(role=Role.manager)),
67 id="RoleAssignment",
68 ),
69 pytest.param(
70 '{"data": {"type": "game_state", "game_state_update_type": "order_score", "score": 1}}',
71 Message(data=OrderScore(score=1)),
72 id="OrderScore",
73 ),
74 pytest.param(
75 """\
76 {
77 "data": {
78 "type": "game_state",
79 "game_state_update_type": "order_component",
80 "component_type": "burger",
81 "component": {"ingredients": ["bread", "bread"]}
82 }
83 }""",
84 Message(data=OrderComponent(component_type="burger", component=Burger(ingredients=["bread", "bread"]))),
85 id="OrderComponent",
86 ),
87 pytest.param(
88 """\
89 {
90 "data": {
91 "type": "game_state",
92 "game_state_update_type": "order_submission",
93 "order": {
94 "burger": {"ingredients": ["bread", "bread"]},
95 "side": {"table_state": "fries"},
96 "drink": {"color": "green", "fill": 0, "ice": true, "size": "S"}
97 }
98 }
99 }""",
100 Message(
101 data=OrderSubmission(
102 order=Order(
103 burger=Burger(ingredients=["bread", "bread"]),
104 side=Side(table_state="fries"),
105 drink=Drink(color="green", fill=0, size="S"),
106 )
107 )
108 ),
109 id="OrderSubmission",
110 ),
111 pytest.param(
112 '{"data": {"type": "game_state", "game_state_update_type": "day_end", "day": 0}}',
113 Message(data=DayEnd(day=0)),
114 id="DayEnd",
115 ),
116 pytest.param(
117 '{"data": {"type": "lobby_lifecycle", "lifecycle_type": "player_join", "id": "id"}}',
118 Message(data=PlayerJoin(id="id")),
119 id="PlayerJoin",
120 ),
121 pytest.param(
122 '{"data": {"type": "lobby_lifecycle", "lifecycle_type": "player_leave", "id": "id"}}',
123 Message(data=PlayerLeave(id="id")),
124 id="PlayerLeave",
125 ),
126 pytest.param(
127 '{"data": {"type": "lobby_lifecycle", "lifecycle_type": "game_start"}}',
128 Message(data=GameStart()),
129 id="GameStart",
130 ),
131 pytest.param(
132 '{"data": {"type": "lobby_lifecycle", "lifecycle_type": "game_end"}}',
133 Message(data=GameEnd()),
134 id="GameEnd",
135 ),
136 pytest.param(
137 '{"data": {"type": "chat", "typing": false}}',
138 Message(data=Chat(typing=False)),
139 id="Chat",
140 ),
141 ],
142)
143def test_deserialize(inp: str, exp: Message) -> None:
144 """Test models are deserialized correctly."""
145 assert Message.model_validate_json(inp) == exp