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"