62 lines
2.8 KiB
Python
62 lines
2.8 KiB
Python
from uuid import uuid4
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
import app.main as main
|
|
from app import alipay_provider
|
|
|
|
|
|
def test_alipay_callback_reconciles_verified_success(monkeypatch):
|
|
monkeypatch.setattr(alipay_provider, "verify_notification", lambda params: params.get("sign") == "valid")
|
|
out_biz_no = f"RF{uuid4().hex[:20]}"
|
|
with TestClient(main.app) as client:
|
|
with main.SessionLocal() as db:
|
|
user = db.scalar(main.select(main.AdminUser).where(main.AdminUser.username == "operator"))
|
|
answer_user = main.AnswerUser(
|
|
public_id=f"U{uuid4().hex[:20]}", phone=f"1{uuid4().int % 10**10:010d}",
|
|
auth_token=uuid4().hex,
|
|
)
|
|
db.add(answer_user)
|
|
db.flush()
|
|
submission = main.AnswerSubmission(
|
|
submission_no=f"ANS{uuid4().hex[:20]}", user_id=answer_user.id,
|
|
owner_id=user.id, shop_name="回调测试店", status="已通过",
|
|
)
|
|
db.add(submission)
|
|
db.flush()
|
|
order = main.AlipayRefundOrder(
|
|
target_kind="answer_submission", target_id=submission.id,
|
|
out_biz_no=out_biz_no, amount_fen=300, account="buyer@example.com",
|
|
payee_name="测试收款人", created_by_id=user.id, owner_id=user.id,
|
|
order_no=submission.submission_no, shop_name=submission.shop_name,
|
|
operator_name=user.display_name, payer_account="公司账户", status="pending",
|
|
)
|
|
db.add(order)
|
|
db.commit()
|
|
order_id = order.id
|
|
submission_id = submission.id
|
|
response = client.post("/alipay_callback", data={
|
|
"sign": "valid", "out_biz_no": out_biz_no, "status": "SUCCESS",
|
|
"order_id": "ALI-CALLBACK-001",
|
|
})
|
|
assert response.status_code == 200
|
|
assert response.text == "success"
|
|
with main.SessionLocal() as db:
|
|
order = db.get(main.AlipayRefundOrder, order_id)
|
|
assert order.status == "success"
|
|
assert order.alipay_trade_no == "ALI-CALLBACK-001"
|
|
assert db.get(main.AnswerSubmission, submission_id).status == "已完成"
|
|
refund = db.scalar(main.select(main.RefundRecord).where(
|
|
main.RefundRecord.target_kind == "answer_submission",
|
|
main.RefundRecord.target_id == submission_id,
|
|
))
|
|
assert refund.alipay_trade_no == "ALI-CALLBACK-001"
|
|
|
|
|
|
def test_alipay_callback_rejects_invalid_signature(monkeypatch):
|
|
monkeypatch.setattr(alipay_provider, "verify_notification", lambda _params: False)
|
|
with TestClient(main.app) as client:
|
|
response = client.post("/alipay_callback", data={"sign": "bad", "out_biz_no": "RF-BAD"})
|
|
assert response.status_code == 400
|
|
assert response.text == "failure"
|