"""Lambda test module.""" from unittest.mock import patch from lambdacommon.graphql.graphql import GraphQLError import pytest import config from owsrequest.utils import mock_request from src.constants import queries from src import app as index from src.app import BadRequest from src.app import RetryException @patch('config.graphql_gateway.set_headers') @patch('config.graphql_gateway.execute') def test_handler( mock_graphql_execute, mock_graphql_set_headers, ): """Test handler function.""" input = { 'email': 'test@test.com', 'first_name': 'test', 'last_name': 'last', 'vendor_id': 123, 'brand': 'awal', 'localization': 'en' } identity_data = { 'name': 'test last', 'email': 'test@test.com', 'firstName': 'test', 'lastName': 'last', 'localization': 'en' } resource_access = [{ 'type': 'Vendor', 'uuid': '123456abcdef', 'roles': ['ANALYTICS', 'CATALOG', 'ACCOUNTING', 'PAYEE_MANAGEMENT'] }] user_metadata_flags = [{ 'label': 'INVOKED_FROM_LAMBDA', 'value': True }] get_resource_result = {'uuid': '123456abcdef'} get_identity_by_email = None graphql_result = { 'data': { 'addUserIdentity': { 'id': 'c48e9989-a79b-48f8-9e56-413f08408d81', 'profiles': [ {'profileType': 'LABEL', 'profileId': 97612} ], } } } expected_return = { 'identity_id': 'c48e9989-a79b-48f8-9e56-413f08408d81', 'label_profile_id': '97612', 'vendor_uuid': '123456abcdef', } mock_graphql_execute.return_value = graphql_result mock_request.any( config.OWS_SERVICE_NAME, '/e2e/resource/Vendor/123', get_resource_result) mock_request.any( config.OWS_USERS_SERVICE_NAME, f"/users/identity/email/{input['email']}", get_identity_by_email, 404) result = index.handler(input, None) assert mock_graphql_set_headers.called mock_graphql_set_headers.assert_called_with(config.GRAPHQL_HEADERS) mock_graphql_execute.assert_called_once() mock_graphql_execute.assert_called_with( queries.add_resources_profiles, { 'identity': identity_data, 'resourceAccess': resource_access, 'userMetadataFlags': user_metadata_flags, 'masterContact': True, 'createAuth0User': False, 'overwriteExistingAccess': False, } ) assert result assert result == expected_return @patch('config.graphql_gateway.set_headers') @patch('config.graphql_gateway.execute') def test_handler_awal( mock_graphql_execute, mock_graphql_set_headers, ): """Test handler function.""" input = { 'email': 'test@test.com', 'first_name': 'test', 'last_name': 'last', 'vendor_id': 123, 'brand': 'awal', 'source': 'event.awalPlusAccountCreation', 'localization': 'en' } identity_data = { 'name': 'test last', 'email': 'test@test.com', 'firstName': 'test', 'lastName': 'last', # identity_data.localization deleted for awalPlus } resource_access = [{ 'type': 'Vendor', 'uuid': '123456abcdef', 'roles': ['ANALYTICS', 'CATALOG', 'ACCOUNTING'] }] user_metadata_flags = [{ 'label': 'INVOKED_FROM_LAMBDA', 'value': True }] get_resource_result = {'uuid': '123456abcdef'} get_identity_by_email = None graphql_result = { 'data': { 'addUserIdentity': { 'id': 'c48e9989-a79b-48f8-9e56-413f08408d81', 'profiles': [ {'profileType': 'LABEL', 'profileId': 97612} ], } } } expected_return = { 'identity_id': 'c48e9989-a79b-48f8-9e56-413f08408d81', 'label_profile_id': '97612', 'vendor_uuid': '123456abcdef', } mock_graphql_execute.return_value = graphql_result mock_request.any( config.OWS_SERVICE_NAME, '/e2e/resource/Vendor/123', get_resource_result) mock_request.any( config.OWS_USERS_SERVICE_NAME, f"/users/identity/email/{input['email']}", get_identity_by_email, 404) result = index.handler(input, None) assert mock_graphql_set_headers.called mock_graphql_set_headers.assert_called_with(config.GRAPHQL_HEADERS) mock_graphql_execute.assert_called_once() mock_graphql_execute.assert_called_with( queries.add_resources_profiles, { 'identity': identity_data, 'resourceAccess': resource_access, 'userMetadataFlags': user_metadata_flags, 'masterContact': True, 'createAuth0User': False, 'overwriteExistingAccess': False, } ) assert result assert result == expected_return @patch('config.graphql_gateway.set_headers') @patch('config.graphql_gateway.execute') def test_handler_with_existed_identity( mock_graphql_execute, mock_graphql_set_headers ): """Test handler function with existed identity.""" input = { 'email': 'test-user@theorchard.com', 'first_name': 'Test', 'last_name': 'User', 'vendor_id': 123, 'brand': 'orchard', 'localization': 'fr' } identity_data = { 'name': 'Test User', 'email': 'test-user@theorchard.com', 'firstName': 'Test', 'lastName': 'User', 'localization': 'fr' } resource_access = [{ 'type': 'Vendor', 'uuid': '123456abcdef', 'roles': ['ANALYTICS', 'CATALOG', 'ACCOUNTING', 'PAYEE_MANAGEMENT'] }] user_metadata_flags = [{ 'label': 'INVOKED_FROM_LAMBDA', 'value': True }] get_resource_result = {'uuid': '123456abcdef'} get_identity_by_email = { 'email': 'tnozhkina+invite4@theorchard.com', 'first_name': 'tnozhkina', 'last_name': 'invite', 'brand': 'orchard', 'localization': 'en', 'id': 'p48e1989-a79b-48f8-9e56-413f08408d77' } graphql_result = { 'data': { 'addUserIdentity': { 'id': 'p48e1989-a79b-48f8-9e56-413f08408d77', 'profiles': [ {'profileType': 'LABEL', 'profileId': 97612} ], } } } expected_return = { 'identity_id': 'p48e1989-a79b-48f8-9e56-413f08408d77', 'label_profile_id': '97612', 'vendor_uuid': '123456abcdef' } mock_graphql_execute.return_value = graphql_result mock_request.any( config.OWS_SERVICE_NAME, '/e2e/resource/Vendor/123', get_resource_result) mock_request.any( config.OWS_USERS_SERVICE_NAME, f"/users/identity/email/{input['email']}", get_identity_by_email, 404 ) result = index.handler(input, None) assert mock_graphql_set_headers.called mock_graphql_set_headers.assert_called_with(config.GRAPHQL_HEADERS) mock_graphql_execute.assert_called_once() mock_graphql_execute.assert_called_with( queries.add_resources_profiles, { 'identity': identity_data, 'resourceAccess': resource_access, 'userMetadataFlags': user_metadata_flags, 'masterContact': True, 'createAuth0User': False, 'overwriteExistingAccess': False, } ) assert result assert result == expected_return @patch('config.graphql_gateway.execute') def test_validation( mock_graphql_execute ): """Test validation handling.""" request = { 'email': 'test@test.com', 'first_name': 'test', 'last_name': 'last', 'vendor_id': 123, 'brand': 'foo', 'localization': 'en' } get_resource_result = {'uuid': '123456abcdef'} get_identity_by_email = None mock_request.any( config.OWS_SERVICE_NAME, '/e2e/resource/Vendor/123', get_resource_result) mock_request.any( config.OWS_USERS_SERVICE_NAME, f"/users/identity/email/{request['email']}", get_identity_by_email, 404 ) graphql_result = {'foo': 'bar'} mock_graphql_execute.return_value = graphql_result mock_graphql_execute.side_effect = GraphQLError( [{ 'message': 'Test GraphQL Error' }] ) mock_graphql_execute.side_effect.response = {'status': 400} with pytest.raises(BadRequest): index.handler(request, None) mock_graphql_execute.assert_called_once() @patch('config.graphql_gateway.execute') def test_retry( mock_graphql_execute ): """Test retry exception handling.""" request = { 'email': 'test@test.com', 'first_name': 'test', 'last_name': 'last', 'vendor_id': 123, 'brand': 'foo', 'localization': 'en' } get_resource_result = {'uuid': '123456abcdef'} get_identity_by_email = None mock_request.any( config.OWS_SERVICE_NAME, '/e2e/resource/Vendor/123', get_resource_result) mock_request.any( config.OWS_USERS_SERVICE_NAME, f"/users/identity/email/{request['email']}", get_identity_by_email, 404 ) graphql_result = {'foo': 'bar'} mock_graphql_execute.return_value = graphql_result mock_graphql_execute.side_effect = GraphQLError( [{ 'message': 'Test GraphQL Error' }] ) mock_graphql_execute.side_effect.response = {'status': 500} with pytest.raises(RetryException): index.handler(request, {}) @patch('config.graphql_gateway.execute') def test_retry_404( mock_graphql_execute ): """Test retry exception handling for 404 not_found_error.""" request = { 'email': 'test@test.com', 'first_name': 'test', 'last_name': 'last', 'vendor_id': 123, 'brand': 'foo', 'localization': 'en' } get_resource_result = {'uuid': '123456abcdef'} get_identity_by_email = None mock_request.any( config.OWS_SERVICE_NAME, '/e2e/resource/Vendor/123', get_resource_result) mock_request.any( config.OWS_USERS_SERVICE_NAME, f"/users/identity/email/{request['email']}", get_identity_by_email, 404 ) graphql_result = {'foo': 'bar'} mock_graphql_execute.return_value = graphql_result mock_graphql_execute.side_effect = GraphQLError( [{ 'message': 'Missing resource information. ' 'Could not assign resource access.' }] ) mock_graphql_execute.side_effect.response = { 'status': 404, 'body': { 'code': 'not_found_error', } } with pytest.raises(RetryException) as excinfo: index.handler(request, {}) assert ('NotFoundError: GraphQL response=' "{'status': 404, 'body': {'code': 'not_found_error'}}." ' Lets retry.') == str(excinfo.value)