"""Test handler.""" from unittest.mock import call, MagicMock, patch import config import index import pytest from simplejson.errors import JSONDecodeError @patch('index.boto3.client') @patch('index.create_secret') def test_handler_create_secret( mock_create_secret, mock_client, mock_event): """Test the main handler with the event step createSecret.""" mock_event['Step'] = 'createSecret' mock_client_instance = MagicMock() mock_client_instance.describe_secret.return_value = { 'RotationEnabled': True, 'VersionIdsToStages': { mock_event['ClientRequestToken']: 'AWSPENDING' }, } mock_client.return_value = mock_client_instance index.handler(mock_event, None) mock_create_secret.assert_called_with( mock_client_instance, mock_event['SecretId'], mock_event['ClientRequestToken'], ) @patch('index.boto3.client') @patch('index.set_secret') def test_handler_set_secret( mock_set_secret, mock_client, mock_event): """Test the main handler with the event step setSecret.""" mock_event['Step'] = 'setSecret' mock_client_instance = MagicMock() mock_client_instance.describe_secret.return_value = { 'RotationEnabled': True, 'VersionIdsToStages': { mock_event['ClientRequestToken']: 'AWSPENDING' }, } mock_client.return_value = mock_client_instance index.handler(mock_event, None) mock_set_secret.assert_called_with( mock_client_instance, mock_event['SecretId'], mock_event['ClientRequestToken'], ) @patch('index.boto3.client') @patch('index.test_secret') def test_handler_test_secret( mock_test_secret, mock_client, mock_event): """Test the main handler with the event step testSecret.""" mock_event['Step'] = 'testSecret' mock_client_instance = MagicMock() mock_client_instance.describe_secret.return_value = { 'RotationEnabled': True, 'VersionIdsToStages': { mock_event['ClientRequestToken']: 'AWSPENDING' }, } mock_client.return_value = mock_client_instance index.handler(mock_event, None) mock_test_secret.assert_called_with( mock_client_instance, mock_event['SecretId'], mock_event['ClientRequestToken'], ) @patch('index.boto3.client') @patch('index.finish_secret') def test_handler_finish_secret( mock_finish_secret, mock_client, mock_event): """Test the main handler with the event step finishSecret.""" mock_event['Step'] = 'finishSecret' mock_client_instance = MagicMock() mock_client_instance.describe_secret.return_value = { 'RotationEnabled': True, 'VersionIdsToStages': { mock_event['ClientRequestToken']: 'AWSPENDING' }, } mock_client.return_value = mock_client_instance index.handler(mock_event, None) mock_finish_secret.assert_called_with( mock_client_instance, mock_event['SecretId'], mock_event['ClientRequestToken'], ) def test_create_secret_exists(mock_event): """Test create_secret when the secret exists.""" mock_client_instance = MagicMock() index.create_secret( mock_client_instance, mock_event['SecretId'], mock_event['ClientRequestToken'], ) expected_calls = [ call( SecretId=mock_event['SecretId'], VersionStage='AWSCURRENT', ), call( SecretId=mock_event['SecretId'], VersionId=mock_event['ClientRequestToken'], VersionStage='AWSPENDING', ), ] calls = mock_client_instance.get_secret_value.call_args_list assert calls == expected_calls @patch('index.get_payoneer_auth_token') def test_create_secret_not_found(mock_get_payoneer_auth_token, mock_event): """Test create_secret when the secret does not exist.""" class MockException(Exception): pass payoneer_auth_token = 'PayoneerAuthToken123' mock_get_payoneer_auth_token.return_value = payoneer_auth_token mock_client_instance = MagicMock() mock_client_instance.exceptions.ResourceNotFoundException = MockException mock_client_instance.get_secret_value.side_effect = [ '', MockException(''), ] index.create_secret( mock_client_instance, mock_event['SecretId'], mock_event['ClientRequestToken'], ) expected_calls = [ call( SecretId=mock_event['SecretId'], VersionStage='AWSCURRENT', ), call( SecretId=mock_event['SecretId'], VersionId=mock_event['ClientRequestToken'], VersionStage='AWSPENDING', ), ] calls = mock_client_instance.get_secret_value.call_args_list assert calls == expected_calls mock_client_instance.put_secret_value.assert_called_with( SecretId=mock_event['SecretId'], ClientRequestToken=mock_event['ClientRequestToken'], SecretString=payoneer_auth_token, VersionStages=['AWSPENDING'] ) @patch('index.config.PAYONEER_PROGRAM_ID', 1) @patch('index.requests.get') def test_test_secret( mock_get_request, mock_event, mock_payoneer_api_success_response): """Test test_secret.""" payoneer_auth_token = 'PayoneerToken123' mock_client_instance = MagicMock() mock_client_instance.get_secret_value.return_value = { 'SecretString': payoneer_auth_token } mock_response = MagicMock() mock_response.json.return_value = mock_payoneer_api_success_response mock_get_request.return_value = mock_response index.test_secret( mock_client_instance, mock_event['SecretId'], mock_event['ClientRequestToken'], ) mock_client_instance.get_secret_value.assert_called_with( SecretId=mock_event['SecretId'], VersionId=mock_event['ClientRequestToken'], VersionStage='AWSPENDING', ) mock_get_request.assert_called_with( config.PAYONEER_API_TEST_URL, headers={ 'content-type': 'application/json', 'Authorization': f'Bearer {payoneer_auth_token}', } ) @patch('index.config.PAYONEER_PROGRAM_ID', 1) @patch('index.requests.get') def test_test_secret_json_fail(mock_get_request, mock_event): """Test test_secret.""" payoneer_auth_token = 'PayoneerToken123' mock_client_instance = MagicMock() mock_client_instance.get_secret_value.return_value = { 'SecretString': payoneer_auth_token } mock_get_request.return_value.json.side_effect =\ JSONDecodeError('', '', 0) with pytest.raises(ValueError) as exception: index.test_secret( mock_client_instance, mock_event['SecretId'], mock_event['ClientRequestToken'], ) assert str(exception.value) ==\ 'testSecret failed to parse JSON from Payoneer response' def test_finish_secret(mock_event): """Test finish_secret.""" mock_client_instance = MagicMock() mock_client_instance.describe_secret.return_value = { 'RotationEnabled': True, 'VersionIdsToStages': { mock_event['ClientRequestToken']: 'AWSPENDING' }, } index.finish_secret( mock_client_instance, mock_event['SecretId'], mock_event['ClientRequestToken'], ) mock_client_instance.describe_secret.assert_called_with( SecretId=mock_event['SecretId'] ) mock_client_instance.update_secret_version_stage.assert_called_with( MoveToVersionId=mock_event['ClientRequestToken'], RemoveFromVersionId=None, SecretId=mock_event['SecretId'], VersionStage='AWSCURRENT' ) @patch('index.config.PAYONEER_CLIENT_ID', 'id1') @patch('index.config.PAYONEER_CLIENT_SECRET', 'secret1') @patch('index.requests.post') def test_get_payoneer_auth_token(mock_post_request): """Test get_payoneer_auth_token.""" payoneer_auth_token = 'PayoneerAuthToken123' mock_response = MagicMock() mock_response.json.return_value = {'access_token': payoneer_auth_token} mock_post_request.return_value = mock_response token = index.get_payoneer_auth_token() mock_post_request.assert_called_with( config.PAYONEER_AUTH_URL, data={'grant_type': 'client_credentials', 'scope': 'read write'}, headers={ 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic aWQxOnNlY3JldDE='} ) assert token == payoneer_auth_token