"""Integration tests for contract advances endpoints.""" import pytest import requests from abacus_contract.constants import constants from abacus_contract.tests.integration.conftest import ows_abacus_contract_api_client from abacus_contract.tests.integration.consts.api import QA_BASE_URL from abacus_contract.tests.integration.consts.constants import TEST_ACCOUNT_ID from abacus_contract.tests.integration.utils import generic_helper @pytest.mark.jira('ACC-4678', 'ACC-4683', 'ACC-4688') def test_post_get_put_delete_advances( basic_headers, create_account_fixture, create_contract_fixture, create_account_contract_fixture, create_account_tax_info_fixture, ): """Check advances CRD endpoints.""" ows_abacus_contract_client = ows_abacus_contract_api_client(basic_headers) # defined in fixtures in conftest.py contract_id = 1 advance = { 'advance_description': 'testing one two three', 'amount': '124.00', 'currency_code': 'GBP', 'milestone': 'contract_execution', 'milestone_description': 'words', 'milestone_date': '2022-09-16', 'advance_status': constants.ADVANCE_STATUSES.QUALIFIED, 'reference_payment_type_id': 2, 'vat_amount': '15', 'withholding_tax_amount': '-10', } res_post = ows_abacus_contract_client.post_contract_advance(contract_id, advance) assert res_post.status_code == 201 assert res_post.json()['milestone_date'] == advance['milestone_date'] assert res_post.json()['currency_code'] == advance['currency_code'] assert res_post.json()['milestone'] == advance['milestone'] assert res_post.json()['milestone_description'] == advance['milestone_description'] assert res_post.json()['advance_status'] == advance['advance_status'] assert res_post.json()['advance_description'] == advance['advance_description'] assert res_post.json()['amount'] == advance['amount'] assert ( res_post.json()['reference_payment_type_id'] == advance['reference_payment_type_id'] ) assert 'contract_id' in res_post.json() assert 'contract_advance_id' in res_post.json() contract_advance_id = res_post.json()['contract_advance_id'] res_get = ows_abacus_contract_client.get_contract_advances_by_id( contract_advance_id ) assert res_get.status_code == 200 assert res_post.json()['milestone_date'] == advance['milestone_date'] assert res_post.json()['currency_code'] == advance['currency_code'] assert res_post.json()['milestone'] == advance['milestone'] assert res_post.json()['milestone_description'] == advance['milestone_description'] assert res_post.json()['advance_status'] == advance['advance_status'] assert res_post.json()['advance_description'] == advance['advance_description'] assert res_post.json()['amount'] == advance['amount'] assert 'contract_id' in res_post.json() assert 'contract_advance_id' in res_post.json() res_get = ows_abacus_contract_client.get_contract_advances(contract_id, 'pending') assert res_get.status_code == 200 res_body = res_get.json()['items'][0] assert res_body['milestone_date'] == advance['milestone_date'] assert res_body['currency_code'] == advance['currency_code'] assert res_body['milestone'] == advance['milestone'] assert res_body['milestone_description'] == advance['milestone_description'] assert res_body['advance_status'] == advance['advance_status'] assert res_body['advance_description'] == advance['advance_description'] assert res_body['amount'] == advance['amount'] put_body = { 'advance_description': 'updated description', 'amount': '124.00', 'currency_code': 'GBP', 'milestone': 'contract_execution', 'milestone_description': 'words', 'milestone_date': '2022-09-16', 'advance_status': constants.ADVANCE_STATUSES.QUALIFIED, } res_put = ows_abacus_contract_client.put_contract_advance( contract_advance_id, put_body ) assert res_put.status_code == 200 res_get = ows_abacus_contract_client.get_contract_advances_by_id( contract_advance_id ) assert res_get.status_code == 200 assert res_get.json()['advance_description'] == put_body['advance_description'] res_delete = ows_abacus_contract_client.delete_contract_advances( contract_advance_id ) assert res_delete.status_code == 204 res_get = ows_abacus_contract_client.get_contract_advances_by_id( contract_advance_id ) assert res_get.status_code == 200 assert res_get.json()['advance_status'] == constants.ADVANCE_STATUSES.DELETED @pytest.mark.jira('ACC-4686') def test_get_paid_advances( basic_headers, create_account_fixture, create_contract_fixture, create_account_contract_fixture, create_account_tax_info_fixture, create_abacus_event_fixture, create_paid_contract_advance_fixture, create_ledger_contract_advance_applied_fixture, ): """GET paid advances.""" ows_abacus_contract_client = ows_abacus_contract_api_client(basic_headers) # defined in fixtures in conftest.py contract_id = 1 res_get = ows_abacus_contract_client.get_contract_advances( contract_id, constants.ADVANCE_STATUSES.PAID ) assert res_get.status_code == 200 assert len(res_get.json()['items']) == 1 @pytest.mark.jira('PLATFORM-4469') def test_get_contract_advances( auth_headers: dict[str, str], admin_headers: dict[str, str], ) -> None: """GET /contract//advances/status with authorized user.""" # create an account and contract. contract_id, _, _ = generic_helper.create_account_and_contract( account_id=TEST_ACCOUNT_ID ) # create an advance using the admin headers. advance = { 'advance_description': 'testing one two three', 'amount': '124.00', 'currency_code': 'GBP', 'milestone': 'contract_execution', 'milestone_description': 'words', 'milestone_date': '2022-09-16', 'advance_status': constants.ADVANCE_STATUSES.QUALIFIED, 'reference_payment_type_id': 2, 'vat_amount': '15', 'withholding_tax_amount': '-10', } endpoint = '{}/contract/{}/advance/'.format(QA_BASE_URL, contract_id) requests.post(endpoint, headers=admin_headers, json=advance) # get the advance using the auth headers. endpoint = '{}/contract/{}/advances/{}'.format( QA_BASE_URL, contract_id, constants.ADVANCE_STATUSES.QUALIFIED ) res = requests.get(endpoint, headers=admin_headers) assert res.status_code == 200 assert len(res.json()['items']) == 1 # get the advance using a different status. endpoint = '{}/contract/{}/advances/{}'.format( QA_BASE_URL, contract_id, constants.ADVANCE_STATUSES.PAID ) result = requests.get(endpoint, headers=admin_headers) assert result.status_code == 200 assert len(result.json()['items']) == 0 @pytest.mark.jira('PLATFORM-4469') def test_get_contract_advances_unauthorized( unauthorized_headers: dict[str, str], ) -> None: """GET /contract//advances/status with unauthorized user.""" contract_id, _, _ = generic_helper.create_account_and_contract( account_id=TEST_ACCOUNT_ID ) ows_abacus_contract_client = ows_abacus_contract_api_client(unauthorized_headers) res = ows_abacus_contract_client.get_contract_advances( contract_id=contract_id, advance_status=constants.ADVANCE_STATUSES.PAID ) assert res.status_code == 403 assert res.json()['message'] == 'User is forbidden'