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

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 '{"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