"""Test contract snapshot.""" from abacus_contract.constants.constants import CONTRACT_LIFECYCLE_STATUSES from abacus_contract.tests.utils.factories import ( AccountContractFactory, ContractFactory, ContractLifecycleFactory, ContractTermConditionFactory, ContractTermFactory, ) def test_contract_snapshot( fixture_client, create_mock_account, create_mock_account_payee, create_mock_account_payment_term, ): """Test contracts snapshotting.""" contracts = ContractFactory.create_batch(3, contract_type='distribution') for idx, contract in enumerate(contracts): ContractLifecycleFactory.create( contract=contract, lifecycle_status=CONTRACT_LIFECYCLE_STATUSES.ACTIVE ) account_id = 2 if idx > 0 else 1 AccountContractFactory.create(contract=contract, account_id=account_id) actual = fixture_client.post('contracts/snapshot', json=[]) rows = actual.data.decode().split('\n') assert len(rows) == 5 assert rows[4] == '' assert ( rows[0] == 'contract_id\taccount_id\tterm_start\tterm_end\tpayee_currency_code' ) pieces = rows[1].split('\t') assert pieces[0] == '1' actual = fixture_client.post('contracts/snapshot', json=[1]) rows = actual.data.decode().split('\n') assert len(rows) == 3 pieces = rows[1].split('\t') assert pieces[0] == '1' actual = fixture_client.post('contracts/snapshot', json=[1, 2]) rows = actual.data.decode().split('\n') assert len(rows) == 4 pieces = rows[2].split('\t') assert pieces[0] == '2' actual = fixture_client.post('contracts/snapshot', json=[1, 'a']) assert actual.status_code == 400 def test_contract_terms_snapshot(fixture_client, fresh_db): """Test contract terms snapshotting.""" contract_1 = ContractFactory.create(contract_id=1, contract_type='distribution') contract_term_1 = ContractTermFactory.create( contract_term_id=1, contract=contract_1, term_type='label', attachments=[1], attachments_relations=None, is_base_term=True, ) ContractTermConditionFactory.create( contract_term=contract_term_1, term_rate=10, priority=1 ) contract_term_2 = ContractTermFactory.create( contract_term_id=2, contract=contract_1, term_type='product', attachments=[1], attachments_relations=None, is_base_term=False, ) ContractTermConditionFactory.create( contract_term=contract_term_2, term_rate=22, priority=1 ) contract_term_3 = ContractTermFactory.create( contract_term_id=3, contract=contract_1, term_type='track', attachments=[1], attachments_relations=None, is_base_term=False, ) ContractTermConditionFactory.create( contract_term=contract_term_3, term_rate=25, priority=1 ) contract_term_4 = ContractTermFactory.create( contract_term_id=4, contract=contract_1, term_type='track', attachments=[1], attachments_relations=None, is_base_term=False, ) ContractTermConditionFactory.create( contract_term=contract_term_4, term_rate=30, priority=2 ) contract_2 = ContractFactory.create(contract_id=2, contract_type='distribution') contract_term_5 = ContractTermFactory.create( contract_term_id=5, contract=contract_2, term_type='label', attachments=[2], attachments_relations=None, is_base_term=True, ) ContractTermConditionFactory.create( contract_term=contract_term_5, term_rate=20, priority=1 ) contract_3 = ContractFactory.create(contract_id=3, contract_type='distribution') contract_term_6 = ContractTermFactory.create( contract_term_id=6, contract=contract_3, term_type='label', attachments=[3], attachments_relations=None, is_base_term=True, ) ContractTermConditionFactory.create( contract_term=contract_term_6, term_rate=30, priority=1 ) contract_term_7 = ContractTermFactory.create( contract_term_id=7, contract=contract_3, term_type='track', attachments=[3], attachments_relations=None, is_base_term=True, ) ContractTermConditionFactory.create( contract_term=contract_term_7, term_rate=25, priority=1 ) ContractTermConditionFactory.create( contract_term=contract_term_7, term_rate=20, priority=2 ) actual = fixture_client.post('contract-terms/snapshot', json=[]) rows = [row.split('\t') for row in actual.data.decode().split('\n')] assert rows == [ [ 'contract_id', 'contract_term_id', 'term_type', 'attachments', 'attachments_relations', 'is_base_term', 'contract_term_condition_id', 'conditions', 'term_rate', 'priority', ], [ '1', '1', 'label', '1', '{}', 'true', '1', '{"countries": ["USA"]}', '10.00', '1', ], [ '1', '2', 'product', '1', '{}', 'false', '2', '{"countries": ["USA"]}', '22.00', '1', ], [ '1', '3', 'track', '1', '{}', 'false', '3', '{"countries": ["USA"]}', '25.00', '1', ], [ '1', '4', 'track', '1', '{}', 'false', '4', '{"countries": ["USA"]}', '30.00', '2', ], [ '2', '5', 'label', '2', '{}', 'true', '5', '{"countries": ["USA"]}', '20.00', '1', ], [ '3', '6', 'label', '3', '{}', 'true', '6', '{"countries": ["USA"]}', '30.00', '1', ], [ '3', '7', 'track', '3', '{}', 'true', '7', '{"countries": ["USA"]}', '25.00', '1', ], [ '3', '7', 'track', '3', '{}', 'true', '8', '{"countries": ["USA"]}', '20.00', '2', ], [''], ] actual = fixture_client.post('contract-terms/snapshot', json=[1, 2]) rows = [row.split('\t') for row in actual.data.decode().split('\n')] assert rows == [ [ 'contract_id', 'contract_term_id', 'term_type', 'attachments', 'attachments_relations', 'is_base_term', 'contract_term_condition_id', 'conditions', 'term_rate', 'priority', ], [ '1', '1', 'label', '1', '{}', 'true', '1', '{"countries": ["USA"]}', '10.00', '1', ], [ '1', '2', 'product', '1', '{}', 'false', '2', '{"countries": ["USA"]}', '22.00', '1', ], [ '1', '3', 'track', '1', '{}', 'false', '3', '{"countries": ["USA"]}', '25.00', '1', ], [ '1', '4', 'track', '1', '{}', 'false', '4', '{"countries": ["USA"]}', '30.00', '2', ], [ '2', '5', 'label', '2', '{}', 'true', '5', '{"countries": ["USA"]}', '20.00', '1', ], [''], ] actual = fixture_client.post('contract-terms/snapshot', json=[1, 'a']) assert actual.status_code == 400