//go:build cgo package auth import ( "bytes" "encoding/json" "net/http" "net/http/httptest" "testing" "skeleton/config" "skeleton/database" "skeleton/middlewares" "skeleton/models" "github.com/gin-gonic/gin" "go.uber.org/zap" ) func TestBusinessErrorsUseHTTP200(t *testing.T) { cfg := config.DatabaseConfig{Driver: "sqlite", DSN: ":memory:", MaxIdleConns: 1, MaxOpenConns: 1} if err := database.Init(&cfg, zap.NewNop()); err != nil { t.Fatal(err) } t.Cleanup(func() { _ = database.Close() }) if err := database.GetDB().AutoMigrate(&models.User{}); err != nil { t.Fatal(err) } middlewares.InitJWT("test-secret", 15, 24, "test") gin.SetMode(gin.TestMode) controller := NewController() router := gin.New() router.POST("/register", controller.Register) router.POST("/login", controller.Login) assertBusinessResponse(t, router, "/register", `{"username":"x","password":"short"}`, 400) assertBusinessResponse(t, router, "/register", `{"username":"demo","password":"change-me-123"}`, 200) assertBusinessResponse(t, router, "/login", `{"username":"demo","password":"wrong-password"}`, 401) } func assertBusinessResponse(t *testing.T, handler http.Handler, path, body string, wantCode int) { t.Helper() request := httptest.NewRequest(http.MethodPost, path, bytes.NewBufferString(body)) request.Header.Set("Content-Type", "application/json") recorder := httptest.NewRecorder() handler.ServeHTTP(recorder, request) if recorder.Code != http.StatusOK { t.Fatalf("HTTP status = %d, want 200; body=%s", recorder.Code, recorder.Body.String()) } var response struct { Code int `json:"code"` } if err := json.Unmarshal(recorder.Body.Bytes(), &response); err != nil { t.Fatal(err) } if response.Code != wantCode { t.Fatalf("business code = %d, want %d; body=%s", response.Code, wantCode, recorder.Body.String()) } }