Coverage for tests\test_race.py: 100%

78 statements  

« prev     ^ index     » next       coverage.py v7.0.5, created at 2023-01-18 13:04 +0200

1"""Tests for Race class. 

2 

3This module have tests for Race class and it's methods. 

4 

5Functions: 

6""" 

7from datetime import datetime 

8from dataclasses import dataclass, field 

9from unittest.mock import patch, mock_open 

10import pytest 

11 

12from report.race import Race 

13 

14 

15def test_init_race_without_argument(): 

16 with pytest.raises(TypeError): 

17 r = Race() 

18 

19 

20@pytest.mark.parametrize("err, arg", [ 

21 (UserWarning, {"abbreviations": "file"}), 

22 (UserWarning, {"one": "path/to/abbreviations.txt", 

23 "two": "path/to/start.log", 

24 "three": "path/to/end.log"}), 

25 (UserWarning, {"abbreviations": "path/to/abbr.txt", 

26 "start": "path/to/start.log", 

27 "end": "path/to/end.log"}), 

28 (FileNotFoundError, {"abbreviations": "path/to/abbreviations.txt", 

29 "start": "path/to/start.log", 

30 "end": "path/to/end.log"})]) 

31def test_init_race_with_invalid_log_files(err, arg): 

32 with pytest.raises(err): 

33 r = Race(log_files=arg) 

34 

35 

36class TestRaceGetMethods: 

37 @pytest.fixture(scope="session") 

38 def report_file_paths(self, tmp_path_factory): 

39 path = tmp_path_factory.mktemp("sub") 

40 abbr = path / "abbreviations.txt" 

41 abbr.write_text("""DRR_Daniel Ricciardo_RED BULL RACING TAG HEUER 

42 EOF_Esteban Ocon_FORCE INDIA MERCEDES 

43 SPF_Sergio Perez_FORCE INDIA MERCEDES""") 

44 start = path / "start.log" 

45 start.write_text("""DRR2018-05-24_12:11:24.067 

46 EOF2018-05-24_12:12:11.838 

47 SPF2018-05-24_12:12:01.035""") 

48 end = path / "end.log" 

49 end.write_text("""DRR2018-05-24_12:14:12.054 

50 EOF2018-05-24_12:17:58.810 

51 SPF2018-05-24_12:13:13.883""") 

52 return {"abbreviations": abbr, "start": start, "end": end} 

53 

54 @pytest.fixture(scope="session") 

55 def setup(self, report_file_paths): 

56 race = Race(report_file_paths) 

57 return race 

58 

59 def test_non_existent_file_path(self, report_file_paths): 

60 with patch("builtins.open", mock_open()) as mo: 

61 mo.side_effect = PermissionError 

62 with pytest.raises(PermissionError): 

63 race = Race(report_file_paths) 

64 

65 def test_racers_attribute(self, setup): 

66 assert setup.racers == {"DRR": 

67 {"name": "Daniel Ricciardo", 

68 "team": "RED BULL RACING TAG HEUER", 

69 "q1_start": datetime.strptime("2018-05-24_12:11:24.067", "%Y-%m-%d_%H:%M:%S.%f"), 

70 "q1_end": datetime.strptime("2018-05-24_12:14:12.054", "%Y-%m-%d_%H:%M:%S.%f")}, 

71 "EOF": 

72 {"name": "Esteban Ocon", 

73 "team": "FORCE INDIA MERCEDES", 

74 "q1_start": datetime.strptime("2018-05-24_12:12:11.838", "%Y-%m-%d_%H:%M:%S.%f"), 

75 "q1_end": datetime.strptime("2018-05-24_12:17:58.810", "%Y-%m-%d_%H:%M:%S.%f")}, 

76 "SPF": 

77 {"name": "Sergio Perez", 

78 "team": "FORCE INDIA MERCEDES", 

79 "q1_start": datetime.strptime("2018-05-24_12:12:01.035", "%Y-%m-%d_%H:%M:%S.%f"), 

80 "q1_end": datetime.strptime("2018-05-24_12:13:13.883", "%Y-%m-%d_%H:%M:%S.%f")}, 

81 } 

82 

83 def test_get_number_of_racers(self, setup): 

84 assert setup.get_number_of_racers() == 3 

85 

86 def test_get_date_of_race(self, setup): 

87 assert str(setup.get_date_of_race()) == "2018-05-24" 

88 

89 def test_get_start_time_of_q1(self, setup): 

90 assert str(setup.get_start_time_of_q1()) == "12:11:24.067000" 

91 

92 @pytest.mark.parametrize("reverse, result", [ 

93 (False, ["Daniel Ricciardo", "Esteban Ocon", "Sergio Perez"]), 

94 (True, ["Sergio Perez", "Esteban Ocon", "Daniel Ricciardo"]) 

95 ]) 

96 def test_get_names_of_racers(self, setup, reverse, result): 

97 assert setup.get_names_of_racers(reverse) == result 

98 

99 def test_get_names_of_racers_without_arguments(self, setup): 

100 assert setup.get_names_of_racers() == ["Daniel Ricciardo", 

101 "Esteban Ocon", 

102 "Sergio Perez"] 

103 

104 @pytest.mark.parametrize("reverse, result", [ 

105 (False, ["FORCE INDIA MERCEDES", "RED BULL RACING TAG HEUER"]), 

106 (True, ["RED BULL RACING TAG HEUER", "FORCE INDIA MERCEDES"]) 

107 ]) 

108 def test_get_teams(self, setup, reverse, result): 

109 assert setup.get_teams(reverse) == result 

110 

111 def test_get_teams_without_arguments(self, setup): 

112 assert setup.get_teams() == ["FORCE INDIA MERCEDES", 

113 "RED BULL RACING TAG HEUER"] 

114 

115 @pytest.fixture(scope="session") 

116 def driver_time(self): 

117 esteban_start = datetime.strptime("2018-05-24_12:12:11.838", 

118 "%Y-%m-%d_%H:%M:%S.%f") 

119 esteban_end = datetime.strptime("2018-05-24_12:17:58.810", 

120 "%Y-%m-%d_%H:%M:%S.%f") 

121 esteban_timedelta = esteban_end - esteban_start 

122 sergio_start = datetime.strptime("2018-05-24_12:12:01.035", 

123 "%Y-%m-%d_%H:%M:%S.%f") 

124 sergio_end = datetime.strptime("2018-05-24_12:13:13.883", 

125 "%Y-%m-%d_%H:%M:%S.%f") 

126 sergio_timedelta = sergio_end - sergio_start 

127 daniel_start = datetime.strptime("2018-05-24_12:11:24.067", 

128 "%Y-%m-%d_%H:%M:%S.%f") 

129 daniel_end = datetime.strptime("2018-05-24_12:14:12.054", 

130 "%Y-%m-%d_%H:%M:%S.%f") 

131 daniel_timedelta = daniel_end - daniel_start 

132 return {"esteban": esteban_timedelta, 

133 "sergio": sergio_timedelta, 

134 "daniel": daniel_timedelta} 

135 

136 def test_get_report(self, setup, driver_time): 

137 assert setup.get_report() == [["Sergio Perez", 

138 "FORCE INDIA MERCEDES", 

139 driver_time["sergio"]], 

140 ["Daniel Ricciardo", 

141 "RED BULL RACING TAG HEUER", 

142 driver_time["daniel"]], 

143 ["Esteban Ocon", 

144 "FORCE INDIA MERCEDES", 

145 driver_time["esteban"]] 

146 ] 

147 

148 def test_get_racer(self, setup, driver_time): 

149 assert setup.get_racer("Sergio Perez") == ["SPF", 

150 "Sergio Perez", 

151 "FORCE INDIA MERCEDES", 

152 str(driver_time["sergio"])[3: -3]] 

153 

154 def test_get_racer_no_racer_name(self, setup): 

155 with pytest.raises(UserWarning): 

156 setup.get_racer("Elon Mask") 

157 

158 def test_get_racers_in_team_desc(self, setup, driver_time): 

159 assert setup.get_racers_in_team("FORCE INDIA MERCEDES", order=True) == [["SPF", 

160 "Sergio Perez", 

161 "FORCE INDIA MERCEDES", 

162 str(driver_time["sergio"])[3: -3]], 

163 ["EOF", 

164 "Esteban Ocon", 

165 "FORCE INDIA MERCEDES", 

166 str(driver_time["esteban"])[3: -3]]] 

167 

168 def test_get_racers_in_team_asc(self, setup, driver_time): 

169 assert setup.get_racers_in_team("force india mercedes", order=False) == [["EOF", 

170 "Esteban Ocon", 

171 "FORCE INDIA MERCEDES", 

172 str(driver_time["esteban"])[3: -3]], 

173 ["SPF", 

174 "Sergio Perez", 

175 "FORCE INDIA MERCEDES", 

176 str(driver_time["sergio"])[3: -3]]] 

177 

178 def test_get_racers_in_team_no_order_argument(self, setup, driver_time): 

179 assert setup.get_racers_in_team("FORCE INDIA MERCEDES") == [["EOF", 

180 "Esteban Ocon", 

181 "FORCE INDIA MERCEDES", 

182 str(driver_time["esteban"])[3: -3]], 

183 ["SPF", 

184 "Sergio Perez", 

185 "FORCE INDIA MERCEDES", 

186 str(driver_time["sergio"])[3: -3]]] 

187 

188 def test_get_racers_in_team_no_team_name(self, setup, driver_time): 

189 with pytest.raises(UserWarning): 

190 assert setup.get_racers_in_team("SpaceX")