"""Tests for the ows_collaborator model.""" from unittest.mock import MagicMock, patch import pytest from flask.ctx import AppContext from requests.models import Response from account.constants import error, service from account.models import ows_collaborator from account.utils.exception import ExceptionDictOwsResponse @pytest.mark.parametrize( 'response_data,expected_result', [ pytest.param( { 'latest_version': 2, 'latest_template': 'Terms and Conditions Template v2.1', 'agreed_version': 2, 'agreed_date': '2023-01-15T10:30:00Z', }, ows_collaborator.VendorTermsAndConditions( latest_version=2, latest_template='Terms and Conditions Template v2.1', agreed_date='2023-01-15T10:30:00Z', agreed_version=2, ), id='success', ), pytest.param( None, None, id='null_response', ), ], ) @patch('account.models.ows_collaborator.g') @patch('account.models.ows_collaborator.ows_client.get') def test_get_vendor_terms_and_conditions_success( mock_ows_client_get: MagicMock, mock_g: MagicMock, response_data, expected_result, app_context: AppContext, ) -> None: """Test successful retrieval of vendor terms and conditions and null response handling.""" # Setup mock response mock_response = Response() mock_response.status_code = 200 mock_response.json = MagicMock(return_value=response_data) mock_ows_client_get.return_value = mock_response # Setup mock request context mock_g.request_context.profile_type = 'SettingsProfile' mock_g.request_context.profile_id = 12345 mock_g.request_context.jwt_identity_id = 'identity-123' # Call the function result = ows_collaborator.get_vendor_terms_and_conditions(7123) # Verify the call mock_ows_client_get.assert_called_once_with( service.OWS_COLLABORATOR, '/terms-and-conditions', headers={ 'Orchard-Profile-Type': 'SettingsProfile', 'Orchard-Profile-Id': 12345, 'Orchard-Identity-Id': 'identity-123', }, params={'vendor_id': 7123}, ) # Verify the result assert result == expected_result @pytest.mark.parametrize( 'status_code,error_response', [ pytest.param( 403, {'message': 'User is forbidden', 'code': 'authorization_error'}, id='authorization_error', ), pytest.param( 500, { 'error': 'Internal server error', 'message': 'An unexpected error occurred', }, id='server_error', ), ], ) @patch('account.models.ows_collaborator.g') @patch('account.models.ows_collaborator.ows_client.get') def test_get_vendor_terms_and_conditions_error( mock_ows_client_get: MagicMock, mock_g: MagicMock, status_code: int, error_response: dict, app_context: AppContext, ): """Test handling of error responses.""" # Setup mock response with error mock_response = Response() mock_response.status_code = status_code mock_response.json = MagicMock(return_value=error_response) mock_ows_client_get.return_value = mock_response # Setup mock request context mock_g.request_context.profile_type = 'SettingsProfile' mock_g.request_context.profile_id = 12345 mock_g.request_context.jwt_identity_id = 'identity-123' # Verify exception is raised with pytest.raises(ExceptionDictOwsResponse) as exc_info: ows_collaborator.get_vendor_terms_and_conditions(7123) # Verify exception details assert exc_info.value.status == status_code assert exc_info.value.code == error.ERROR_CODE_OWS_COLLABORATOR_REQUEST # Verify the call was made mock_ows_client_get.assert_called_once_with( service.OWS_COLLABORATOR, '/terms-and-conditions', headers={ 'Orchard-Profile-Type': 'SettingsProfile', 'Orchard-Profile-Id': 12345, 'Orchard-Identity-Id': 'identity-123', }, params={'vendor_id': 7123}, ) @pytest.mark.parametrize( 'missing_field', [ 'latest_version', 'latest_template', 'agreed_version', 'agreed_date', ], ) @patch('account.models.ows_collaborator.g') @patch('account.models.ows_collaborator.ows_client.get') def test_get_vendor_terms_and_conditions_missing_field( mock_ows_client_get: MagicMock, mock_g: MagicMock, missing_field: str, app_context: AppContext, ) -> None: """Test handling of responses with missing required fields.""" # Setup response with missing field complete_data = { 'latest_version': 2, 'latest_template': 'Terms and Conditions Template v2.1', 'agreed_version': 2, 'agreed_date': '2023-01-15T10:30:00Z', } incomplete_data = {k: v for k, v in complete_data.items() if k != missing_field} mock_response = Response() mock_response.status_code = 200 mock_response.json = MagicMock(return_value=incomplete_data) mock_ows_client_get.return_value = mock_response # Setup mock request context mock_g.request_context.profile_type = 'SettingsProfile' mock_g.request_context.profile_id = 12345 mock_g.request_context.jwt_identity_id = 'identity-123' # Verify exception is raised with pytest.raises(ExceptionDictOwsResponse) as exc_info: ows_collaborator.get_vendor_terms_and_conditions(7123) # Verify exception details assert exc_info.value.status == 500 assert exc_info.value.code == error.ERROR_CODE_OWS_COLLABORATOR_REQUEST assert 'Invalid response schema' in exc_info.value.message assert missing_field in exc_info.value.message @pytest.mark.parametrize( 'invalid_data,expected_error', [ pytest.param( { 'latest_version': 'not_an_int', 'latest_template': 'Template', 'agreed_version': 1, 'agreed_date': '2023-01-15T10:30:00Z', }, 'Invalid response data types', id='invalid_latest_version_type', ), pytest.param( { 'latest_version': 2, 'latest_template': 'Template', 'agreed_version': 'not_an_int', 'agreed_date': '2023-01-15T10:30:00Z', }, 'Invalid response data types', id='invalid_agreed_version_type', ), ], ) @patch('account.models.ows_collaborator.g') @patch('account.models.ows_collaborator.ows_client.get') def test_get_vendor_terms_and_conditions_invalid_data_types( mock_ows_client_get: MagicMock, mock_g: MagicMock, invalid_data: dict, expected_error: str, app_context: AppContext, ) -> None: """Test handling of responses with invalid data types.""" mock_response = Response() mock_response.status_code = 200 mock_response.json = MagicMock(return_value=invalid_data) mock_ows_client_get.return_value = mock_response # Setup mock request context mock_g.request_context.profile_type = 'SettingsProfile' mock_g.request_context.profile_id = 12345 mock_g.request_context.jwt_identity_id = 'identity-123' # Verify exception is raised with pytest.raises(ExceptionDictOwsResponse) as exc_info: ows_collaborator.get_vendor_terms_and_conditions(7123) # Verify exception details assert exc_info.value.status == 500 assert exc_info.value.code == error.ERROR_CODE_OWS_COLLABORATOR_REQUEST assert expected_error in exc_info.value.message