from datetime import UTC, datetime import unittest from govoplan_core.core.institutional import EvidenceReference from govoplan_core.core.payments import ( CAPABILITY_PAYMENT_REQUESTS, ManualPaymentReconciliationCommand, PaymentRequestCommand, payment_request_provider, ) class _Provider: def request_payment(self, session, command): return {"payment_id": "payment-1", "status": "requested"} def get_payment(self, session, *, tenant_id, payment_id): return {"payment_id": payment_id, "status": "requested"} def reconcile_manual_payment(self, session, command): return {"payment_id": command.payment_id, "status": "paid"} class _Registry: def __init__(self, provider): self.provider = provider def has_capability(self, name): return name == CAPABILITY_PAYMENT_REQUESTS def capability(self, name): return self.provider class PaymentsContractTests(unittest.TestCase): def test_provider_preserves_request_and_evidence_contracts(self): provider = payment_request_provider(_Registry(_Provider())) now = datetime(2026, 8, 19, tzinfo=UTC) requested = provider.request_payment( None, PaymentRequestCommand( tenant_id="tenant-1", source_module="cases", source_resource_type="case", source_resource_id="case-1", amount_minor=3000, currency="EUR", subject="Resident parking permit fee", idempotency_key="case-1-fee", requested_at=now, requested_by_ref="account:officer-1", ), ) paid = provider.reconcile_manual_payment( None, ManualPaymentReconciliationCommand( tenant_id="tenant-1", payment_id=str(requested["payment_id"]), amount_minor=3000, currency="EUR", transaction_reference="BANK-2026-1", evidence_ref=EvidenceReference( kind="document", owner_module="files", evidence_id="file-1", tenant_id="tenant-1", version="1", checksum="a" * 64, ), idempotency_key="bank-2026-1", received_at=now, recorded_at=now, recorded_by_ref="account:officer-1", ), ) self.assertEqual("paid", paid["status"]) def test_rejects_incomplete_provider(self): self.assertIsNone(payment_request_provider(_Registry(object()))) if __name__ == "__main__": unittest.main()