fix: reconcile Huihui payment callbacks after provider confirmation
This commit is contained in:
@@ -53,12 +53,15 @@ def test_scheduler_uses_boxim_and_restart_safe_service(
|
||||
max_message_age_seconds=600,
|
||||
)
|
||||
|
||||
assert maintenance_scheduler.add_job.call_count == 2
|
||||
cleanup_call, close_orders_call = maintenance_scheduler.add_job.call_args_list
|
||||
assert maintenance_scheduler.add_job.call_count == 3
|
||||
cleanup_call, close_orders_call, reconcile_call = maintenance_scheduler.add_job.call_args_list
|
||||
assert cleanup_call.kwargs["id"] == "chat_attachment_cleanup"
|
||||
assert close_orders_call.args[0] is main.close_expired_pending_orders_job
|
||||
assert close_orders_call.kwargs["id"] == "close_expired_token_orders"
|
||||
assert close_orders_call.kwargs["trigger"].interval.total_seconds() == 60
|
||||
assert reconcile_call.args[0] is main.reconcile_huihui_org_notices_job
|
||||
assert reconcile_call.kwargs["id"] == "reconcile_huihui_org_notices"
|
||||
assert reconcile_call.kwargs["trigger"].interval.total_seconds() == 30
|
||||
maintenance_scheduler.start.assert_called_once_with()
|
||||
|
||||
assert scheduler.add_job.call_count == 2
|
||||
|
||||
@@ -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