Coverage for tests/test_convert_lists.py: 100%

24 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-05-25 21:42 +0000

1import pytest 

2from datetime import datetime 

3from src.convert_lists import converter 

4from src.convert_lists import compare_lists_by_tuples 

5import copy 

6from src.convert_lists import get_list_from_three_norm_del_add 

7 

8class TestConverter: 

9 @pytest.mark.parametrize( 

10 "input_list,expected", 

11 [ 

12 ( 

13 ["100", datetime(2024, 6, 1, 14, 30), "FirmX", "John Doe ", "Note", "12345", "123456789", "wenz1", "1", 0], 

14 ["100", "14:30", "FirmX", "John Doe", "Note", "12345", "123456789", "wenz1", True, 0] 

15 ), 

16 ( 

17 [None, datetime(2024, 6, 1, 8, 0), None, "", None, None, None, None, None, 1], 

18 ["", "08:00", "", "", "", "", "", None, False, 1] 

19 ), 

20 ( 

21 [" 200 ", datetime(2024, 6, 1, 9, 15), " Firm None ", " Alice ", "None", " 54321 ", " 987654321 ", "wenz2", "None", 2], 

22 ["200", "09:15", "Firm", "Alice", "", "54321", "987654321", "wenz2", False, 2] 

23 ), 

24 ( 

25 ["300", datetime(2024, 6, 1, 10, 45), "FirmY", "Bob", "Remark", "67890", 123456789.0, "wenz3", "0", 3], 

26 ["300", "10:45", "FirmY", "Bob", "Remark", "67890", "123456789", "wenz3", True, 3] 

27 ), 

28 ( 

29 ["400", datetime(2024, 6, 1, 12, 0), "FirmZ", "Eve", "Info", "11111", "555555555", "wenz4", "501", 4], 

30 ["400", "12:00", "FirmZ", "Eve", "Info", "11111", "555555555", "wenz4", False, 4] 

31 ), 

32 ( 

33 ["500", datetime(2024, 6, 1, 13, 0), "FirmA", "Carl", "None", "22222", "666666666", "wenz5", "", 5], 

34 ["500", "13:00", "FirmA", "Carl", "", "22222", "666666666", "wenz5", False, 5] 

35 ), 

36 ] 

37 ) 

38 def test_converter(self, input_list, expected): 

39 result = converter(input_list) 

40 assert result == expected 

41 

42 

43class TestCompareListsByTuples: 

44 @pytest.mark.parametrize( 

45 "del_lista, add_lista, expected_del, expected_add", 

46 [ 

47 # No matches, lists unchanged 

48 ( 

49 [ 

50 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 1], 

51 ["200", "15:00", "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", False, 1], 

52 ], 

53 [ 

54 ["300", "16:00", "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", True, 2], 

55 ], 

56 [ 

57 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 1], 

58 ["200", "15:00", "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", False, 1], 

59 ], 

60 [ 

61 ["300", "16:00", "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", True, 2], 

62 ], 

63 ), 

64 # One match, one field differs, HTML tags applied, add_lista element removed 

65 ( 

66 [ 

67 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 1], 

68 ], 

69 [ 

70 ["100", "14:30", "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", True, 2], 

71 ], 

72 [ 

73 [ 

74 "100", 

75 "14:30", 

76 "FirmX", 

77 '<span style="color: rgb(238, 36, 36); font-weight: bold; text-decoration: line-through;">John</span> <span style="color: rgb(0, 139, 7); font-weight: bold;">Johnny</span>', 

78 "Note", 

79 "12345", 

80 "123456789", 

81 "wenz1", 

82 True, 

83 0, 

84 ] 

85 ], 

86 [], 

87 ), 

88 # Multiple matches, multiple fields differ 

89 ( 

90 [ 

91 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 1], 

92 ["200", "15:00", "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", False, 1], 

93 ], 

94 [ 

95 ["100", "14:30", "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", True, 2], 

96 ["200", "15:00", "FirmY", "Alicia", "Note2", "54321", "987654321", "wenz2", True, 2], 

97 ], 

98 [ 

99 [ 

100 "100", 

101 "14:30", 

102 "FirmX", 

103 '<span style="color: rgb(238, 36, 36); font-weight: bold; text-decoration: line-through;">John</span> <span style="color: rgb(0, 139, 7); font-weight: bold;">Johnny</span>', 

104 "Note", 

105 "12345", 

106 "123456789", 

107 "wenz1", 

108 True, 

109 0, 

110 ], 

111 [ 

112 "200", 

113 "15:00", 

114 "FirmY", 

115 '<span style="color: rgb(238, 36, 36); font-weight: bold; text-decoration: line-through;">Alice</span> <span style="color: rgb(0, 139, 7); font-weight: bold;">Alicia</span>', 

116 "Note2", 

117 "54321", 

118 "987654321", 

119 "wenz2", 

120 False, 

121 0, 

122 ], 

123 ], 

124 [], 

125 ), 

126 # Partial match, only one tuple matches 

127 ( 

128 [ 

129 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 1], 

130 ["200", "15:00", "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", False, 1], 

131 ], 

132 [ 

133 ["100", "14:30", "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", True, 2], 

134 ["300", "16:00", "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", True, 2], 

135 ], 

136 [ 

137 [ 

138 "100", 

139 "14:30", 

140 "FirmX", 

141 '<span style="color: rgb(238, 36, 36); font-weight: bold; text-decoration: line-through;">John</span> <span style="color: rgb(0, 139, 7); font-weight: bold;">Johnny</span>', 

142 "Note", 

143 "12345", 

144 "123456789", 

145 "wenz1", 

146 True, 

147 0, 

148 ], 

149 ["200", "15:00", "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", False, 1], 

150 ], 

151 [ 

152 ["300", "16:00", "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", True, 2], 

153 ], 

154 ), 

155 ] 

156 ) 

157 def test_compare_lists_by_tuples(self, del_lista, add_lista, expected_del, expected_add): 

158 # Deepcopy to avoid mutation side effects 

159 del_copy = copy.deepcopy(del_lista) 

160 add_copy = copy.deepcopy(add_lista) 

161 result_del, result_add = compare_lists_by_tuples(del_copy, add_copy) 

162 assert result_del == expected_del 

163 assert result_add == expected_add 

164 

165 

166class TestGetListFromThreeNormDelAdd: 

167 @pytest.mark.parametrize( 

168 "lista_norm, lista_del, lista_add, expected", 

169 [ 

170 # All lists empty 

171 ([], [], [], []), 

172 

173 # Only norm list has items 

174 ( 

175 [ 

176 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "John", "Note ", "12345", " 123456789", "wenz1", "1"), 

177 ], 

178 [], 

179 [], 

180 [ 

181 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 0], 

182 ], 

183 ), 

184 

185 # Only del list has items 

186 ( 

187 [], 

188 [ 

189 ("200", datetime(2024, 6, 1, 15, 0), "FirmY", "Alice", "Note 2", "54321", "987654321", "wenz2", None), 

190 ], 

191 [], 

192 [ 

193 ["200", "15:00", "FirmY", "Alice", "Note 2", "54321", "987654321", "wenz2", False, 1], 

194 ], 

195 ), 

196 

197 # Only add list has items 

198 ( 

199 [("300", datetime(2024, 6, 1, 16, 0), "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", "hsjhdaj"),], 

200 [], 

201 [ 

202 ("300", datetime(2024, 6, 1, 16, 0), "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", "hsjhdaj"), 

203 ], 

204 [ 

205 ["300", "16:00", "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", True, 2], 

206 ], 

207 ), 

208 

209 # All lists have unique items 

210 ( 

211 [ 

212 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "John", "Note", "12345", "123456789", "wenz1", "saddaccas"), 

213 ("200", datetime(2024, 6, 1, 15, 0), "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", "501"), 

214 ("300", datetime(2024, 6, 1, 16, 0), "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", "1"), 

215 ], 

216 [ 

217 ("200", datetime(2024, 6, 1, 15, 0), "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", "501"), 

218 ], 

219 [ 

220 ("300", datetime(2024, 6, 1, 16, 0), "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", "1"), 

221 ], 

222 [ 

223 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 0], 

224 ["200", "15:00", "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", False, 1], 

225 ["300", "16:00", "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", True, 2], 

226 ], 

227 ), 

228 

229 # Overlapping: norm and add have same tuple (should prefer add version) 

230 ( 

231 [ 

232 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", None), 

233 ], 

234 [], 

235 [ 

236 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", None), 

237 ], 

238 [ 

239 ["100", "14:30", "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", False, 2], 

240 ], 

241 ), 

242 

243 # Overlapping: del and add have same first 3 elements, should merge with HTML and remove from add 

244 ( 

245 [ 

246 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", "1"), 

247 ], 

248 [ 

249 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "John", "Note", "12345", "", "wenz1", "1"), 

250 ], 

251 [ 

252 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", "1"), 

253 ], 

254 [ 

255 [ 

256 "100", 

257 "14:30", 

258 "FirmX", 

259 '<span style="color: rgb(238, 36, 36); font-weight: bold; text-decoration: line-through;">John</span> <span style="color: rgb(0, 139, 7); font-weight: bold;">Johnny</span>', 

260 "Note", 

261 "12345", 

262 '<span style="color: rgb(238, 36, 36); font-weight: bold; text-decoration: line-through;"></span> <span style="color: rgb(0, 139, 7); font-weight: bold;">123456789</span>', 

263 "wenz1", 

264 True, 

265 0, 

266 ] 

267 ], 

268 ), 

269 

270 

271 ] 

272 ) 

273 def test_get_list_from_three_norm_del_add(self, lista_norm, lista_del, lista_add, expected): 

274 result = get_list_from_three_norm_del_add(lista_norm, lista_del, lista_add) 

275 assert result == expected 

276 

277 

278 

279 

280