"""Unit tests for transaction handlers.""" import json from unittest.mock import patch import pytest from collaborator.utils import handlers @pytest.fixture(autouse=True) def _mock_auth(mocker): """Mock authorization for every test.""" mocker.patch.object(handlers, "_verify_profile_headers") @patch( "collaborator.handlers.transaction.transaction.transactions_participation_dataloader" ) def test_transactions_participation_dataloader(mock_logic, auth_client): """Test POST /transactions/participation-dataloader returns dataloader response.""" mock_logic.return_value = [ {"data": {"transactions": [], "total_count": 0}}, {"data": {"transactions": [{"id": 1}], "total_count": 1}}, ] request_body = { "participations": [ {"collaborator_id": 1, "statement_period_id": 10}, {"collaborator_id": 2, "statement_period_id": 20}, ] } result = auth_client.post( "/transactions/participation-dataloader", data=json.dumps(request_body), content_type="application/json", ) assert result.status_code == 200 assert mock_logic.call_count == 1 call_args = mock_logic.call_args participations = call_args[0][0] assert len(participations) == 2 assert participations[0].collaborator_id == 1 assert participations[0].statement_period_id == 10 assert participations[1].collaborator_id == 2 assert participations[1].statement_period_id == 20 @patch( "collaborator.handlers.transaction.transaction.transactions_participation_dataloader" ) def test_transactions_participation_dataloader_invalid_body(mock_logic, auth_client): """Test POST /transactions/participation-dataloader with invalid body returns 422.""" result = auth_client.post( "/transactions/participation-dataloader", data=json.dumps({"participations": [{"collaborator_id": "not_an_int"}]}), content_type="application/json", ) assert result.status_code == 400 mock_logic.assert_not_called() @patch( "collaborator.handlers.transaction.transaction.transactions_participation_dataloader" ) def test_transactions_participation_dataloader_missing_body(mock_logic, auth_client): """Test POST /transactions/participation-dataloader with missing body returns 400.""" result = auth_client.post( "/transactions/participation-dataloader", data=json.dumps({}), content_type="application/json", ) assert result.status_code == 400 mock_logic.assert_not_called() @patch( "collaborator.handlers.transaction.transaction.transactions_participation_dataloader" ) def test_transactions_participation_dataloader_with_pagination(mock_logic, auth_client): """Test POST /transactions/participation-dataloader forwards limit and offset.""" mock_logic.return_value = [ {"data": {"transactions": [{"id": 1}], "total_count": 3}} ] request_body = { "participations": [ {"collaborator_id": 1, "statement_period_id": 10, "limit": 10, "offset": 0}, ] } result = auth_client.post( "/transactions/participation-dataloader", data=json.dumps(request_body), content_type="application/json", ) assert result.status_code == 200 call_args = mock_logic.call_args participations = call_args[0][0] assert participations[0].limit == 10 assert participations[0].offset == 0