fix: reconcile Huihui payment callbacks after provider confirmation
This commit is contained in:
@@ -3,13 +3,14 @@ import hmac
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
from datetime import datetime, timedelta
|
||||
from unittest.mock import patch
|
||||
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from database import SessionLocal
|
||||
from main import app, seed
|
||||
from models import InvoiceApplication, PaymentRefund, TokenAccount, TokenPaymentOrder, TokenPlan, User
|
||||
from models import HuihuiOrgPaymentNotice, InvoiceApplication, PaymentRefund, TokenAccount, TokenPaymentOrder, TokenPlan, User
|
||||
from services.token_billing import DEFAULT_TOKEN_GRANT
|
||||
|
||||
|
||||
@@ -129,17 +130,42 @@ def test_huihui_org_callback_verifies_provider_before_granting_points(authorizat
|
||||
assert send(payload, signature=False, callback_path=legacy_path).status_code == 401
|
||||
assert send({**payload, "orderNo": "unknown"}, callback_path=legacy_path).status_code == 404
|
||||
assert send({**payload, "amountCents": 99}).status_code == 422
|
||||
assert send(payload).status_code == 409
|
||||
pending = send(payload, callback_path=legacy_path)
|
||||
assert pending.status_code == 200
|
||||
assert pending.json()["data"] == {"received": True, "paid": False, "awaitingProvider": True}
|
||||
db = SessionLocal()
|
||||
try:
|
||||
assert db.get(HuihuiOrgPaymentNotice, order_no).status == "awaiting_provider"
|
||||
assert db.query(TokenPaymentOrder).filter(TokenPaymentOrder.order_no == order_no).one().status == "pending"
|
||||
finally:
|
||||
db.close()
|
||||
provider.get_order.return_value = {**provider_data, "payStatus": 2}
|
||||
assert send({**payload, "paymentNo": "wrong"}).status_code == 422
|
||||
assert send({**payload, "paymentNo": "wrong"}).status_code == 409
|
||||
provider.get_order.return_value = {**provider_data, "payStatus": 2, "chargeAmount": 2}
|
||||
assert send(payload).status_code == 422
|
||||
provider.get_order.return_value = {**provider_data, "payStatus": 2}
|
||||
db = SessionLocal()
|
||||
try:
|
||||
notice = db.get(HuihuiOrgPaymentNotice, order_no)
|
||||
notice.next_check_at = datetime.utcnow() - timedelta(seconds=1)
|
||||
db.commit()
|
||||
from routers.tokens import reconcile_huihui_org_notices
|
||||
provider.get_order.return_value = provider_data
|
||||
assert reconcile_huihui_org_notices(db) == 0
|
||||
assert db.get(HuihuiOrgPaymentNotice, order_no).attempts == 2
|
||||
assert db.query(TokenPaymentOrder).filter(TokenPaymentOrder.order_no == order_no).one().status == "pending"
|
||||
notice.next_check_at = datetime.utcnow() - timedelta(seconds=1)
|
||||
db.commit()
|
||||
provider.get_order.return_value = {**provider_data, "payStatus": 2}
|
||||
assert reconcile_huihui_org_notices(db) == 1
|
||||
assert db.get(HuihuiOrgPaymentNotice, order_no).status == "confirmed"
|
||||
finally:
|
||||
db.close()
|
||||
first = send(payload, callback_path=legacy_path)
|
||||
second = send(payload)
|
||||
|
||||
assert first.status_code == 200
|
||||
assert first.json()["data"] == {"received": True, "paid": True}
|
||||
assert first.json()["data"] == {"received": True, "duplicate": True}
|
||||
assert second.json()["data"] == {"received": True, "duplicate": True}
|
||||
db = SessionLocal()
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user