Coverage for backend/tests/test_models.py: 100%
5 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-05-02 01:42 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-05-02 01:42 +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 """\
113 {
114 "data": {
115 "type": "game_state",
116 "game_state_update_type": "day_end",
117 "day": 0,
118 "customers_served": 0,
119 "score": 0
120 }
121 }""",
122 Message(data=DayEnd(day=0, customers_served=0, score=0)),
123 id="DayEnd",
124 ),
125 pytest.param(
126 '{"data": {"type": "lobby_lifecycle", "lifecycle_type": "player_join", "id": "id"}}',
127 Message(data=PlayerJoin(id="id")),
128 id="PlayerJoin",
129 ),
130 pytest.param(
131 '{"data": {"type": "lobby_lifecycle", "lifecycle_type": "player_leave", "id": "id"}}',
132 Message(data=PlayerLeave(id="id")),
133 id="PlayerLeave",
134 ),
135 pytest.param(
136 '{"data": {"type": "lobby_lifecycle", "lifecycle_type": "game_start"}}',
137 Message(data=GameStart()),
138 id="GameStart",
139 ),
140 pytest.param(
141 '{"data": {"type": "lobby_lifecycle", "lifecycle_type": "game_end"}}',
142 Message(data=GameEnd()),
143 id="GameEnd",
144 ),
145 pytest.param(
146 '{"data": {"type": "chat", "typing": false}}',
147 Message(data=Chat(typing=False)),
148 id="Chat",
149 ),
150 ],
151)
152def test_deserialize(inp: str, exp: Message) -> None:
153 """Test models are deserialized correctly."""
154 assert Message.model_validate_json(inp) == exp