package server import ( "net/http" "net/http/httptest" "strings" "testing" ) // newTestServer is a server on a fresh database with an admin signed in (the // cookie) and one machine, x1. func newTestServer(t *testing.T) (*Server, *http.Cookie) { t.Helper() db, err := OpenDB(t.TempDir() + "/t.db") if err != nil { t.Fatal(err) } s, err := New(Options{DB: db, DistDir: t.TempDir()}) if err != nil { t.Fatal(err) } hash, _ := hashPassword("Passw0rd12345") if err := db.CreateAdmin("adm", hash); err != nil { t.Fatal(err) } _ = db.SetConfig(cfgSetupDone, "1") a, _ := db.AdminByUsername("adm") if err := db.CreateSession("sid-test", a.ID, sessionTTL); err != nil { t.Fatal(err) } if err := db.CreateAgent(Agent{ID: "x1", Name: "t", Hostname: "h", OS: "linux", Arch: "amd64", TokenHash: "x"}); err != nil { t.Fatal(err) } return s, &http.Cookie{Name: sessionCookie, Value: "sid-test"} } func get(t *testing.T, s *Server, c *http.Cookie, path string) *httptest.ResponseRecorder { t.Helper() req := httptest.NewRequest(http.MethodGet, path, nil) req.AddCookie(c) w := httptest.NewRecorder() s.Handler().ServeHTTP(w, req) return w } func TestFragmentHasNoChrome(t *testing.T) { s, cookie := newTestServer(t) w := get(t, s, cookie, "/settings?frag=1") body := w.Body.String() if w.Code != 200 || strings.Contains(body, "","fileTime":"maybe"}`); !strings.Contains(got, `"ok":true`) { t.Fatal(got) } got := get(t, s, c, "/api/panel/account/prefs").Body.String() if !strings.Contains(got, `"tabIcons":"right"`) || !strings.Contains(got, `"termFont":16`) || strings.Contains(got, "evil") || strings.Contains(got, "maybe") { t.Fatalf("prefs: %s", got) } if body := get(t, s, c, "/workspace").Body.String(); !strings.Contains(body, `"tabIcons":"right"`) { t.Fatal("the page does not get the prefs") } if got := post(`{"termFont":99}`); !strings.Contains(got, `"ok":true`) || strings.Contains(get(t, s, c, "/api/panel/account/prefs").Body.String(), "99") { t.Fatal("a font size out of range was kept") } post(`{"openHere":"off"}`) if got := get(t, s, c, "/api/panel/account/prefs").Body.String(); !strings.Contains(got, `"openHere":"off"`) { t.Fatalf("openHere off not kept: %s", got) } post(`{"aiModelPick":"always","aiModel":"a1b2c3"}`) if got := get(t, s, c, "/api/panel/account/prefs").Body.String(); !strings.Contains(got, `"aiModelPick":"always"`) || !strings.Contains(got, `"aiModel":"a1b2c3"`) { t.Fatalf("the model choice not kept: %s", got) } post(`{"aiModelPick":"often","aiModel":""}`) if got := get(t, s, c, "/api/panel/account/prefs").Body.String(); strings.Contains(got, "aiModel") { t.Fatalf("an unknown model choice was kept: %s", got) } post(`{"openHere":"sometimes"}`) if got := get(t, s, c, "/api/panel/account/prefs").Body.String(); strings.Contains(got, "openHere") { t.Fatalf("an unknown openHere was kept: %s", got) } }