99 lines
2.8 KiB
Go
99 lines
2.8 KiB
Go
package httpx_test
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"git.asio.asia/nixevol/NixMsg/internal/httpx"
|
|
"git.asio.asia/nixevol/NixMsg/internal/listener"
|
|
"git.asio.asia/nixevol/NixMsg/internal/metrics"
|
|
)
|
|
|
|
func TestMetricsGateSharedPort(t *testing.T) {
|
|
reg := metrics.New()
|
|
okHandler := reg.Handler()
|
|
|
|
t.Run("empty token 404", func(t *testing.T) {
|
|
mux := listener.NewMux(listener.RoleShared, listener.Handlers{
|
|
Metrics: okHandler,
|
|
MetricsToken: "",
|
|
})
|
|
res := httptest.NewRecorder()
|
|
mux.ServeHTTP(res, httptest.NewRequest(http.MethodGet, "/metrics", nil))
|
|
if res.Code != http.StatusNotFound {
|
|
t.Fatalf("want 404 got %d", res.Code)
|
|
}
|
|
})
|
|
|
|
t.Run("wrong token 401", func(t *testing.T) {
|
|
mux := listener.NewMux(listener.RoleShared, listener.Handlers{
|
|
Metrics: okHandler,
|
|
MetricsToken: "secret-token",
|
|
})
|
|
req := httptest.NewRequest(http.MethodGet, "/metrics", nil)
|
|
req.Header.Set("Authorization", "Bearer wrong")
|
|
res := httptest.NewRecorder()
|
|
mux.ServeHTTP(res, req)
|
|
if res.Code != http.StatusUnauthorized {
|
|
t.Fatalf("want 401 got %d", res.Code)
|
|
}
|
|
})
|
|
|
|
t.Run("no auth 401", func(t *testing.T) {
|
|
mux := listener.NewMux(listener.RoleShared, listener.Handlers{
|
|
Metrics: okHandler,
|
|
MetricsToken: "secret-token",
|
|
})
|
|
res := httptest.NewRecorder()
|
|
mux.ServeHTTP(res, httptest.NewRequest(http.MethodGet, "/metrics", nil))
|
|
if res.Code != http.StatusUnauthorized {
|
|
t.Fatalf("want 401 got %d", res.Code)
|
|
}
|
|
})
|
|
|
|
t.Run("good token 200", func(t *testing.T) {
|
|
mux := listener.NewMux(listener.RoleShared, listener.Handlers{
|
|
Metrics: okHandler,
|
|
MetricsToken: "secret-token",
|
|
})
|
|
req := httptest.NewRequest(http.MethodGet, "/metrics", nil)
|
|
req.Header.Set("Authorization", "Bearer secret-token")
|
|
res := httptest.NewRecorder()
|
|
mux.ServeHTTP(res, req)
|
|
if res.Code != http.StatusOK {
|
|
t.Fatalf("want 200 got %d", res.Code)
|
|
}
|
|
body, _ := io.ReadAll(res.Body)
|
|
if len(body) == 0 {
|
|
t.Fatal("empty metrics body")
|
|
}
|
|
})
|
|
|
|
t.Run("admin role no auth", func(t *testing.T) {
|
|
mux := listener.NewMux(listener.RoleAdmin, listener.Handlers{
|
|
Metrics: okHandler,
|
|
})
|
|
res := httptest.NewRecorder()
|
|
mux.ServeHTTP(res, httptest.NewRequest(http.MethodGet, "/metrics", nil))
|
|
if res.Code != http.StatusOK {
|
|
t.Fatalf("admin metrics want 200 got %d", res.Code)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestMetricsGateDirect(t *testing.T) {
|
|
h := httpx.MetricsGate("tok", http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
|
|
w.WriteHeader(http.StatusOK)
|
|
_, _ = w.Write([]byte("ok"))
|
|
}))
|
|
res := httptest.NewRecorder()
|
|
req := httptest.NewRequest(http.MethodGet, "/metrics", nil)
|
|
req.Header.Set("Authorization", "Bearer tok")
|
|
h.ServeHTTP(res, req)
|
|
if res.Code != 200 || res.Body.String() != "ok" {
|
|
t.Fatalf("got %d %q", res.Code, res.Body.String())
|
|
}
|
|
}
|