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>
138 lines
3.7 KiB
Go
138 lines
3.7 KiB
Go
package server
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"task/internal/project"
|
|
"task/internal/sqlite"
|
|
)
|
|
|
|
func TestSeedDemo(t *testing.T) {
|
|
db, err := sqlite.Open(filepath.Join(t.TempDir(), "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{}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
projects, err := srv.Projects.List()
|
|
if err != nil || len(projects) != 50 {
|
|
t.Fatalf("want 50 projects, got %d err=%v", len(projects), err)
|
|
}
|
|
var testID string
|
|
for _, p := range projects {
|
|
if p.Name == "Test" {
|
|
testID = p.ID
|
|
break
|
|
}
|
|
}
|
|
if testID == "" {
|
|
t.Fatal("missing Test project")
|
|
}
|
|
groups, err := db.ListProjectGroups()
|
|
if err != nil || len(groups) != 2 {
|
|
t.Fatalf("want 2 groups, got %d err=%v", len(groups), err)
|
|
}
|
|
p, err := srv.Projects.Get(testID)
|
|
if err != nil || p.GroupID == "" {
|
|
t.Fatalf("Test project should be grouped, got %+v err=%v", p, err)
|
|
}
|
|
sync, err := srv.Projects.GetSyncBackend(testID)
|
|
if err != nil || sync.Kind != "none" {
|
|
t.Fatalf("sync=%+v err=%v", sync, err)
|
|
}
|
|
tickets, err := srv.Tickets.List(testID)
|
|
if err != nil || len(tickets) == 0 {
|
|
t.Fatalf("tickets empty")
|
|
}
|
|
conns, err := db.ListConnections()
|
|
if err != nil || len(conns) != 0 {
|
|
t.Fatalf("expected no remote connections, got %v", conns)
|
|
}
|
|
// idempotent when projects already exist
|
|
if err := srv.SeedDemo(SeedDemoOptions{}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
projects2, _ := srv.Projects.List()
|
|
if len(projects2) != len(projects) {
|
|
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)
|
|
}
|
|
}
|