(t *testing.T)
| 254 | } |
| 255 | |
| 256 | func TestProjects_DefaultTaskDir(t *testing.T) { |
| 257 | resetProjectsFlags() |
| 258 | projectsFormat = "json" |
| 259 | |
| 260 | // Create project without .taskmd.yaml — should default to ./tasks |
| 261 | projectDir := t.TempDir() |
| 262 | tasksDir := filepath.Join(projectDir, "tasks") |
| 263 | if err := os.MkdirAll(tasksDir, 0755); err != nil { |
| 264 | t.Fatalf("failed to create tasks dir: %v", err) |
| 265 | } |
| 266 | if err := os.WriteFile( |
| 267 | filepath.Join(tasksDir, "001.md"), |
| 268 | []byte(taskFile("001", "Default Dir Task", "pending")), |
| 269 | 0644, |
| 270 | ); err != nil { |
| 271 | t.Fatalf("failed to write task: %v", err) |
| 272 | } |
| 273 | |
| 274 | setupGlobalRegistry(t, "projects:\n"+ |
| 275 | " - id: proj1\n"+ |
| 276 | " name: \"Default Dir Project\"\n"+ |
| 277 | " path: "+projectDir+"\n") |
| 278 | |
| 279 | stdout, _, err := captureProjectsOutput(t) |
| 280 | if err != nil { |
| 281 | t.Fatalf("unexpected error: %v", err) |
| 282 | } |
| 283 | |
| 284 | var summaries []ProjectSummary |
| 285 | if err := json.Unmarshal([]byte(stdout), &summaries); err != nil { |
| 286 | t.Fatalf("failed to parse JSON: %v\noutput: %s", err, stdout) |
| 287 | } |
| 288 | |
| 289 | if len(summaries) != 1 { |
| 290 | t.Fatalf("expected 1 project, got %d", len(summaries)) |
| 291 | } |
| 292 | if summaries[0].Tasks != 1 { |
| 293 | t.Errorf("expected 1 task (from default tasks/ dir), got %d", summaries[0].Tasks) |
| 294 | } |
| 295 | } |
| 296 | |
| 297 | func TestProjects_InvalidFormat(t *testing.T) { |
| 298 | resetProjectsFlags() |
nothing calls this directly
no test coverage detected