"""Tests for POST /abacus-statement-period/dataloader endpoint.""" import http import json from oto import status import pytest from tests.testutils import db @db.test_schema_default_seed def test_abacus_statement_period_dataloader_success(test_client): """Test successfully calling the dataloader endpoint with valid IDs.""" data = {"abacus_statement_period_ids": [99]} result = test_client.post( "/abacus-statement-period/dataloader", data=json.dumps(data), content_type="application/json", ) assert result.status_code == http.HTTPStatus.OK result_data = json.loads(result.data.decode()) assert result_data == [ { "data": { "abacus_statement_period_id": 99, "report_run_id": 5, "payment_fees_transactions_count": None, "payment_fees_transactions_sum": None, "wht_allocation_transactions_count": None, "wht_allocation_transactions_sum": None, "direct_payment_transactions_count": None, "direct_payment_transactions_sum": None, "direct_payment_transactions_collaborators_count": None, "direct_payment_transactions_vendors_count": None, "payment_approvals_count": None, "payment_approvals_sum": None, } } ] @db.test_schema_default_seed def test_abacus_statement_period_dataloader_not_found(test_client): """Test requesting IDs that don't exist returns null data.""" data = {"abacus_statement_period_ids": [100]} result = test_client.post( "/abacus-statement-period/dataloader", data=json.dumps(data), content_type="application/json", ) assert result.status_code == http.HTTPStatus.OK result_data = json.loads(result.data.decode()) assert result_data == [ { "data": { "abacus_statement_period_id": 100, "report_run_id": None, "payment_fees_transactions_count": None, "payment_fees_transactions_sum": None, "wht_allocation_transactions_count": None, "wht_allocation_transactions_sum": None, "direct_payment_transactions_count": None, "direct_payment_transactions_sum": None, "direct_payment_transactions_collaborators_count": None, "direct_payment_transactions_vendors_count": None, "payment_approvals_count": None, "payment_approvals_sum": None, } } ] @db.test_schema_default_seed def test_abacus_statement_period_dataloader_with_dp_payments(test_client): """Test dataloader returns payment_approvals aggregations when dp_payment rows exist.""" data = {"abacus_statement_period_ids": [1]} result = test_client.post( "/abacus-statement-period/dataloader", data=json.dumps(data), content_type="application/json", ) assert result.status_code == http.HTTPStatus.OK result_data = json.loads(result.data.decode()) assert result_data == [ { "data": { "abacus_statement_period_id": 1, "report_run_id": None, "payment_fees_transactions_count": None, "payment_fees_transactions_sum": None, "wht_allocation_transactions_count": None, "wht_allocation_transactions_sum": None, "direct_payment_transactions_count": 1, "direct_payment_transactions_sum": "-75.000000", "direct_payment_transactions_collaborators_count": 1, "direct_payment_transactions_vendors_count": 1, "payment_approvals_count": 3, "payment_approvals_sum": "7001.000000", } } ] @pytest.mark.parametrize( "data", [ {}, # Missing parameter {"abacus_statement_period_ids": None}, # Null value {"abacus_statement_period_ids": "not_a_list"}, # Wrong type {"abacus_statement_period_ids": [1, "not_an_int", 3]}, # Invalid list item type {"abacus_statement_period_ids": [1, 2, None, 4]}, # Null in list ], ) def test_abacus_statement_period_dataloader_invalid_request(data, test_client): """Test calling the dataloader endpoint with invalid request data.""" result = test_client.post( "/abacus-statement-period/dataloader", data=json.dumps(data), content_type="application/json", ) assert result.status_code == status.BAD_REQUEST