mirror of
https://github.com/hanzoai/status.git
synced 2026-10-30 18:21:48 +00:00
zip's registration is a verb method on the group, so a route that is not a typed operation says which method it answers with. The security package's own two-method router goes with it: it existed so both the app and a sub-router could satisfy one name, and restating a routing surface is what let the two disagree — the methods it named no longer exist. The app spells itself as a group, which registers at exactly the paths it did. The toolchain and the pin move together, because below zip v1.36.50 the JSON encoder was selected on a build tag: a repo whose go directive rises first writes a wire that is neither the old release's nor the new one's until the pin catches up. metrics_test.go still does not compile, before and after: it compares a metric registry against a gatherer from a different metrics library, so the two Gather signatures disagree. That is its own change. Co-authored-by: Hanzo Dev <[email protected]>
120 lines
2.9 KiB
Go
120 lines
2.9 KiB
Go
package api
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
fiber "github.com/zap-proto/fiber/v3"
|
|
"hanzo.ai/status/config"
|
|
"hanzo.ai/status/security"
|
|
)
|
|
|
|
func TestNew(t *testing.T) {
|
|
type Scenario struct {
|
|
Name string
|
|
Path string
|
|
ExpectedCode int
|
|
Gzip bool
|
|
WithSecurity bool
|
|
}
|
|
scenarios := []Scenario{
|
|
{
|
|
Name: "health",
|
|
Path: "/health",
|
|
ExpectedCode: fiber.StatusOK,
|
|
},
|
|
{
|
|
Name: "custom.css",
|
|
Path: "/css/custom.css",
|
|
ExpectedCode: fiber.StatusOK,
|
|
},
|
|
{
|
|
Name: "custom.css-gzipped",
|
|
Path: "/css/custom.css",
|
|
ExpectedCode: fiber.StatusOK,
|
|
Gzip: true,
|
|
},
|
|
{
|
|
Name: "metrics",
|
|
Path: "/metrics",
|
|
ExpectedCode: fiber.StatusOK,
|
|
},
|
|
{
|
|
Name: "favicon.ico",
|
|
Path: "/favicon.ico",
|
|
ExpectedCode: fiber.StatusOK,
|
|
},
|
|
{
|
|
Name: "apple-touch-icon",
|
|
Path: "/apple-touch-icon.png",
|
|
ExpectedCode: fiber.StatusOK,
|
|
},
|
|
{
|
|
Name: "manifest",
|
|
Path: "/manifest.json",
|
|
ExpectedCode: fiber.StatusOK,
|
|
},
|
|
{
|
|
Name: "index",
|
|
Path: "/",
|
|
ExpectedCode: fiber.StatusOK,
|
|
},
|
|
{
|
|
Name: "index-html-redirect",
|
|
Path: "/index.html",
|
|
ExpectedCode: fiber.StatusMovedPermanently,
|
|
},
|
|
{
|
|
Name: "index-should-return-200-even-if-not-authenticated",
|
|
Path: "/",
|
|
ExpectedCode: fiber.StatusOK,
|
|
WithSecurity: true,
|
|
},
|
|
{
|
|
Name: "endpoints-should-return-401-if-not-authenticated",
|
|
Path: "/v1/status/endpoints/statuses",
|
|
ExpectedCode: fiber.StatusUnauthorized,
|
|
WithSecurity: true,
|
|
},
|
|
{
|
|
Name: "config-should-return-200-even-if-not-authenticated",
|
|
Path: "/v1/status/config",
|
|
ExpectedCode: fiber.StatusOK,
|
|
WithSecurity: true,
|
|
},
|
|
{
|
|
Name: "config-should-always-return-200",
|
|
Path: "/v1/status/config",
|
|
ExpectedCode: fiber.StatusOK,
|
|
WithSecurity: false,
|
|
},
|
|
}
|
|
for _, scenario := range scenarios {
|
|
t.Run(scenario.Name, func(t *testing.T) {
|
|
cfg := &config.Config{Metrics: true, UI: newTestUIConfig()}
|
|
if scenario.WithSecurity {
|
|
cfg.Security = &security.Config{
|
|
Basic: &security.BasicConfig{
|
|
Username: "john.doe",
|
|
PasswordBcryptHashBase64Encoded: "JDJhJDA4JDFoRnpPY1hnaFl1OC9ISlFsa21VS09wOGlPU1ZOTDlHZG1qeTFvb3dIckRBUnlHUmNIRWlT",
|
|
},
|
|
}
|
|
}
|
|
api := New(cfg)
|
|
router := api.Router()
|
|
request := httptest.NewRequest("GET", scenario.Path, http.NoBody)
|
|
if scenario.Gzip {
|
|
request.Header.Set("Accept-Encoding", "gzip")
|
|
}
|
|
response, err := router.Fiber().Test(request)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if response.StatusCode != scenario.ExpectedCode {
|
|
t.Errorf("%s %s should have returned %d, but returned %d instead", request.Method, request.URL, scenario.ExpectedCode, response.StatusCode)
|
|
}
|
|
})
|
|
}
|
|
}
|