"""Functional tests for vendor_contract endpoints.""" from unittest.mock import patch from abacus_legacy_sync.constants import constants from abacus_legacy_sync.models import VendorContract from tests.utils.factories import ( CountryFactory, CurrenciesFactory, VendorContractFactory, ) @patch('abacus_legacy_sync.models.ows.carveouts_python.save_account_carveouts') def test_create_a_vendor_contract(mock_save, fixture_client): """Test new vendor contract creation.""" country = CountryFactory.create() currency = CurrenciesFactory.create() assert VendorContract.count() == 0 post_data = { 'vendor_id': 77, 'cont_start': '2022-01-01', 'cont_end': None, 'contract_type': constants.VENDOR_CONTRACT_CONTRACT_TYPES.VENDOR_TERM, 'release_term': 0, 'opt_out': 'N', 'is_automatic_rollover': 'Y', 'payment_interval': constants.VENDOR_CONTRACT_PAYMENT_INTERVALS.MONTH, 'pay_after': constants.VENDOR_CONTRACT_PAY_AFTER_INTERVALS.AFTER_30, 'digital_split': 0.75, 'currency_code': currency.ISO_4217_code, 'country_exclusion': [country.iso3166a3], } response = fixture_client.post('/vendor-contract', json=post_data) assert mock_save.call_count == 1 assert response.status_code == 201 assert VendorContract.count() == 1 assert response.json == { 'cont_start': '2022-01-01', 'vendor_id': 77, 'territory_carve_out': None, 'payment_interval': 'month', 'cont_end': None, 'contract_type': 'vendor_term', 'pay_after': '30', 'is_automatic_rollover': 'Y', 'digital_split': 0.75, 'currency_id': 1, 'vendor_contract_id': 1, 'release_term': 0, 'opt_out': 'N', } def test_create_a_vendor_contract_error(fixture_client): """Test to return error on invalid post data.""" currency = CurrenciesFactory.create() CountryFactory.create(iso3166a3='GBR') post_data = { 'vendor_id': 77, 'cont_start': '2022-01-01', 'cont_end': '2122-12-31', 'contract_type': constants.VENDOR_CONTRACT_CONTRACT_TYPES.VENDOR_TERM, 'release_term': 0, 'opt_out': 'N', 'is_automatic_rollover': 'Y', 'payment_interval': constants.VENDOR_CONTRACT_PAYMENT_INTERVALS.MONTH, 'pay_after': constants.VENDOR_CONTRACT_PAY_AFTER_INTERVALS.AFTER_30, 'digital_split': 0.75, 'currency_code': currency.ISO_4217_code, 'country_exclusion': ['USA', 'GBR', 'CAN'], } response = fixture_client.post('/vendor-contract', json=post_data) assert response.status_code == 400 assert ( response.json['message'] == 'Country(ies) not found by provided code(s): USA,CAN.' ) post_data['currency_code'] = 'WRONG' response = fixture_client.post('/vendor-contract', json=post_data) assert response.status_code == 400 assert response.json['message'] == 'Currency was not found by provided code: WRONG.' post_data['currency_code'] = currency.ISO_4217_code post_data['country_exclusion'] = ['GBR'] post_data['cont_end'] = '2021-12-31' response = fixture_client.post('/vendor-contract', json=post_data) assert response.status_code == 400 assert ( response.json['message'] == 'Contract end date should not be less than contract start date.' ) assert VendorContract.count() == 0 def test_update_vendor_contract_error(fixture_client): """Test vendor contract updation throws an error.""" vendor_contract = VendorContractFactory.create() put_data = {'store_exclusion': ['1']} response = fixture_client.put( f'/vendor-contract/{vendor_contract.vendor_contract_id}', json=put_data ) assert response.status_code == 400 assert response.json['message'] == { '_schema': ['distribution_type_id is required when store_exclusion is present.'] } # noqa: E501