"""Test auth handler.""" import json from unittest.mock import MagicMock from tornado.escape import json_encode from grass.handlers import auth # noqa from grass.logic import api_token, session from grass.models import workstation_user from grass.utils import response as grass_response async def test_over_network_session_creation(monkeypatch, http_server_client): """Test over network session creation. Please note: there's no need to create tests for the validation of the client, user and token ids as they will be handled by `is_token_valid` method (one of the reason it is being mocked here.) """ mock = MagicMock(return_value=True) monkeypatch.setattr(api_token, 'is_token_valid', mock) roles = dict(role_ids=[1], role_names=['Administrator']) roles_response = grass_response.Response(message=roles) monkeypatch.setattr( workstation_user, 'get_roles_for_user', MagicMock(return_value=roles_response) ) identity = dict(id='uuid', auth0_user_id='123') identity_response = grass_response.Response(message=identity) monkeypatch.setattr( workstation_user, 'get_user_identity', MagicMock(return_value=identity_response) ) response = await http_server_client.fetch( '/auth/session/?client=7&user=alw:14&token=a0837' ) data = json.loads(response.body.decode('utf8')) assert response.code == 200 assert data.get('token_duration') assert data.get('token') # The client id should never be made visible to the user. assert not data.get('client') async def test_store_jwt_token(monkeypatch, http_server_client): """Test to store jwt token.""" token = 'Bearer token' message = 'message' monkeypatch.setattr( session, 'store_auth_token_on_logout', MagicMock(return_value=message) ) response = await http_server_client.fetch( '/token/store/', method='POST', headers={'content-type': 'application/json', 'authorization': token}, body=json_encode({}), ) session.store_auth_token_on_logout.assert_called_with(token) assert response.code == 200 async def test_store_jwt_token_preflight_request(http_server_client): """Test to preflight request to store jwt token.""" message = b'success' response = await http_server_client.fetch('/token/store/', method='OPTIONS') assert response.body == message assert response.code == 200