"""Tests for the DpPaymentPersister class.""" from types import SimpleNamespace from unittest.mock import ANY from collaborator.models.rds.dp_payment import DpPayment from collaborator.models.rds.dp_payment_persister import DpPaymentPersister from collaborator.schemas.dp_payment import DpPaymentSchema from tests.testutils import db from tests.testutils.seed.dp_payment_seed import dp_payment_seed_data @db.test_schema_default_seed def test_get_by_filters(): """Test approving DP payments for a statement period.""" abacus_statement_period_id = 1 result = DpPaymentPersister.get_by_filters( abacus_statement_period_id=abacus_statement_period_id, ) period_1_seed_data = [ payment for payment in dp_payment_seed_data if payment["abacus_statement_period_id"] == abacus_statement_period_id ] total_amount = sum([payment["amount"] for payment in period_1_seed_data]) expected_rows = [] for payment in period_1_seed_data: expected_payment = DpPaymentSchema.parse(DpPayment(**payment)).dump() expected_payment["updated_date"] = ANY expected_rows.append((expected_payment, total_amount)) assert [ (DpPaymentSchema.parse(payment).dump(), total_amount) for payment, total_amount in result ] == expected_rows @db.test_schema_default_seed def test_get_by_filters_all_periods(): """Test fetching DP payments across all statement periods (no filter).""" result = DpPaymentPersister.get_by_filters() total_amount = sum([payment["amount"] for payment in dp_payment_seed_data]) expected_rows = [] for payment in dp_payment_seed_data: expected_payment = DpPaymentSchema.parse(DpPayment(**payment)).dump() expected_payment["updated_date"] = ANY expected_rows.append((expected_payment, total_amount)) assert [ (DpPaymentSchema.parse(payment).dump(), total_amount) for payment, total_amount in result ] == expected_rows @db.test_schema_default_seed def test_replace_by_abacus_statement_period_id(): """Test replacing DP payments for a statement period.""" abacus_statement_period_id = 1 payment = { "abacus_statement_period_id": abacus_statement_period_id, "abacus_statement_period_name": "Jan 2026", "collaborator_id": 1, "collaborator_name": "John Doe", "amount": 1500.00, "currency": "USD", "payee_id": 123, "payoneer_program_id": 100000, "payoneer_program_name": "Standard Program", "payoneer_client_reference_id": "c3d4e5f6-a7b8-4cde-aef0-234567890123", "account_id": 12345, "account_name": "Acme Music", "collaborator_transaction_id": None, "agreement_type": "Orch US", "payoneer_payment_id": "split:1:1", "payoneer_payment_status": None, } result = DpPaymentPersister.replace_by_abacus_statement_period_id( abacus_statement_period_id=abacus_statement_period_id, payments=[payment], ) assert [DpPaymentSchema.parse(row).dump() for row in result] == [ { **payment, "id": ANY, "created_date": ANY, "created_by": None, "approved_date": None, "approved_by": None, "updated_date": ANY, "updated_by": None, "latest_payoneer_event": None, "latest_payoneer_event_reason": None, } ] @db.test_schema_default_seed def test_approve_by_abacus_statement_period_id(): """Test approving DP payments for a statement period.""" abacus_statement_period_id = 1 user = SimpleNamespace(id="test-user") result = DpPaymentPersister.approve_by_abacus_statement_period_id( abacus_statement_period_id=abacus_statement_period_id, user=user, ) parsed_1 = DpPaymentSchema.parse(result[0]) parsed_2 = DpPaymentSchema.parse(result[1]) assert parsed_1.approved_date is not None assert parsed_2.approved_date is not None assert parsed_1.approved_by == user.id assert parsed_2.approved_by == user.id