"""Functional tests for accounting runs.""" from moto import mock_aws from royalties.constants.constants import ACCOUNTING_RUN_STATUSES as STATUSES from royalties.tests.utils.factories import ( AccountingRunFactory, RunControllerContractFactory, RunControllerFactory, ) def test_accounting_run_complete_action(fixture_client): """Mark a run as complete and set a summary url on it.""" export_url = 's3://somewhere/some_file.csv' run = AccountingRunFactory(run_status=STATUSES.RUNNING) assert run.end_date is None resp = fixture_client.put( f'/accounting-run/{run.accounting_run_id}', json={ 'accounting_run_status': STATUSES.COMPLETE, 'summary_export_url': export_url, }, ) assert resp.status_code == 200 assert run.summary_export_url == export_url assert run.run_status == STATUSES.COMPLETE assert run.end_date is not None def test_accounting_run_error_action(fixture_client): """Mark a run as error.""" run = AccountingRunFactory(run_status=STATUSES.NO_ACTION_TAKEN) assert run.end_date is None resp = fixture_client.put( f'/accounting-run/{run.accounting_run_id}', json={'accounting_run_status': STATUSES.ERROR}, ) assert resp.status_code == 200 assert run.run_status == STATUSES.ERROR assert run.end_date is not None def test_accounting_run_invalid_action(fixture_client, remove_fks): """Invalidate an accounting run by updating the run status.""" accounting_run = AccountingRunFactory.create( run_status=STATUSES.COMPLETE, ) res = fixture_client.put( f'/accounting-run/{accounting_run.accounting_run_id}', json={'accounting_run_status': STATUSES.INVALID}, ) assert res.status_code == 200 body = res.json assert len(body) == 2 assert {run['accounting_run_status'] for run in body} == { STATUSES.INVALID, STATUSES.NO_ACTION_TAKEN, } invalidated_run = next( run for run in body if run['accounting_run_id'] == accounting_run.accounting_run_id ) assert invalidated_run['accounting_run_status'] == STATUSES.INVALID @mock_aws def test_get_accounting_run_download(fixture_client): """Get s3 link to download accounting run summary csv.""" accounting_run = AccountingRunFactory.create( summary_export_url='s3://sales-files/1-march-2020/output/run_summary.csv' ) run_id = accounting_run.accounting_run_id res = fixture_client.get(f'/accounting-run/{run_id}/summary/download') assert res.json['summary_url'].startswith('https://sales-files.s3.amazonaws.com/') def test_get_contract_ids_by_accounting_run_id(remove_fks, fixture_client): """Test getting contract ids by accounting run id.""" mock_run_controller_1 = RunControllerFactory.create() mock_run_controller_2 = RunControllerFactory.create() RunControllerContractFactory.create( run_controller=mock_run_controller_1, contract_id=1 ) RunControllerContractFactory.create( run_controller=mock_run_controller_2, contract_id=2 ) RunControllerContractFactory.create( run_controller=mock_run_controller_1, contract_id=3 ) mock_accounting_run = AccountingRunFactory.create( run_controller=mock_run_controller_1 ) resp = fixture_client.get( ( '/accounting-run/' f'{mock_accounting_run.accounting_run_id}/' 'run-controller/contracts' ) ) assert resp.json == [1, 3] def test_accounting_run_waiting_to_run_action(fixture_client): """Mark a run as waiting_to_run and set a start_date.""" run = AccountingRunFactory(run_status=STATUSES.NO_ACTION_TAKEN, start_date=None) resp = fixture_client.put( f'/accounting-run/{run.accounting_run_id}', json={'accounting_run_status': STATUSES.WAITING_TO_RUN}, ) assert resp.status_code == 200 assert run.start_date is not None assert run.run_status == STATUSES.WAITING_TO_RUN