324
325
devices[0].sync.assert_not_called(otps)
325
326
devices[1].sync.assert_not_called(otps)
326
327
devices[2].sync.assert_not_called(otps)
329
def test_sync_disabled_when_readonly(self):
331
devices = [Mock(), Mock()]
332
otps = ['otp1', 'otp2']
333
account.devices.order_by.return_value = devices
334
devices[0].is_totp.return_value = False
335
devices[0].sync.return_value = False
336
devices[1].is_totp.return_value = False
337
devices[1].sync.return_value = True
339
with self.settings(READ_ONLY_MODE=True):
340
self.assertRaises(AuthenticationError, sync, account, otps)
342
def test_authenticate_stops_on_first_device_that_succeeds(self):
344
devices = [Mock(), Mock(), Mock()]
345
account.devices.order_by.return_value = devices
346
devices[0].is_totp.return_value = False
347
devices[0].authenticate.return_value = False
348
devices[1].is_totp.return_value = True
349
devices[1].authenticate.return_value = True
351
self.assertTrue(authenticate(account, 'otp'))
353
devices[0].authenticate.assert_called_once_with('otp')
354
devices[1].authenticate.assert_called_once_with('otp')
355
self.assertFalse(devices[2].called)
357
def test_authenticate_raises_error_if_none_of_the_devices_succeeds(self):
359
devices = [Mock(), Mock(), Mock()]
360
account.devices.order_by.return_value = devices
361
devices[0].authenticate.return_value = False
362
devices[0].is_totp.return_value = False
363
devices[1].authenticate.return_value = False
364
devices[1].is_totp.return_value = False
365
devices[2].authenticate.return_value = False
366
devices[2].is_totp.return_value = False
368
self.assertRaises(AuthenticationError, authenticate, account, 'otp')
370
devices[0].authenticate.assert_called_once_with('otp')
371
devices[1].authenticate.assert_called_once_with('otp')
372
devices[2].authenticate.assert_called_once_with('otp')
374
def test_authenticate_totp_enabled_when_readonly(self):
376
devices = [Mock(), Mock()]
377
account.devices.order_by.return_value = devices
378
devices[0].is_totp.return_value = True
379
devices[0].authenticate.return_value = True
381
with self.settings(READ_ONLY_MODE=True):
382
self.assertTrue(authenticate(account, 'otp'))
384
def test_authenticate_non_totp_disabled_when_readonly(self):
386
devices = [Mock(), Mock()]
388
account.devices.order_by.return_value = devices
389
devices[0].is_totp.return_value = False
390
devices[0].authenticate.return_value = True
391
devices[1].is_totp.return_value = True
392
devices[1].authenticate.return_value = False
394
with self.settings(READ_ONLY_MODE=True):
395
self.assertRaises(AuthenticationError, authenticate, account, otp)