330
331
self.assertFalse(self.handler.user.is_authenticated)
331
332
self.assertFalse(self.handler.auth.in_progress())
334
@mock.patch('uuid.uuid4', mock.Mock(return_value=mock.Mock(hex='DEFACED')))
335
@mock.patch('datetime.datetime',
337
**{'utcnow.return_value':
338
datetime.datetime(2013, 11, 21, 21)}))
339
def test_token_request(self):
340
# It supports requesting a token when authenticated.
341
self.handler.user.username = 'user'
342
self.handler.user.password = 'passwd'
343
self.handler.user.is_authenticated = True
344
request = json.dumps(
345
dict(RequestId=42, Type='GUIToken', Request='Create'))
346
self.handler.on_message(request)
347
message = self.handler.ws_connection.write_message.call_args[0][0]
353
Created='2013-11-21T21:00:00Z',
354
Expires='2013-11-21T21:02:00Z'
358
self.assertFalse(self.handler.juju_connected)
359
self.assertEqual(0, len(self.handler._juju_message_queue))
361
def test_unauthenticated_token_request(self):
362
# When not authenticated, the request is passed on to Juju for error.
363
self.assertFalse(self.handler.user.is_authenticated)
364
request = json.dumps(
365
dict(RequestId=42, Type='GUIToken', Request='Create'))
366
self.handler.on_message(request)
367
message = self.handler.ws_connection.write_message.call_args[0][0]
371
Error='tokens can only be created by authenticated users.',
372
ErrorCode='unauthorized access',
376
self.assertFalse(self.handler.juju_connected)
377
self.assertEqual(0, len(self.handler._juju_message_queue))
379
def test_token_authentication_success(self):
380
# It supports authenticating with a token.
381
request = self.make_token_login_request(
382
self.tokens, username='user', password='passwd')
383
with mock.patch.object(self.io_loop,
384
'remove_timeout') as mock_remove_timeout:
385
self.handler.on_message(json.dumps(request))
386
mock_remove_timeout.assert_called_once_with('handle')
388
self.make_login_request(
389
request_id=42, username='user', password='passwd'),
390
json.loads(self.handler._juju_message_queue[0]))
391
self.assertTrue(self.handler.auth.in_progress())
392
self.send_login_response(True)
395
Response={'AuthTag': 'user', 'Password': 'passwd'}),
397
self.handler.ws_connection.write_message.call_args[0][0]))
399
def test_token_authentication_failure(self):
400
# It correctly handles a token that will not authenticate.
401
request = self.make_token_login_request(
402
self.tokens, username='user', password='passwd')
403
with mock.patch.object(self.io_loop,
404
'remove_timeout') as mock_remove_timeout:
405
self.handler.on_message(json.dumps(request))
406
mock_remove_timeout.assert_called_once_with('handle')
407
self.send_login_response(False)
408
message = self.handler.ws_connection.write_message.call_args[0][0]
410
'invalid entity name or password',
411
json.loads(message)['Error'])
413
def test_unknown_authentication_token(self):
414
# It correctly handles an unknown token.
415
request = self.make_token_login_request()
416
self.handler.on_message(json.dumps(request))
417
message = self.handler.ws_connection.write_message.call_args[0][0]
419
'unknown, fulfilled, or expired token',
420
json.loads(message)['Error'])
421
self.assertFalse(self.handler.juju_connected)
422
self.assertEqual(0, len(self.handler._juju_message_queue))
334
425
class TestWebSocketHandlerBundles(
335
426
WebSocketHandlerTestMixin, helpers.WSSTestMixin,