from unittest.mock import call, MagicMock, patch from faker import Faker from flask import testing as flask_testing import pytest @patch('payment.blueprints.reference_payment_type.logic') def test_reference_payment_type_dataloader_success(mock_logic, fixture_client, faker): """ Test POST request success. Endpoint: /reference-payment-type/dataloader. """ mock_data = { 'items': [ { 'data': { 'reference_payment_type_id': 3, 'payment_type': 'advance', 'payment_service': 'service', 'is_internal': False, 'notes': None, }, }, { 'data': { 'reference_payment_type_id': 5, 'payment_type': 'other', 'payment_service': 'new service', 'is_internal': True, 'notes': 'note1', }, }, ] } mock_logic.dataload_by_ids.return_value = mock_data test_ids = faker.pylist(value_types=[int]) result = fixture_client.post('/reference-payment-type/dataloader', json=test_ids) assert result.status_code == 200, result.text assert result.json == mock_data assert mock_logic.dataload_by_ids.call_args_list == [call(test_ids)] @patch('payment.blueprints.reference_payment_type.logic') def test_reference_payment_type_dataloader_failure(mock_logic, fixture_client, faker): """ Test POST request failure. Endpoint: /reference-payment-type/dataloader. """ mock_logic.dataload_by_ids.return_value = [] test_ids = faker.pylist(value_types=[str]) res = fixture_client.post('/reference-payment-type/dataloader', json=test_ids) assert res.status_code == 400 assert not mock_logic.dataload_by_payment_account_ids.called @pytest.mark.parametrize( ['standalone_check_result', 'pdp_check_result', 'status_code'], [ pytest.param(True, None, 200, id='Standalone check pass'), pytest.param(False, False, 403, id='PDP check fail'), pytest.param(False, True, 200, id='PDP check pass'), ], ) @patch('payment.utils.authorization.authorize_resource') @patch('payment.utils.authorization.flask_request') @patch('payment.blueprints.reference_payment_type.logic') def test_reference_payment_type_dataloader_authorization( mock_logic: MagicMock, mock_flask_request: MagicMock, mock_authorize_resource: MagicMock, standalone_check_result: bool, pdp_check_result: bool | None, status_code: int, fixture_client: flask_testing.FlaskClient, faker: Faker, ): """ Test POST request success. Endpoint: /reference-payment-type/dataloader. """ mock_data = { 'items': [ { 'data': { 'reference_payment_type_id': 3, 'payment_type': 'advance', 'payment_service': 'service', 'is_internal': False, 'notes': None, }, }, { 'data': { 'reference_payment_type_id': 5, 'payment_type': 'other', 'payment_service': 'new service', 'is_internal': True, 'notes': 'note1', }, }, ] } mock_logic.dataload_by_ids.return_value = mock_data mock_flask_request.verify_rules_access_standalone.return_value = ( standalone_check_result ) mock_authorize_resource.return_value = pdp_check_result test_ids = faker.pylist(value_types=[int]) result = fixture_client.post('/reference-payment-type/dataloader', json=test_ids) mock_flask_request.verify_rules_access_standalone.assert_called_once() if result.status_code == 403: assert result.json == { 'code': 'authorization_error', 'message': 'Unauthorized', } assert mock_logic.dataload_by_ids.call_count == 0 else: assert result.status_code == status_code, result.text assert result.json == mock_data assert mock_logic.dataload_by_ids.call_args_list == [call(test_ids)] if not standalone_check_result: mock_authorize_resource.assert_called_once_with( action='view', resource_id='0', resource_type='reference_payment_type', )