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