package recharge import ( "context" "testing" bizpayment "kra/internal/biz/payment" ) type repoStub struct { order *Order paidCall int } func (r *repoStub) Plans(context.Context) ([]*Plan, error) { return nil, nil } func (r *repoStub) SavePlans(context.Context, []*Plan) error { return nil } func (r *repoStub) List(context.Context, Filter, ListOptions) ([]*Order, int64, *Summary, error) { return nil, 0, &Summary{}, nil } func (r *repoStub) Get(context.Context, string) (*Order, error) { return r.order, nil } func (r *repoStub) Create(context.Context, uint, uint) (*Order, error) { return r.order, nil } func (r *repoStub) MarkPaid(context.Context, string) (*Order, error) { r.paidCall++ return r.order, nil } func newTestUsecase(t *testing.T, repo Repo) *Usecase { t.Helper() payments := bizpayment.NewPaymentUsecase(nil, nil, bizpayment.NewPaymentHooks(), bizpayment.NewPaymentOrderSourceRegistry(), bizpayment.NewPaymentFulfillmentRegistry(), nil) uc, err := NewUsecase(repo, payments) if err != nil { t.Fatal(err) } return uc } func TestPreparePaymentUsesRechargeOrderFacts(t *testing.T) { repo := &repoStub{order: &Order{OrderNo: "CZ-1", UserID: 7, Diamonds: 300, AmountCents: 3000}} uc := newTestUsecase(t, repo) intent, err := uc.PreparePayment(context.Background(), bizpayment.PaymentWechatV3, "CZ-1", "CZ-1") if err != nil { t.Fatal(err) } if intent.Amount != 3000 || intent.OriginalAmount != 3000 || intent.Currency != "CNY" || intent.Subject != "充值 300 钻石" { t.Fatalf("unexpected payment intent: %+v", intent) } if string(intent.Extra) != `{"diamonds":300,"userId":7}` { t.Fatalf("unexpected payment extra: %s", intent.Extra) } } func TestFulfillCreditsMatchingRechargeOnly(t *testing.T) { repo := &repoStub{order: &Order{OrderNo: "CZ-1", Diamonds: 60, AmountCents: 600}} uc := newTestUsecase(t, repo) err := uc.Fulfill(context.Background(), &bizpayment.PaymentConfirmation{ TradeNo: "CZ-1", BusinessType: BusinessType, BusinessID: "CZ-1", Amount: 600, Currency: "CNY", }) if err != nil { t.Fatal(err) } if repo.paidCall != 1 { t.Fatalf("paid calls = %d, want 1", repo.paidCall) } err = uc.Fulfill(context.Background(), &bizpayment.PaymentConfirmation{ TradeNo: "CZ-1", BusinessType: BusinessType, BusinessID: "CZ-1", Amount: 601, Currency: "CNY", }) if err == nil || repo.paidCall != 1 { t.Fatalf("mismatched payment was credited: err=%v calls=%d", err, repo.paidCall) } }