"""Test secure_document details logic.""" from datetime import datetime from unittest.mock import MagicMock, Mock, patch from uuid import uuid4 import pytest from payee.config import Config from payee.connectors.secure_data.manager import SecureDocumentManager from payee.constants.constants import TAX_FORM_TYPES from payee.logic.secure_document import ( create_secure_document_details, delete_secure_document, get_audit_fields, get_sdm_config, OwsRequestHeadersException, save_secure_document_details_by_payee_id, save_secure_document_details_version, ) from payee.models.knr_details import KnrDetailsDocument from payee.models.tax_form import USTaxFormW9Document from tests.constants import MOCK_TAX_FORM_DETAILS @patch('payee.logic.secure_document.get_audit_fields') @patch('payee.logic.secure_document.SecureDocumentManager') @patch('payee.logic.secure_document.get_secure_document_manager') def test_create_secure_document_details(mock_get_sdm, mock_sdm, mock_audit_fields): """Test successfully saving secure_document details.""" account_payee_id = 1 audit_fields = { 'modified_by_profile_id': 'modified_by_profile_id', 'modified_by_profile_type': 'modified_by_profile_type', 'modified_by_identity': 'modified_by_identity', 'modified_at': 'modified_at', } mock_audit_fields.return_value = audit_fields params = { 'account_payee_id': account_payee_id, 'w_form_type': 'W9', 'w_form_expiry': '2022-11-30T17:51:32Z', 'sap_vendor_id': '123', } mock_get_sdm.return_value = mock_sdm res = create_secure_document_details(mock_get_sdm, KnrDetailsDocument, **params) assert res == { 'account_payee_id': account_payee_id, 'sap_vendor_id': '123', 'w_form': {'w_form_type': 'W9', 'w_form_expiry': '2022-11-30T17:51:32Z'}, 'modified_by': None, 'revision': '0', **audit_fields, } def test_get_sdm_config(mock_config: Config) -> None: """Test get_sdm_config.""" assert get_sdm_config() == mock_config.SDM_CONFIG @patch('payee.logic.secure_document.save_secure_document_details') @patch('payee.logic.secure_document.get_sdm_config') def test_save_secure_document_details_by_payee_id( mock_get_sdm_config: Mock, mock_save_secure_document_details: Mock, ) -> None: """Test save_secure_document_details_by_payee_id.""" account_payee_id = 10 document_class = USTaxFormW9Document config_data = {'test': 1} params = {'field1': 'value1'} mock_get_sdm_config.return_value = config_data save_secure_document_details_by_payee_id(account_payee_id, document_class, **params) mock_save_secure_document_details.assert_called_once_with( account_payee_id, config_data, document_class, **params ) @patch('payee.logic.secure_document.get_secure_document_manager') def test_save_secure_document_details_version( mock_get_secure_document_manager: Mock, tax_form_info_w9_document: USTaxFormW9Document, ) -> None: """Test save_secure_document_details_version.""" revision_id = 'r1' account_payee_id = 10 document_class = tax_form_info_w9_document.__class__ mock_sdm = MagicMock() mock_document_class = Mock() mock_document_class.__name__ = document_class.__name__ mock_document_class.owner_type.return_value = document_class.owner_type() mock_document_class.return_value = tax_form_info_w9_document mock_sdm.save_versioned_item.return_value = revision_id mock_get_secure_document_manager.return_value = mock_sdm result = save_secure_document_details_version( account_payee_id, mock_document_class, **MOCK_TAX_FORM_DETAILS[TAX_FORM_TYPES.W9], ) assert result == revision_id mock_get_secure_document_manager.assert_called_once_with() mock_document_class.assert_called_once_with( MOCK_TAX_FORM_DETAILS[TAX_FORM_TYPES.W9] ) mock_sdm.save_versioned_item.assert_called_once_with( document_class.__name__, account_payee_id, tax_form_info_w9_document ) @patch('payee.logic.secure_document.get_secure_document_manager') def test_delete_secure_document(mock_get_secure_document_manager: Mock) -> None: """Test delete_secure_document.""" account_payee_id = 15 document_class = USTaxFormW9Document mock_sdm = MagicMock() mock_get_secure_document_manager.return_value = mock_sdm delete_secure_document(account_payee_id, document_class) mock_get_secure_document_manager.assert_called_once_with() mock_sdm.delete_current_item.assert_called_once_with( document_class.__name__, account_payee_id, document_class ) @patch('payee.logic.secure_document.current_timestamp') @patch('payee.logic.secure_document.flask_request') @patch('payee.logic.secure_document.g') def test_get_audit_fields_headers( mock_g, mock_flask_request, mock_current_timestamp, mock_bypass_headers ): """Test get_audit_fields function.""" current_timestamp = datetime.now() mock_context = MagicMock() mock_context.jwt_identity_id = None mock_g.request_context = mock_context mock_flask_request.get_ows_headers.return_value = mock_bypass_headers mock_current_timestamp.return_value = current_timestamp audit_fields = get_audit_fields() assert audit_fields == { 'modified_at': current_timestamp.strftime(SecureDocumentManager.date_format), 'modified_by_identity': mock_bypass_headers['Orchard-Identity-Id'], 'modified_by_profile_id': mock_bypass_headers['Orchard-Profile-Id'], 'modified_by_profile_type': mock_bypass_headers['Orchard-Profile-Type'], } @patch('payee.logic.secure_document.current_timestamp') @patch('payee.logic.secure_document.flask_request') @patch('payee.logic.secure_document.g') def test_get_audit_fields_jwt(mock_g, mock_flask_request, mock_current_timestamp): """Test get_audit_fields function.""" test_identity = str(uuid4()) current_timestamp = datetime.now() mock_context = MagicMock() mock_context.jwt_identity_id = test_identity mock_g.request_context = mock_context mock_flask_request.get_ows_headers.return_value = {} mock_current_timestamp.return_value = current_timestamp audit_fields = get_audit_fields() assert audit_fields == { 'modified_at': current_timestamp.strftime(SecureDocumentManager.date_format), 'modified_by_identity': test_identity, 'modified_by_profile_id': None, 'modified_by_profile_type': None, } def test_get_audit_fields_failure(): """Test get_audit_fields function.""" with pytest.raises(OwsRequestHeadersException): get_audit_fields()