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

1import pytest 

2 

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) 

23 

24 

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