Files
pangolin/pay/internal/httpapi/handler_test.go
wangjia 7e7381b209 feat(pay): httpapi 加 CORS(web 跨域下单)+ 部署到 pangolin1 准备(#34/34A)
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>
2026-07-09 15:39:52 +08:00

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()
}