package routers import ( "testing" "github.com/gin-gonic/gin" ) // 回归:接口的 **HTTP 方法与路径** 必须和前端调用一致。 // // 线上事故:一次模糊匹配的 patch 把 // // logs.POST("/histogram", ...) → logs.GET("/histogram", ...) // // 前端 logsApi.histogram 用的是 POST(body 里带 sourceId/query/start/end), // 于是所有直方图请求 404: // - 日志查询页:直方图不显示 // - 日志分析页:直接报 "API endpoint not found",整页不可用 // // 这类"方法写错"编译期完全查不出来,只能靠路由表断言。 func TestCriticalRoutes(t *testing.T) { gin.SetMode(gin.TestMode) engine := SetupRouter() // 期望的 method + path(注意 gin 会把 :param 保留为 :id) expect := []struct{ method, path string }{ // 日志查询 / 分析页的数据来源:必须是 POST(前端传 body) {"POST", "/api/v1/logs/histogram"}, {"POST", "/api/v1/logs/stats"}, {"POST", "/api/v1/logs/metrics"}, {"POST", "/api/v1/logs/query"}, {"POST", "/api/v1/logs/context"}, // 查询辅助接口:GET + query string {"GET", "/api/v1/logs/sources"}, {"GET", "/api/v1/logs/labels"}, {"GET", "/api/v1/logs/label/:name/values"}, {"GET", "/api/v1/logs/my-scope"}, {"GET", "/api/v1/logs/daily-volume"}, {"GET", "/api/v1/logs/health"}, // 告警 {"GET", "/api/v1/alerts/rules"}, {"POST", "/api/v1/alerts/rules"}, {"GET", "/api/v1/alerts/channels"}, {"POST", "/api/v1/alerts/check"}, {"GET", "/api/v1/alerts/deliveries"}, // 审计 / 自检 / 备份 {"GET", "/api/v1/audit-logs"}, {"GET", "/api/v1/system/self-check"}, {"GET", "/api/v1/system/backup"}, } registered := map[string]bool{} for _, route := range engine.Routes() { registered[route.Method+" "+route.Path] = true } for _, item := range expect { key := item.method + " " + item.path if !registered[key] { t.Errorf("缺少路由: %s(前端按这个方法和路径调用,缺了就是 404)", key) } } } // 回归:前端用 POST 的接口不能只有 GET 版本。 // 单独断言一次,避免以后又有人"顺手"把 POST 改成 GET。 func TestHistogramAcceptsPost(t *testing.T) { gin.SetMode(gin.TestMode) engine := SetupRouter() methods := map[string]bool{} for _, route := range engine.Routes() { if route.Path == "/api/v1/logs/histogram" { methods[route.Method] = true } } if !methods["POST"] { t.Fatal("POST /api/v1/logs/histogram 未注册:前端 logsApi.histogram 用 POST,会 404") } if !methods["GET"] { t.Fatal("GET /api/v1/logs/histogram 未注册:curl 调试入口丢了") } }