From 89cf279f6d001ce1a8c7397349248b5622d3515a Mon Sep 17 00:00:00 2001 From: Gus Date: Tue, 9 Sep 2025 17:27:05 +0800 Subject: [PATCH] Fix ping handler tests and update env setup --- handler/ping_test.go | 14 +++++----- metal/kernel/kernel_test.go | 6 ++++- metal/kernel/router_ping_test.go | 46 +++++++------------------------- 3 files changed, 20 insertions(+), 46 deletions(-) diff --git a/handler/ping_test.go b/handler/ping_test.go index 2990d76d..cf2fe289 100644 --- a/handler/ping_test.go +++ b/handler/ping_test.go @@ -8,12 +8,13 @@ import ( "time" "github.com/oullin/handler/payload" + "github.com/oullin/metal/env" + "github.com/oullin/pkg/portal" ) func TestPingHandler(t *testing.T) { - t.Setenv("PING_USERNAME", "user") - t.Setenv("PING_PASSWORD", "pass") - h := MakePingHandler() + e := env.Ping{Username: "user", Password: "pass"} + h := MakePingHandler(&e) t.Run("valid credentials", func(t *testing.T) { req := httptest.NewRequest("GET", "/ping", nil) @@ -32,11 +33,8 @@ func TestPingHandler(t *testing.T) { if resp.Message != "pong" { t.Fatalf("unexpected message: %s", resp.Message) } - if _, err := time.Parse("2006-01-02", resp.Date); err != nil { - t.Fatalf("invalid date: %v", err) - } - if _, err := time.Parse("15:04:05", resp.Time); err != nil { - t.Fatalf("invalid time: %v", err) + if _, err := time.Parse(portal.DatesLayout, resp.DateTime); err != nil { + t.Fatalf("invalid datetime: %v", err) } }) diff --git a/metal/kernel/kernel_test.go b/metal/kernel/kernel_test.go index a2d48bd6..3d377a16 100644 --- a/metal/kernel/kernel_test.go +++ b/metal/kernel/kernel_test.go @@ -34,6 +34,8 @@ func validEnvVars(t *testing.T) { t.Setenv("ENV_SENTRY_DSN", "dsn") t.Setenv("ENV_SENTRY_CSP", "csp") t.Setenv("ENV_PUBLIC_ALLOWED_IP", "1.2.3.4") + t.Setenv("PING_USERNAME", "1234567890abcdef") + t.Setenv("PING_PASSWORD", "abcdef1234567890") } func TestMakeEnv(t *testing.T) { @@ -81,7 +83,9 @@ func TestIgnite(t *testing.T) { "ENV_HTTP_HOST=localhost\n" + "ENV_HTTP_PORT=8080\n" + "ENV_SENTRY_DSN=dsn\n" + - "ENV_SENTRY_CSP=csp\n" + "ENV_SENTRY_CSP=csp\n" + + "PING_USERNAME=1234567890abcdef\n" + + "PING_PASSWORD=abcdef1234567890\n" f, err := os.CreateTemp("", "envfile") diff --git a/metal/kernel/router_ping_test.go b/metal/kernel/router_ping_test.go index 8d9a4308..692b3d47 100644 --- a/metal/kernel/router_ping_test.go +++ b/metal/kernel/router_ping_test.go @@ -1,67 +1,39 @@ package kernel import ( - "fmt" "net/http" "net/http/httptest" - "reflect" "testing" - "time" - "unsafe" + "github.com/oullin/metal/env" "github.com/oullin/pkg/middleware" - "github.com/oullin/pkg/portal" ) -func TestPingRoute_PublicMiddleware(t *testing.T) { - t.Setenv("PING_USERNAME", "user") - t.Setenv("PING_PASSWORD", "pass") - fixedTime := time.Unix(1700000000, 0) - pm := middleware.MakePublicMiddleware("", false) - rv := reflect.ValueOf(&pm).Elem().FieldByName("now") - reflect.NewAt(rv.Type(), unsafe.Pointer(rv.UnsafeAddr())).Elem().Set(reflect.ValueOf(func() time.Time { return fixedTime })) - +func TestPingRoute(t *testing.T) { r := Router{ - Mux: http.NewServeMux(), - Pipeline: middleware.Pipeline{ - PublicMiddleware: pm, - }, + Env: &env.Environment{Ping: env.Ping{Username: "user", Password: "pass"}}, + Mux: http.NewServeMux(), + Pipeline: middleware.Pipeline{PublicMiddleware: middleware.MakePublicMiddleware("", false)}, } r.Ping() - t.Run("request without public headers is unauthorized", func(t *testing.T) { + t.Run("valid credentials", func(t *testing.T) { req := httptest.NewRequest("GET", "/ping", nil) req.SetBasicAuth("user", "pass") rec := httptest.NewRecorder() r.Mux.ServeHTTP(rec, req) - if rec.Code != http.StatusUnauthorized { - t.Fatalf("expected status %d, got %d", http.StatusUnauthorized, rec.Code) + if rec.Code != http.StatusOK { + t.Fatalf("expected status %d, got %d", http.StatusOK, rec.Code) } }) - t.Run("request with public headers but invalid credentials is unauthorized", func(t *testing.T) { + t.Run("invalid credentials", func(t *testing.T) { req := httptest.NewRequest("GET", "/ping", nil) req.SetBasicAuth("bad", "creds") - req.Header.Set(portal.RequestIDHeader, "req-1") - req.Header.Set(portal.TimestampHeader, fmt.Sprintf("%d", fixedTime.Unix())) - req.Header.Set("X-Forwarded-For", "1.2.3.4") rec := httptest.NewRecorder() r.Mux.ServeHTTP(rec, req) if rec.Code != http.StatusUnauthorized { t.Fatalf("expected status %d, got %d", http.StatusUnauthorized, rec.Code) } }) - - t.Run("request with public headers and valid credentials succeeds", func(t *testing.T) { - req := httptest.NewRequest("GET", "/ping", nil) - req.SetBasicAuth("user", "pass") - req.Header.Set(portal.RequestIDHeader, "req-2") - req.Header.Set(portal.TimestampHeader, fmt.Sprintf("%d", fixedTime.Unix())) - req.Header.Set("X-Forwarded-For", "1.2.3.4") - rec := httptest.NewRecorder() - r.Mux.ServeHTTP(rec, req) - if rec.Code != http.StatusOK { - t.Fatalf("expected status %d, got %d", http.StatusOK, rec.Code) - } - }) }