7e7381b209
withCORS 中间件:仅白名单 origin(默认 pangolin.yanmeiai.com + pages.dev)返回 CORS 头、 OPTIONS 直接 204;New(svc, corsOrigins) + main 读 PAY_CORS_ORIGINS。为官网下单页跨域调 pay 铺路。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
65 lines
1.9 KiB
Go
65 lines
1.9 KiB
Go
package httpapi
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/wangjia/pangolin/pay/internal/pay"
|
|
"github.com/wangjia/pangolin/pay/internal/store"
|
|
)
|
|
|
|
const recvAddr = "TRecv00000000000000000000000000000A"
|
|
|
|
func TestCreateGetAndConflict(t *testing.T) {
|
|
st, _ := store.Open(":memory:")
|
|
t.Cleanup(func() { _ = st.Close() })
|
|
srv := httptest.NewServer(New(pay.New(st, pay.Config{ReceiveAddress: recvAddr}), "https://pangolin.yanmeiai.com"))
|
|
t.Cleanup(srv.Close)
|
|
|
|
body, _ := json.Marshal(map[string]any{"user_ref": "u1", "sku": "pro-year", "amount": 5_000000})
|
|
resp, err := http.Post(srv.URL+"/order", "application/json", bytes.NewReader(body))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if resp.StatusCode != http.StatusCreated {
|
|
t.Fatalf("create status %d", resp.StatusCode)
|
|
}
|
|
var created orderResp
|
|
_ = json.NewDecoder(resp.Body).Decode(&created)
|
|
_ = resp.Body.Close()
|
|
if created.Address != recvAddr || created.Status != "pending" {
|
|
t.Fatalf("create resp: %+v", created)
|
|
}
|
|
if created.ExpectAmount <= 5_000000 {
|
|
t.Fatalf("expect_amount %d should be base+unique tail", created.ExpectAmount)
|
|
}
|
|
|
|
r2, _ := http.Get(srv.URL + "/order/" + created.OrderNo)
|
|
if r2.StatusCode != http.StatusOK {
|
|
t.Fatalf("get status %d", r2.StatusCode)
|
|
}
|
|
_ = r2.Body.Close()
|
|
|
|
// Same user again -> 409 Conflict.
|
|
r3, _ := http.Post(srv.URL+"/order", "application/json", bytes.NewReader(body))
|
|
if r3.StatusCode != http.StatusConflict {
|
|
t.Fatalf("want 409 for second active order, got %d", r3.StatusCode)
|
|
}
|
|
_ = r3.Body.Close()
|
|
|
|
r4, _ := http.Get(srv.URL + "/order/NOPE")
|
|
if r4.StatusCode != http.StatusNotFound {
|
|
t.Fatalf("want 404, got %d", r4.StatusCode)
|
|
}
|
|
_ = r4.Body.Close()
|
|
|
|
r5, _ := http.Post(srv.URL+"/order", "application/json", bytes.NewReader([]byte(`{"user_ref":"u2","sku":"x","amount":0}`)))
|
|
if r5.StatusCode != http.StatusBadRequest {
|
|
t.Fatalf("want 400 for bad amount, got %d", r5.StatusCode)
|
|
}
|
|
_ = r5.Body.Close()
|
|
}
|