|
12 | 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | 13 | # See the License for the specific language governing permissions and |
14 | 14 | # limitations under the License. |
| 15 | +import os |
15 | 16 | import pytest |
16 | 17 | import sys |
17 | 18 | import typing |
18 | 19 | import unittest |
19 | 20 | import time |
20 | 21 | import urllib |
21 | 22 |
|
| 23 | +from unittest import mock |
| 24 | + |
22 | 25 | from robotide.application.updatenotifier import UpdateNotifierController, UpdateDialog |
23 | 26 |
|
24 | 27 | IS_WINDOWS = sys.platform=='win32' |
@@ -137,10 +140,10 @@ def tearDown(self): |
137 | 140 | # wx.CallAfter(self.app.ExitMainLoop) |
138 | 141 | # self.app.MainLoop() # With this here, there is no Segmentation fault |
139 | 142 | # wx.CallAfter(wx.Exit) |
| 143 | + self.app.ExitMainLoop() |
140 | 144 | self.app.Destroy() |
141 | 145 | self.app = None |
142 | 146 |
|
143 | | - |
144 | 147 | def _callback(self, version, url, settings, notebook): |
145 | 148 | __ = notebook |
146 | 149 | self.assertFalse(self._callback_called) |
@@ -173,160 +176,179 @@ def internal_settings(check_for_updates: typing.Union[bool, None] = True, |
173 | 176 | LASTUPDATECHECK: last_update_check} |
174 | 177 |
|
175 | 178 | def test_normal_update(self): |
176 | | - settings = self.internal_settings() |
177 | | - ctrl = self._update_notifier_controller(settings, self.notebook, '0', '1', 'http://xyz.abc.efg.di') |
178 | | - ctrl.notify_update_if_needed(self._callback) |
179 | | - self.assertTrue(self._callback_called) |
180 | | - self.assertEqual('1', self._newest_version) |
181 | | - self.assertEqual('http://xyz.abc.efg.di', self._url) |
182 | | - self.assertTrue(settings[CHECKFORUPDATES]) |
183 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
184 | | - # Uncomment next lines if you want to see the app |
185 | | - # wx.CallLater(5000, self.app.ExitMainLoop) |
186 | | - # self.app.MainLoop() |
| 179 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 180 | + settings = self.internal_settings() |
| 181 | + ctrl = self._update_notifier_controller(settings, self.notebook, '0', '1', 'http://xyz.abc.efg.di') |
| 182 | + ctrl.notify_update_if_needed(self._callback) |
| 183 | + self.assertTrue(self._callback_called) |
| 184 | + self.assertEqual('1', self._newest_version) |
| 185 | + self.assertEqual('http://xyz.abc.efg.di', self._url) |
| 186 | + self.assertTrue(settings[CHECKFORUPDATES]) |
| 187 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
| 188 | + # Uncomment next lines if you want to see the app |
| 189 | + # wx.CallLater(5000, self.app.ExitMainLoop) |
| 190 | + # self.app.MainLoop() |
187 | 191 |
|
188 | 192 | def test_update_when_trunk_version(self): |
189 | | - settings = self.internal_settings() |
190 | | - ctrl = self._update_notifier_controller(settings, self.notebook, '2.0', '2.0.1') |
191 | | - ctrl.notify_update_if_needed(self._callback) |
192 | | - self.assertTrue(self._callback_called) |
193 | | - self.assertEqual('2.0.1', self._newest_version) |
194 | | - self.assertTrue(settings[CHECKFORUPDATES]) |
195 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
| 193 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 194 | + settings = self.internal_settings() |
| 195 | + ctrl = self._update_notifier_controller(settings, self.notebook, '2.0', '2.0.1') |
| 196 | + ctrl.notify_update_if_needed(self._callback) |
| 197 | + self.assertTrue(self._callback_called) |
| 198 | + self.assertEqual('2.0.1', self._newest_version) |
| 199 | + self.assertTrue(settings[CHECKFORUPDATES]) |
| 200 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
196 | 201 |
|
197 | 202 | def test_last_update_done_less_than_a_week_ago(self): |
198 | | - original_time = time.time() - 60 * 60 * 24 * 3 |
199 | | - settings = self.internal_settings(last_update_check=original_time) |
200 | | - ctrl = UpdateNotifierController(settings, self.notebook) |
201 | | - ctrl.notify_update_if_needed(self._callback) |
202 | | - self.assertTrue(settings[CHECKFORUPDATES]) |
203 | | - self.assertEqual(original_time, settings[LASTUPDATECHECK]) |
204 | | - self.assertFalse(self._callback_called) |
| 203 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 204 | + original_time = time.time() - 60 * 60 * 24 * 3 |
| 205 | + settings = self.internal_settings(last_update_check=original_time) |
| 206 | + ctrl = UpdateNotifierController(settings, self.notebook) |
| 207 | + ctrl.notify_update_if_needed(self._callback) |
| 208 | + self.assertTrue(settings[CHECKFORUPDATES]) |
| 209 | + self.assertEqual(original_time, settings[LASTUPDATECHECK]) |
| 210 | + self.assertFalse(self._callback_called) |
205 | 211 |
|
206 | 212 | def test_check_for_updates_is_false(self): |
207 | | - settings = self.internal_settings(check_for_updates=False) |
208 | | - original_time = settings[LASTUPDATECHECK] |
209 | | - ctrl = UpdateNotifierController(settings, self.notebook) |
210 | | - ctrl.notify_update_if_needed(self._callback) |
211 | | - self.assertFalse(settings[CHECKFORUPDATES]) |
212 | | - self.assertEqual(original_time, settings[LASTUPDATECHECK]) |
213 | | - self.assertFalse(self._callback_called) |
| 213 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 214 | + settings = self.internal_settings(check_for_updates=False) |
| 215 | + original_time = settings[LASTUPDATECHECK] |
| 216 | + ctrl = UpdateNotifierController(settings, self.notebook) |
| 217 | + ctrl.notify_update_if_needed(self._callback) |
| 218 | + self.assertFalse(settings[CHECKFORUPDATES]) |
| 219 | + self.assertEqual(original_time, settings[LASTUPDATECHECK]) |
| 220 | + self.assertFalse(self._callback_called) |
214 | 221 |
|
215 | 222 | def test_no_update_found(self): |
216 | | - settings = self.internal_settings() |
217 | | - ctrl = self._update_notifier_controller(settings, self.notebook, '0.55', '0.55') |
218 | | - ctrl.notify_update_if_needed(self._callback) |
219 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
220 | | - self.assertFalse(self._callback_called) |
| 223 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 224 | + settings = self.internal_settings() |
| 225 | + ctrl = self._update_notifier_controller(settings, self.notebook, '0.55', '0.55') |
| 226 | + ctrl.notify_update_if_needed(self._callback) |
| 227 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
| 228 | + self.assertFalse(self._callback_called) |
221 | 229 |
|
222 | 230 | def test_no_update_found_dev(self): |
223 | | - settings = self.internal_settings() |
224 | | - ctrl = self._update_notifier_controller(settings, self.notebook, '0.56', '0.56') |
225 | | - ctrl.notify_update_if_needed(self._callback, ignore_check_condition=False, show_no_update=False) |
226 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
227 | | - self.assertFalse(self._callback_called) |
| 231 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 232 | + settings = self.internal_settings() |
| 233 | + ctrl = self._update_notifier_controller(settings, self.notebook, '0.56', '0.56') |
| 234 | + ctrl.notify_update_if_needed(self._callback, ignore_check_condition=False, show_no_update=False) |
| 235 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
| 236 | + self.assertFalse(self._callback_called) |
228 | 237 |
|
229 | 238 | @pytest.mark.skipif(IS_WINDOWS, reason='Causes: Windows fatal exception: access violation') |
230 | 239 | def test_no_update_found_dev_notify(self): |
231 | | - settings = self.internal_settings() |
232 | | - ctrl = self._update_notifier_controller(settings, self.notebook, '0.55', '0.55') |
233 | | - ctrl.notify_update_if_needed(self._callback, ignore_check_condition=True, show_no_update=True) |
234 | | - self.assertFalse(self._callback_called) |
| 240 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 241 | + settings = self.internal_settings() |
| 242 | + ctrl = self._update_notifier_controller(settings, self.notebook, '0.55', '0.55') |
| 243 | + ctrl.notify_update_if_needed(self._callback, ignore_check_condition=True, show_no_update=True) |
| 244 | + self.assertFalse(self._callback_called) |
235 | 245 |
|
236 | 246 | def test_first_run_sets_settings_correctly_and_checks_for_updates(self): |
237 | | - settings = self.internal_settings(check_for_updates=None, last_update_check=None) |
238 | | - ctrl = self._update_notifier_controller(settings, self.notebook,'1.0.2', '1.0.2') |
239 | | - ctrl.notify_update_if_needed(self._callback) |
240 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
241 | | - self.assertTrue(settings[CHECKFORUPDATES]) |
242 | | - self.assertFalse(self._callback_called) |
| 247 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 248 | + settings = self.internal_settings(check_for_updates=None, last_update_check=None) |
| 249 | + ctrl = self._update_notifier_controller(settings, self.notebook,'1.0.2', '1.0.2') |
| 250 | + ctrl.notify_update_if_needed(self._callback) |
| 251 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
| 252 | + self.assertTrue(settings[CHECKFORUPDATES]) |
| 253 | + self.assertFalse(self._callback_called) |
243 | 254 |
|
244 | 255 | def test_first_run_sets_settings_correctly_and_finds_an_update(self): |
245 | | - settings = self.internal_settings(check_for_updates=None, last_update_check=None) |
246 | | - ctrl = self._update_notifier_controller(settings, self.notebook, '1.2', '2.0') |
247 | | - ctrl.notify_update_if_needed(self._callback) |
248 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
249 | | - self.assertTrue(settings[CHECKFORUPDATES]) |
250 | | - self.assertTrue(self._callback_called) |
| 256 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 257 | + settings = self.internal_settings(check_for_updates=None, last_update_check=None) |
| 258 | + ctrl = self._update_notifier_controller(settings, self.notebook, '1.2', '2.0') |
| 259 | + ctrl.notify_update_if_needed(self._callback) |
| 260 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
| 261 | + self.assertTrue(settings[CHECKFORUPDATES]) |
| 262 | + self.assertTrue(self._callback_called) |
251 | 263 |
|
252 | 264 | def test_checking_timeouts(self): |
253 | | - settings = self.internal_settings() |
254 | | - ctrl = UpdateNotifierController(settings, self.notebook) |
| 265 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 266 | + settings = self.internal_settings() |
| 267 | + ctrl = UpdateNotifierController(settings, self.notebook) |
255 | 268 |
|
256 | | - def throw_timeout_error(): |
257 | | - raise urllib.error.URLError('timeout') |
| 269 | + def throw_timeout_error(): |
| 270 | + raise urllib.error.URLError('timeout') |
258 | 271 |
|
259 | | - ctrl._get_newest_version = throw_timeout_error |
260 | | - ctrl.notify_update_if_needed(self._callback) |
261 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 10) # The dialog timeout in 10 seconds |
262 | | - self.assertFalse(self._callback_called) |
| 272 | + ctrl._get_newest_version = throw_timeout_error |
| 273 | + ctrl.notify_update_if_needed(self._callback) |
| 274 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 10) # The dialog timeout in 10 seconds |
| 275 | + self.assertFalse(self._callback_called) |
263 | 276 |
|
264 | 277 | def test_download_url_checking_timeouts(self): |
265 | | - settings = self.internal_settings() |
266 | | - ctrl = UpdateNotifierController(settings, self.notebook) |
267 | | - ctrl.VERSION = '0' |
268 | | - ctrl._get_newest_version = lambda: '1' |
269 | | - |
270 | | - def throw_timeout_error(*args): |
271 | | - _ = args |
272 | | - raise urllib.error.URLError('timeout') |
273 | | - |
274 | | - ctrl._get_download_url = throw_timeout_error |
275 | | - ctrl.notify_update_if_needed(self._callback) |
276 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
277 | | - self.assertFalse(self._callback_called) |
| 278 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 279 | + settings = self.internal_settings() |
| 280 | + ctrl = UpdateNotifierController(settings, self.notebook) |
| 281 | + ctrl.VERSION = '0' |
| 282 | + ctrl._get_newest_version = lambda: '1' |
| 283 | + |
| 284 | + def throw_timeout_error(*args): |
| 285 | + _ = args |
| 286 | + raise urllib.error.URLError('timeout') |
| 287 | + |
| 288 | + ctrl._get_download_url = throw_timeout_error |
| 289 | + ctrl.notify_update_if_needed(self._callback) |
| 290 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
| 291 | + self.assertFalse(self._callback_called) |
278 | 292 |
|
279 | 293 | def test_server_returns_no_versions(self): |
280 | | - settings = self.internal_settings() |
281 | | - ctrl = self._update_notifier_controller(settings, self.notebook, '1.2.2', None) |
282 | | - ctrl.notify_update_if_needed(self._callback) |
283 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
284 | | - self.assertTrue(settings[CHECKFORUPDATES]) |
285 | | - self.assertFalse(self._callback_called) |
| 294 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 295 | + settings = self.internal_settings() |
| 296 | + ctrl = self._update_notifier_controller(settings, self.notebook, '1.2.2', None) |
| 297 | + ctrl.notify_update_if_needed(self._callback) |
| 298 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
| 299 | + self.assertTrue(settings[CHECKFORUPDATES]) |
| 300 | + self.assertFalse(self._callback_called) |
286 | 301 |
|
287 | 302 | def test_server_returns_older_version(self): |
288 | | - settings = self.internal_settings() |
289 | | - ctrl = self._update_notifier_controller(settings, self.notebook, '0.44', '0.43.1') |
290 | | - ctrl.notify_update_if_needed(self._callback) |
291 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
292 | | - self.assertTrue(settings[CHECKFORUPDATES]) |
293 | | - self.assertFalse(self._callback_called) |
| 303 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 304 | + settings = self.internal_settings() |
| 305 | + ctrl = self._update_notifier_controller(settings, self.notebook, '0.44', '0.43.1') |
| 306 | + ctrl.notify_update_if_needed(self._callback) |
| 307 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 1) |
| 308 | + self.assertTrue(settings[CHECKFORUPDATES]) |
| 309 | + self.assertFalse(self._callback_called) |
294 | 310 |
|
295 | 311 | @pytest.mark.skipif(IS_WINDOWS, reason='Causes: Windows fatal exception: access violation') |
296 | 312 | def test_forced_check_released(self): |
297 | | - settings = self.internal_settings() |
298 | | - ctrl = self._update_notifier_controller(settings, self.notebook, '0.43.0', '0.43.1') |
299 | | - ctrl.notify_update_if_needed(self._callback, ignore_check_condition=True) |
300 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 19) # The dialog timeout in 20 seconds |
301 | | - self.assertTrue(settings[CHECKFORUPDATES]) |
302 | | - self.assertTrue(self._callback_called) |
| 313 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 314 | + settings = self.internal_settings() |
| 315 | + ctrl = self._update_notifier_controller(settings, self.notebook, '0.43.0', '0.43.1') |
| 316 | + ctrl.notify_update_if_needed(self._callback, ignore_check_condition=True) |
| 317 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 19) # The dialog timeout in 20 seconds |
| 318 | + self.assertTrue(settings[CHECKFORUPDATES]) |
| 319 | + self.assertTrue(self._callback_called) |
303 | 320 |
|
304 | 321 | @pytest.mark.skipif(IS_WINDOWS, reason='Causes: Windows fatal exception: access violation') |
305 | 322 | def test_forced_check_development(self): |
306 | | - settings = self.internal_settings() |
307 | | - ctrl = self._update_notifier_controller(settings, self.notebook, '0.44dev12', '0.44.dev14') |
308 | | - ctrl.notify_update_if_needed(self._callback, ignore_check_condition=True) |
309 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 20) # The dialog timeout in 20 seconds |
310 | | - self.assertTrue(settings[CHECKFORUPDATES]) |
311 | | - self.assertTrue(self._callback_called) |
| 323 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 324 | + settings = self.internal_settings() |
| 325 | + ctrl = self._update_notifier_controller(settings, self.notebook, '0.44dev12', '0.44.dev14') |
| 326 | + ctrl.notify_update_if_needed(self._callback, ignore_check_condition=True) |
| 327 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 20) # The dialog timeout in 20 seconds |
| 328 | + self.assertTrue(settings[CHECKFORUPDATES]) |
| 329 | + self.assertTrue(self._callback_called) |
312 | 330 |
|
313 | 331 | @pytest.mark.skipif(IS_WINDOWS, reason='Causes: Windows fatal exception: access violation') |
314 | 332 | def test_forced_check_development_ok(self): |
315 | | - settings = self.internal_settings() |
316 | | - ctrl = self._update_notifier_controller(settings, self.notebook, '0.44dev12', '0.44.dev12') |
317 | | - ctrl.notify_update_if_needed(self._callback, ignore_check_condition=False) |
318 | | - self.assertGreater(settings[LASTUPDATECHECK], time.time() - 20) # The dialog timeout in 20 seconds |
319 | | - self.assertTrue(settings[CHECKFORUPDATES]) |
320 | | - self.assertFalse(self._callback_called) |
| 333 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 334 | + settings = self.internal_settings() |
| 335 | + ctrl = self._update_notifier_controller(settings, self.notebook, '0.44dev12', '0.44.dev12') |
| 336 | + ctrl.notify_update_if_needed(self._callback, ignore_check_condition=False) |
| 337 | + self.assertGreater(settings[LASTUPDATECHECK], time.time() - 20) # The dialog timeout in 20 seconds |
| 338 | + self.assertTrue(settings[CHECKFORUPDATES]) |
| 339 | + self.assertFalse(self._callback_called) |
321 | 340 |
|
322 | 341 | @pytest.mark.skipif(IS_WINDOWS, reason='Causes: Windows fatal exception: access violation') |
323 | 342 | def test_normal_update_dialog(self): |
324 | 343 | """ This is not actually doing a test """ |
325 | | - settings = self.internal_settings() |
326 | | - ctrl=UpdateDialog('1.0.0', 'http://localhost', settings, self.notebook,False) |
327 | | - wx.CallLater(3000, ctrl.EndModal,wx.CANCEL) |
328 | | - ctrl.ShowModal() |
329 | | - ctrl.Destroy() |
| 344 | + with mock.patch.dict(os.environ, {'RIDESETTINGS': self.app.settings.fake_cfg}): |
| 345 | + settings = self.internal_settings() |
| 346 | + # path = os.getenv('RIDESETTINGS') |
| 347 | + # print(f"DEBUG: test_updatenotifier.py test_normal_update_dialog RIDESETTINGS{path=}") |
| 348 | + ctrl=UpdateDialog('1.0.0', 'http://localhost', settings, self.notebook,False) |
| 349 | + wx.CallLater(3000, ctrl.EndModal,wx.CANCEL) |
| 350 | + ctrl.ShowModal() |
| 351 | + ctrl.Destroy() |
330 | 352 |
|
331 | 353 |
|
332 | 354 | if __name__ == '__main__': |
|
0 commit comments