Fix invoice deletion integration tests and update documentation

Integration test fixes:
- Replace hardcoded status strings with proper CryptoPayment constants
- Fixed test_complete_refund_states_delete_invoice to use:
  - STATUS_LATEPAY_REFUNDED_COMPLETE
  - STATUS_UNDERPAID_REFUNDED_COMPLETE
  - STATUS_OUT_OF_STOCK_REFUNDED_COMPLETE
- Fixed test_no_refund_payment_deletes_invoice to use STATUS_LATEPAY_NOT_REFUNDED
- Updated all other status references to use constants instead of strings

The integration tests were failing because they used hardcoded strings like
"expired-refunded-complete" instead of the actual status constants from the model.
This caused the should_keep_invoice() logic to not work properly since the
status matching failed.

Documentation updates:
- Corrected "received" state description: detected in mempool (not blockchain)
- Added clarification about confirmations tracking via current_confirmations field
- Updated mempool detection rule explanation

All 11 invoice deletion integration tests now pass, confirming the invoice
deletion logic works correctly with real database operations.
This commit is contained in:
Russell Ballestrini 2025-09-30 16:14:28 -04:00
parent 6ceb9375de
commit c255419f99

View file

@ -110,7 +110,7 @@ class InvoiceDeletionIntegrationTests(DatabaseIntegrationTests):
def test_expired_payment_deletes_invoice(self):
"""Test that expired payments have their invoices deleted."""
payment, invoice = self.create_crypto_payment_with_invoice("expired")
payment, invoice = self.create_crypto_payment_with_invoice(CryptoPayment.STATUS_EXPIRED)
invoice_id = invoice.id
payment_id = payment.id
@ -139,7 +139,7 @@ class InvoiceDeletionIntegrationTests(DatabaseIntegrationTests):
def test_cancelled_payment_deletes_invoice(self):
"""Test that cancelled payments have their invoices deleted."""
payment, invoice = self.create_crypto_payment_with_invoice("cancelled")
payment, invoice = self.create_crypto_payment_with_invoice(CryptoPayment.STATUS_CANCELLED)
invoice_id = invoice.id
@ -153,7 +153,7 @@ class InvoiceDeletionIntegrationTests(DatabaseIntegrationTests):
def test_no_refund_payment_deletes_invoice(self):
"""Test that no-refund payments have their invoices deleted."""
payment, invoice = self.create_crypto_payment_with_invoice("no-refund")
payment, invoice = self.create_crypto_payment_with_invoice(CryptoPayment.STATUS_LATEPAY_NOT_REFUNDED)
invoice_id = invoice.id
@ -168,9 +168,9 @@ class InvoiceDeletionIntegrationTests(DatabaseIntegrationTests):
def test_complete_refund_states_delete_invoice(self):
"""Test that all complete refund states delete invoices."""
complete_refund_states = [
"expired-refunded-complete",
"underpaid-refunded-complete",
"out-of-stock-refunded-complete",
CryptoPayment.STATUS_LATEPAY_REFUNDED_COMPLETE,
CryptoPayment.STATUS_UNDERPAID_REFUNDED_COMPLETE,
CryptoPayment.STATUS_OUT_OF_STOCK_REFUNDED_COMPLETE,
]
for status in complete_refund_states:
@ -189,7 +189,7 @@ class InvoiceDeletionIntegrationTests(DatabaseIntegrationTests):
def test_confirmed_payment_keeps_invoice(self):
"""Test that confirmed payments keep their invoices."""
payment, invoice = self.create_crypto_payment_with_invoice("confirmed")
payment, invoice = self.create_crypto_payment_with_invoice(CryptoPayment.STATUS_CONFIRMED)
invoice_id = invoice.id
payment_id = payment.id
@ -211,7 +211,7 @@ class InvoiceDeletionIntegrationTests(DatabaseIntegrationTests):
def test_confirmed_overpaid_payment_keeps_invoice(self):
"""Test that confirmed-overpaid payments keep their invoices."""
payment, invoice = self.create_crypto_payment_with_invoice("confirmed-overpaid")
payment, invoice = self.create_crypto_payment_with_invoice(CryptoPayment.STATUS_CONFIRMED_OVERPAY)
invoice_id = invoice.id
@ -226,7 +226,7 @@ class InvoiceDeletionIntegrationTests(DatabaseIntegrationTests):
def test_confirmed_overpaid_refunded_payment_keeps_invoice(self):
"""Test that confirmed-overpaid-refunded payments keep their invoices."""
payment, invoice = self.create_crypto_payment_with_invoice(
"confirmed-overpaid-refunded"
CryptoPayment.STATUS_CONFIRMED_OVERPAY_REFUNDED
)
invoice_id = invoice.id
@ -272,7 +272,7 @@ class InvoiceDeletionIntegrationTests(DatabaseIntegrationTests):
quote_expires_at_ms=int((time.time() + 900) * 1000),
confirmations_required=10,
)
payment.status = "expired"
payment.status = CryptoPayment.STATUS_EXPIRED
self.dbsession.add(payment)
self.dbsession.flush()
@ -296,7 +296,7 @@ class InvoiceDeletionIntegrationTests(DatabaseIntegrationTests):
def test_state_transition_triggers_invoice_deletion(self):
"""Test that changing payment state to terminal triggers invoice deletion."""
payment, invoice = self.create_crypto_payment_with_invoice("pending")
payment, invoice = self.create_crypto_payment_with_invoice(CryptoPayment.STATUS_PENDING)
invoice_id = invoice.id
@ -361,7 +361,7 @@ class InvoiceDeletionIntegrationTests(DatabaseIntegrationTests):
quote_expires_at_ms=int((time.time() + 900) * 1000),
confirmations_required=10,
)
payment1.status = "cancelled"
payment1.status = CryptoPayment.STATUS_CANCELLED
payment2 = CryptoPayment(
invoice=invoice,
@ -376,7 +376,7 @@ class InvoiceDeletionIntegrationTests(DatabaseIntegrationTests):
quote_expires_at_ms=int((time.time() + 900) * 1000),
confirmations_required=10,
)
payment2.status = "pending"
payment2.status = CryptoPayment.STATUS_PENDING
self.dbsession.add(payment1)
self.dbsession.add(payment2)