mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-21 09:28:14 +00:00
test: cover WebUI auth flows and bootstrap credentials
- add auth middleware tests for API key, login, and root redirect - auto-bootstrap admin username/password and API key when unset - add logout control to dashboard and cookie-aware client behavior
This commit is contained in:
@ -37,6 +37,62 @@ func newTestHandler(t *testing.T) (*Handler, *supervisor.Daemon) {
|
||||
return NewHandler(sup, nil, nil, nil, cfg, nil, nil, nil, nil, nil, nil, events.NewBus(), nil), sup
|
||||
}
|
||||
|
||||
func TestAuthMiddleware(t *testing.T) {
|
||||
cfgReg := internalConfig.NewConfigRegistry("")
|
||||
cfgReg.PluginConfig("webui").Set("api_key", "test-api-key")
|
||||
cfgReg.PluginConfig("webui").Set("username", "admin")
|
||||
cfgReg.PluginConfig("webui").Set("password", "secret-pass")
|
||||
cfgReg.PluginConfig("webui").Set("session_ttl_hours", "24")
|
||||
|
||||
h, sup := newTestHandler(t)
|
||||
defer sup.Shutdown()
|
||||
h.cfgReg = cfgReg
|
||||
mux := http.NewServeMux()
|
||||
h.RegisterRoutes(mux)
|
||||
|
||||
t.Run("api_requires_auth", func(t *testing.T) {
|
||||
req := httptest.NewRequest(http.MethodGet, "/api/v1/status", nil)
|
||||
w := httptest.NewRecorder()
|
||||
mux.ServeHTTP(w, req)
|
||||
if w.Code != http.StatusUnauthorized {
|
||||
t.Fatalf("expected 401, got %d", w.Code)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("api_key_allows_access", func(t *testing.T) {
|
||||
req := httptest.NewRequest(http.MethodGet, "/api/v1/status", nil)
|
||||
req.Header.Set("X-API-Key", "test-api-key")
|
||||
w := httptest.NewRecorder()
|
||||
mux.ServeHTTP(w, req)
|
||||
if w.Code != http.StatusOK {
|
||||
t.Fatalf("expected 200, got %d", w.Code)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("login_sets_session_cookie", func(t *testing.T) {
|
||||
body := `{"username":"admin","password":"secret-pass"}`
|
||||
req := httptest.NewRequest(http.MethodPost, "/api/v1/login", strings.NewReader(body))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
w := httptest.NewRecorder()
|
||||
mux.ServeHTTP(w, req)
|
||||
if w.Code != http.StatusOK {
|
||||
t.Fatalf("expected 200, got %d", w.Code)
|
||||
}
|
||||
if len(w.Result().Cookies()) == 0 {
|
||||
t.Fatal("expected session cookie")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("root_redirects_to_login_without_session", func(t *testing.T) {
|
||||
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||||
w := httptest.NewRecorder()
|
||||
mux.ServeHTTP(w, req)
|
||||
if w.Code != http.StatusFound {
|
||||
t.Fatalf("expected 302, got %d", w.Code)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestHandleStatus(t *testing.T) {
|
||||
h, sup := newTestHandler(t)
|
||||
defer sup.Shutdown()
|
||||
|
||||
Reference in New Issue
Block a user