57 lines
2.0 KiB
Go
57 lines
2.0 KiB
Go
package database_test
|
|
|
|
import (
|
|
"database/sql"
|
|
"encoding/json"
|
|
"errors"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
omni "git.yuntuo.hk/k2safe/go-omni"
|
|
apierrors "git.yuntuo.hk/k2safe/go-omni/errors"
|
|
"git.yuntuo.hk/k2safe/go-omni/response"
|
|
)
|
|
|
|
func TestInTxPublicErrorCompatibility(t *testing.T) {
|
|
private := errors.New("private database details")
|
|
for _, scenario := range []string{"business", "businessAndRollback", "commit"} {
|
|
t.Run(scenario, func(t *testing.T) {
|
|
f := &txFixture{}
|
|
if scenario == "businessAndRollback" {
|
|
f.rollbackErr = private
|
|
} else if scenario == "commit" {
|
|
f.commitErr = private
|
|
}
|
|
pool := txPool(t, f)
|
|
app := omni.New(omni.WithResponse(response.Config{CodeType: "int32", SuccessCode: 0, ErrorCode: 9999, MessageField: "msg", DataMode: "always"}),
|
|
omni.WithErrors(apierrors.Catalog{DefaultStatus: 200, Definitions: map[string]apierrors.Definition{
|
|
"INVALID": {Code: 400002, Message: "{field} is invalid", Params: []apierrors.Parameter{{Name: "field", Type: "string"}}},
|
|
}}))
|
|
defer app.Close()
|
|
app.POST("/record", func(c *omni.Context) error {
|
|
return pool.InTx(c.Context(), nil, func(*sql.Tx) error {
|
|
if scenario == "commit" {
|
|
return nil
|
|
}
|
|
return apierrors.ByCode("INVALID").WithParams(map[string]any{"field": "name"}).WithCause(private)
|
|
})
|
|
})
|
|
w := httptest.NewRecorder()
|
|
app.ServeHTTP(w, httptest.NewRequest("POST", "/record", nil))
|
|
var body map[string]any
|
|
if err := json.Unmarshal(w.Body.Bytes(), &body); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
wantStatus, wantCode, wantMessage := 200, float64(400002), "name is invalid"
|
|
if scenario == "commit" {
|
|
wantStatus, wantCode, wantMessage = 500, 9999, "internal server error"
|
|
}
|
|
data, hasData := body["data"]
|
|
if w.Code != wantStatus || body["code"] != wantCode || body["msg"] != wantMessage || !hasData || data != nil || strings.Contains(w.Body.String(), "private") {
|
|
t.Fatal("transaction wrapper changed public error response:", w.Code, w.Body.String())
|
|
}
|
|
})
|
|
}
|
|
}
|