"""Functional tests for the statement period vendor totals dataloader.""" import json import pytest from collaborator.models.ows import ows_abacus_account from tests.testutils import db, mock_auth @pytest.fixture(autouse=True) def _mock_vendor_currency(mocker): mocker.patch.object( ows_abacus_account, "get_abacus_account_metadata", return_value={"currency_code": "USD"}, ) @db.test_schema_default_seed def test_post_statement_period_totals_dataloader(auth_client, mocker): """Test totals dataloader returns one entry per requested ID, in order.""" mock_auth(mocker, 24601) requested_ids = [1, 2, 999999] result = auth_client.post( "/statement-period/totals-dataloader", data=json.dumps({"statement_period_ids": requested_ids}), content_type="application/json", ) assert result.status_code == 200 body = result.json # One response entry per requested ID, preserving request order. assert isinstance(body, list) assert len(body) == len(requested_ids) # Every entry is either a data or an error envelope. for entry in body: assert ("data" in entry) ^ ("error" in entry) # The unknown ID resolves to an empty data envelope. assert body[-1] == {"data": None} # Seeded IDs resolve to a data envelope carrying the totals fields. for entry, expected_id in zip(body[:-1], requested_ids[:-1], strict=True): assert entry["data"]["statement_period_id"] == expected_id assert set(entry["data"]) == { "statement_period_id", "revenues_total", "expenses_total", "payments_total", } @db.test_schema_default_seed def test_post_statement_period_totals_dataloader_bad_params(auth_client, mocker): """Test totals dataloader rejects a non-list body.""" mock_auth(mocker, 24601) result = auth_client.post( "/statement-period/totals-dataloader", data=json.dumps({"statement_period_ids": "not-a-list"}), content_type="application/json", ) assert result.status_code == 400