~frankban/charms/precise/juju-gui/ftests-bootstrap-node

« back to all changes in this revision

Viewing changes to server/guiserver/tests/test_handlers.py

  • Committer: Gary Poster
  • Date: 2013-11-25 14:18:26 UTC
  • mfrom: (134.4.7 authtoken3)
  • Revision ID: gary.poster@canonical.com-20131125141826-yatj3l58m4wg1tjw
Fully integrate AuthenticationTokenHandler

This might be the last of the charm branches for the authtoken feature.  It hooks up the handler and tests the integration.

R=frankban
CC=
https://codereview.appspot.com/31290043

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
"""Tests for the Juju GUI server handlers."""
18
18
 
 
19
import datetime
19
20
import json
20
21
import os
21
22
import shutil
330
331
        self.assertFalse(self.handler.user.is_authenticated)
331
332
        self.assertFalse(self.handler.auth.in_progress())
332
333
 
 
334
    @mock.patch('uuid.uuid4', mock.Mock(return_value=mock.Mock(hex='DEFACED')))
 
335
    @mock.patch('datetime.datetime',
 
336
                mock.Mock(
 
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]
 
348
        self.assertEqual(
 
349
            dict(
 
350
                RequestId=42,
 
351
                Response=dict(
 
352
                    Token='DEFACED',
 
353
                    Created='2013-11-21T21:00:00Z',
 
354
                    Expires='2013-11-21T21:02:00Z'
 
355
                )
 
356
            ),
 
357
            json.loads(message))
 
358
        self.assertFalse(self.handler.juju_connected)
 
359
        self.assertEqual(0, len(self.handler._juju_message_queue))
 
360
 
 
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]
 
368
        self.assertEqual(
 
369
            dict(
 
370
                RequestId=42,
 
371
                Error='tokens can only be created by authenticated users.',
 
372
                ErrorCode='unauthorized access',
 
373
                Response={},
 
374
            ),
 
375
            json.loads(message))
 
376
        self.assertFalse(self.handler.juju_connected)
 
377
        self.assertEqual(0, len(self.handler._juju_message_queue))
 
378
 
 
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')
 
387
        self.assertEqual(
 
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)
 
393
        self.assertEqual(
 
394
            dict(RequestId=42,
 
395
                 Response={'AuthTag': 'user', 'Password': 'passwd'}),
 
396
            json.loads(
 
397
                self.handler.ws_connection.write_message.call_args[0][0]))
 
398
 
 
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]
 
409
        self.assertEqual(
 
410
            'invalid entity name or password',
 
411
            json.loads(message)['Error'])
 
412
 
 
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]
 
418
        self.assertEqual(
 
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))
 
423
 
333
424
 
334
425
class TestWebSocketHandlerBundles(
335
426
        WebSocketHandlerTestMixin, helpers.WSSTestMixin,