"""Tests for POST /reports endpoint.""" from datetime import datetime import json from unittest.mock import ANY import httpx from oto import status from owsclient.test import OwsClientMock from owsrequest.utils import mock_request import pytest from collaborator.logic import reports from tests.testutils import db, mock_auth EXCLUDE_TRANSACTION_TYPES = "RC,EH,PX,CC,CX,ER,RW,MA,MD,NC,PA,PV,PP,RR,RL,SL,TV,UP,UN" @db.test_schema_default_seed @pytest.mark.parametrize( "expected_data", [ { "items": [ { "id": 9, "report_run_id": 6, "collaborator_id": 1, "exclude_transaction_types": EXCLUDE_TRANSACTION_TYPES, "filename": ( "TestReport_Person_October2021_" f"{datetime.now().strftime('%Y%m%d')}" ), "file_location": None, "amount": None, "currency": "USD", "status": "REQUESTED", "requested_datetime": ANY, "generated_datetime": None, "transaction_id": None, "deleted_by": None, "deleted_datetime": None, "collaborator_dp_enabled": False, }, { "id": 10, "report_run_id": 6, "collaborator_id": 2, "exclude_transaction_types": EXCLUDE_TRANSACTION_TYPES, "filename": ( "TestReport_AnotherPerson_October2021_" f"{datetime.now().strftime('%Y%m%d')}" ), "file_location": None, "amount": None, "currency": "USD", "status": "REQUESTED", "requested_datetime": ANY, "generated_datetime": None, "transaction_id": None, "deleted_by": None, "deleted_datetime": None, "collaborator_dp_enabled": True, }, ] } ], ) def test_post_collaborator_reports( expected_data, auth_client, mocker, mock_account, ows_client_mock: OwsClientMock ): """Expect to create a list of collaborator reports.""" mock_auth(mocker, mock_account.id) data = { "client_email": "test@test.com", "first_period_id": "246", "last_period_id": "247", "period_name": "October 2021", "report_run_name": "Test Report", "vendor_id": mock_account.id, } ows_client_mock.get( "ows-moneyhub", f"/account/{mock_account.id}/statement-periods", ).mock( return_value=httpx.Response( status_code=status.OK, json=[ {"statement_period_id": 246, "currency_code": "USD"}, {"statement_period_id": 247, "currency_code": "USD"}, ], ) ) mock_request.get( "ows-users", "/users/identity/7ec441df-7b21-4a71-a9da", {"email": "myguy@sonymusic-pde.com", "number_format": "us"}, ) mock_send_bulk_report_trigger_message = mocker.patch.object( reports, "send_bulk_report_trigger_message" ) result = auth_client.post( "/reports", data=json.dumps(data), content_type="application/json" ) result_data = json.loads(result.data.decode()) assert result.status_code == status.CREATED assert result_data == expected_data mock_send_bulk_report_trigger_message.assert_called_once() @db.test_schema_default_seed def test_post_reports_missing_required_field(auth_client, mocker, mock_account): """Expect a 400 when a required body field is absent.""" mock_auth(mocker, mock_account.id) data = { "first_period_id": "246", "last_period_id": "247", "period_name": "October 2021", "vendor_id": mock_account.id, } result = auth_client.post( "/reports", data=json.dumps(data), content_type="application/json" ) assert result.status_code == status.BAD_REQUEST @db.test_schema_default_seed @pytest.mark.parametrize( "expected_data", [ { "items": [ { "id": 9, "report_run_id": 6, "collaborator_id": 1, "exclude_transaction_types": EXCLUDE_TRANSACTION_TYPES, "filename": ( "TestReport_Person_October2021_" f"{datetime.now().strftime('%Y%m%d')}" ), "file_location": None, "amount": None, "currency": "USD", "status": "REQUESTED", "requested_datetime": ANY, "generated_datetime": None, "transaction_id": None, "deleted_by": None, "deleted_datetime": None, "collaborator_dp_enabled": False, } ] } ], ) def test_post_collaborator_reports_with_collaborator_id( expected_data, auth_client, mocker, mock_account, ows_client_mock: OwsClientMock ): """Expect to create a list of collaborator reports.""" mock_auth(mocker, mock_account.id) data = { "client_email": "test@test.com", "first_period_id": "246", "last_period_id": "247", "period_name": "October 2021", "report_run_name": "Test Report", "vendor_id": mock_account.id, "collaborator_ids": [1], } ows_client_mock.get( "ows-moneyhub", f"/account/{mock_account.id}/statement-periods", ).mock( return_value=httpx.Response( status_code=status.OK, json=[ {"statement_period_id": 246, "currency_code": "USD"}, {"statement_period_id": 247, "currency_code": "USD"}, ], ) ) mock_request.get( "ows-users", "/users/identity/7ec441df-7b21-4a71-a9da", {"email": "myguy@sonymusic-pde.com", "number_format": "us"}, ) mock_send_bulk_report_trigger_message = mocker.patch.object( reports, "send_bulk_report_trigger_message" ) result = auth_client.post( "/reports", data=json.dumps(data), content_type="application/json" ) result_data = json.loads(result.data.decode()) assert result.status_code == status.CREATED assert result_data == expected_data mock_send_bulk_report_trigger_message.assert_called_once()