package workflow import ( "os" "path/filepath" "testing" "github.com/ajhahnde/eeco/internal/config" "github.com/ajhahnde/eeco/internal/manifest" ) func TestManifestRefresh_WritesSkeletonsForKnowledgeDirs(t *testing.T) { root := t.TempDir() userDir := filepath.Join(root, "alice") // Engine workspace (must be skipped) + two knowledge dirs, one nested. mustMkdir(t, filepath.Join(userDir, ".eeco", "state")) mustMkdir(t, filepath.Join(userDir, "backend")) mustMkdir(t, filepath.Join(userDir, "frontend", "routes")) mustWrite(t, filepath.Join(userDir, "backend", "main.go"), "package main") cfg := &config.Config{UserDir: userDir, WorkspaceName: ".eeco"} res, err := manifestRefresh{}.Run(Env{Config: cfg}) if err != nil { t.Fatal(err) } if res.Code != CodeClean { t.Fatalf("code = %d, want %d", res.Code, CodeClean) } // Top-level dirs AND the nested subdirectory each get a manifest. for _, d := range []string{"backend", "frontend", filepath.Join("frontend", "routes")} { if _, err := os.Stat(filepath.Join(userDir, d, manifest.FileName)); err != nil { t.Fatalf("manifest missing for %s: %v", d, err) } } // The engine workspace must NOT get a manifest. if _, err := os.Stat(filepath.Join(userDir, ".eeco", manifest.FileName)); !os.IsNotExist(err) { t.Fatalf("engine workspace should be skipped, stat err = %v", err) } } func TestManifestRefresh_NoKnowledgeDirsIsCleanNoop(t *testing.T) { root := t.TempDir() userDir := filepath.Join(root, "alice") mustMkdir(t, filepath.Join(userDir, ".eeco")) cfg := &config.Config{UserDir: userDir, WorkspaceName: ".eeco"} res, err := manifestRefresh{}.Run(Env{Config: cfg}) if err != nil { t.Fatal(err) } if res.Code != CodeClean { t.Fatalf("code = %d, want %d", res.Code, CodeClean) } } func mustMkdir(t *testing.T, p string) { t.Helper() if err := os.MkdirAll(p, 0o755); err != nil { t.Fatal(err) } } func mustWrite(t *testing.T, p, body string) { t.Helper() if err := os.WriteFile(p, []byte(body), 0o644); err != nil { t.Fatal(err) } }