Wire demo seed so TUI connects to Test and Website Relaunch.

Dev seed now issues write tokens and writes local taskmaster meta under TASK_MASTER_HOME, so make run-dev can sync without manual setup.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-27 23:05:10 +01:00
co-authored by Cursor
parent 79b0821837
commit b311a355fd
5 changed files with 201 additions and 11 deletions
+74 -2
View File
@@ -1,9 +1,11 @@
package server
import (
"os"
"path/filepath"
"testing"
"task/internal/project"
"task/internal/sqlite"
)
@@ -17,7 +19,7 @@ func TestSeedDemo(t *testing.T) {
t.Fatal(err)
}
srv := New(db)
if err := srv.SeedDemo(); err != nil {
if err := srv.SeedDemo(SeedDemoOptions{}); err != nil {
t.Fatal(err)
}
projects, err := srv.Projects.List()
@@ -55,7 +57,7 @@ func TestSeedDemo(t *testing.T) {
t.Fatalf("expected no remote connections, got %v", conns)
}
// idempotent when projects already exist
if err := srv.SeedDemo(); err != nil {
if err := srv.SeedDemo(SeedDemoOptions{}); err != nil {
t.Fatal(err)
}
projects2, _ := srv.Projects.List()
@@ -63,3 +65,73 @@ func TestSeedDemo(t *testing.T) {
t.Fatalf("re-seed changed project count")
}
}
func TestSeedDemoWiresTUI(t *testing.T) {
home := t.TempDir()
t.Setenv("TASK_MASTER_HOME", home)
dataDir := filepath.Join(home, ".local", "share", "task-master")
if err := os.MkdirAll(dataDir, 0o755); err != nil {
t.Fatal(err)
}
db, err := sqlite.Open(filepath.Join(dataDir, "seed.db"), []byte("s"))
if err != nil {
t.Fatal(err)
}
defer db.Close()
if _, err := db.CreateUser("admin", "admin", true); err != nil {
t.Fatal(err)
}
srv := New(db)
if err := srv.SeedDemo(SeedDemoOptions{
ClientDataDir: dataDir,
BaseURL: "http://127.0.0.1:8080",
}); err != nil {
t.Fatal(err)
}
store := project.NewDirStore(dataDir)
for _, name := range tuiSeedProjects {
meta, err := store.LoadMeta(name)
if err != nil {
t.Fatalf("LoadMeta %s: %v", name, err)
}
if meta.EffectiveBackend() != project.BackendTaskMaster {
t.Fatalf("%s backend=%q", name, meta.EffectiveBackend())
}
if meta.TaskMaster == nil || !meta.TaskMaster.Configured() {
t.Fatalf("%s taskmaster not configured: %+v", name, meta.TaskMaster)
}
if meta.TaskMaster.BaseURL != "http://127.0.0.1:8080" {
t.Fatalf("baseURL=%q", meta.TaskMaster.BaseURL)
}
auth, err := db.ResolveBearerToken(meta.TaskMaster.Token)
if err != nil {
t.Fatalf("token resolve %s: %v", name, err)
}
if auth.ProjectID != meta.TaskMaster.ProjectID {
t.Fatalf("token project mismatch")
}
if !sqlite.TokenAllows(auth.Scope, sqlite.TokenScopeWrite) {
t.Fatalf("want write scope, got %q", auth.Scope)
}
tokens, err := db.ListProjectTokens(meta.TaskMaster.ProjectID)
if err != nil || len(tokens) != 1 || tokens[0].Name != "dev-tui" {
t.Fatalf("tokens=%v err=%v", tokens, err)
}
}
}
func TestSeedBaseURL(t *testing.T) {
t.Setenv("TM_SEED_BASE_URL", "")
if got := SeedBaseURL(":8080"); got != "http://127.0.0.1:8080" {
t.Fatalf("got %q", got)
}
if got := SeedBaseURL("0.0.0.0:9000"); got != "http://0.0.0.0:9000" {
t.Fatalf("got %q", got)
}
t.Setenv("TM_SEED_BASE_URL", "http://localhost:8080/")
if got := SeedBaseURL(":9999"); got != "http://localhost:8080" {
t.Fatalf("env override got %q", got)
}
}