"""Test Secure Document Manager.""" import datetime from unittest.mock import Mock, patch from uuid import uuid4 from payee.connectors.secure_data.manager import SecureDocumentManager from payee.models.tax_form import USTaxFormW9Document def test_manager_create(mock_secure_document_manager): """Test creating an SDM.""" assert mock_secure_document_manager def test_manager_format_primary_key(mock_secure_document_manager): """Test format primary keys.""" primary_key = mock_secure_document_manager.format_primary_key( 'foo', '1', 'bar', '0' ) assert primary_key == { mock_secure_document_manager.partition_key: 'foo#1', mock_secure_document_manager.sort_key: 'bar#0', } @patch('payee.connectors.secure_data.manager.uuid4', return_value='1') def test_manager_generate_versioned_document_primary_keys( _, mock_secure_document_manager ): """Test generate versioned keys.""" versioned_keys = ( mock_secure_document_manager.generate_versioned_document_primary_keys( # noqa 'foo', '1', 'bar' ) ) assert versioned_keys == ( { mock_secure_document_manager.partition_key: 'foo#1', mock_secure_document_manager.sort_key: 'bar#1', }, { mock_secure_document_manager.partition_key: 'foo#1', mock_secure_document_manager.sort_key: 'bar#0', }, ) @patch('payee.connectors.secure_data.manager.current_timestamp') def test_get_current_timestamp( mock_current_timestamp: Mock, mock_secure_document_manager: SecureDocumentManager, ) -> None: """Test _get_current_timestamp.""" current_ts = datetime.datetime.now() mock_current_timestamp.return_value = current_ts assert mock_secure_document_manager._get_current_timestamp() == current_ts.strftime( '%Y-%m-%dT%H:%M:%S.%f%z' ) @patch.object(SecureDocumentManager, 'put_item') @patch.object(SecureDocumentManager, '_get_current_timestamp') @patch.object(SecureDocumentManager, 'encrypt_item') @patch.object(SecureDocumentManager, 'format_primary_key') @patch('payee.connectors.secure_data.manager.uuid4') def test_save_versioned_item( mock_uuid4: Mock, mock_format_primary_key: Mock, mock_encrypt_item: Mock, mock_get_current_timestamp: Mock, mock_put_item: Mock, mock_secure_document_manager: SecureDocumentManager, tax_form_info_w9_document: USTaxFormW9Document, ) -> None: """Test save_versioned_item.""" version = uuid4() versioned_key = {'test_key': 123} account_payee_id = 8 owner_type = USTaxFormW9Document.__name__ versioned_item = {'encrypted_item': 321} current_ts = 'test ts' mock_uuid4.return_value = version mock_format_primary_key.return_value = versioned_key mock_encrypt_item.return_value = versioned_item mock_get_current_timestamp.return_value = current_ts result = mock_secure_document_manager.save_versioned_item( owner_type, account_payee_id, tax_form_info_w9_document, ) assert result == str(version) mock_format_primary_key.assert_called_once_with( owner_type, account_payee_id, tax_form_info_w9_document.document_type(), version ) mock_encrypt_item.assert_called_once_with( versioned_key, tax_form_info_w9_document, current_ts ) mock_get_current_timestamp.assert_called_once_with() mock_put_item.assert_called_once_with(versioned_item) @patch.object(SecureDocumentManager, 'format_primary_key') def test_delete_current_item( mock_format_primary_key: Mock, mock_secure_document_manager: SecureDocumentManager, mock_dynamodb_table, ) -> None: """Test delete_current_item.""" current_key = {'test_key': 123} account_payee_id = 8 owner_type = USTaxFormW9Document.__name__ mock_format_primary_key.return_value = current_key with patch.object(mock_dynamodb_table, 'delete_item') as mock_delete_item: mock_secure_document_manager.delete_current_item( owner_type, account_payee_id, USTaxFormW9Document, ) mock_delete_item.assert_called_once_with(Key=current_key) mock_format_primary_key.assert_called_once_with( owner_type, account_payee_id, USTaxFormW9Document.document_type(), '0' )