|
1 | 1 | package ci |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "strings" |
4 | 5 | "testing" |
5 | 6 |
|
6 | 7 | civ1 "github.com/depot/cli/pkg/proto/depot/ci/v1" |
@@ -314,6 +315,107 @@ func TestJobDisplayNames_NoColon(t *testing.T) { |
314 | 315 | } |
315 | 316 | } |
316 | 317 |
|
| 318 | +func TestFindLogsJob_SegmentMatch_ReusableWorkflow(t *testing.T) { |
| 319 | + // Reusable workflow: user passes "bazel" but key is "pr.yaml:bazel:build" |
| 320 | + resp := &civ1.GetRunStatusResponse{ |
| 321 | + RunId: "run-1", |
| 322 | + Workflows: []*civ1.WorkflowStatus{ |
| 323 | + { |
| 324 | + WorkflowPath: ".depot/workflows/pr.yaml", |
| 325 | + Jobs: []*civ1.JobStatus{ |
| 326 | + {JobId: "job-1", JobKey: "pr.yaml:detect_changes:build", Status: "finished"}, |
| 327 | + {JobId: "job-2", JobKey: "pr.yaml:bazel:build", Status: "running"}, |
| 328 | + {JobId: "job-3", JobKey: "pr.yaml:test_dashboard:test", Status: "queued"}, |
| 329 | + }, |
| 330 | + }, |
| 331 | + }, |
| 332 | + } |
| 333 | + |
| 334 | + job, _, err := findLogsJob(resp, "run-1", "bazel", "") |
| 335 | + if err != nil { |
| 336 | + t.Fatal(err) |
| 337 | + } |
| 338 | + if job.JobId != "job-2" { |
| 339 | + t.Fatalf("expected job ID %q, got %q", "job-2", job.JobId) |
| 340 | + } |
| 341 | +} |
| 342 | + |
| 343 | +func TestFindLogsJob_SegmentMatch_InlineWorkflow(t *testing.T) { |
| 344 | + // CLI-triggered run: key is "_inline_0.yaml:bazel:build" |
| 345 | + resp := &civ1.GetRunStatusResponse{ |
| 346 | + RunId: "run-1", |
| 347 | + Workflows: []*civ1.WorkflowStatus{ |
| 348 | + { |
| 349 | + WorkflowPath: "", |
| 350 | + Jobs: []*civ1.JobStatus{ |
| 351 | + {JobId: "job-1", JobKey: "_inline_0.yaml:bazel:build", Status: "running"}, |
| 352 | + }, |
| 353 | + }, |
| 354 | + }, |
| 355 | + } |
| 356 | + |
| 357 | + job, _, err := findLogsJob(resp, "run-1", "bazel", "") |
| 358 | + if err != nil { |
| 359 | + t.Fatal(err) |
| 360 | + } |
| 361 | + if job.JobId != "job-1" { |
| 362 | + t.Fatalf("expected job ID %q, got %q", "job-1", job.JobId) |
| 363 | + } |
| 364 | +} |
| 365 | + |
| 366 | +func TestFindLogsJob_SegmentMatch_AmbiguousSameWorkflow(t *testing.T) { |
| 367 | + // Parent job expands to multiple nested jobs within the same workflow. |
| 368 | + // Error should suggest a more specific --job, not --workflow. |
| 369 | + resp := &civ1.GetRunStatusResponse{ |
| 370 | + RunId: "run-1", |
| 371 | + Workflows: []*civ1.WorkflowStatus{ |
| 372 | + { |
| 373 | + WorkflowPath: ".depot/workflows/ci.yml", |
| 374 | + Jobs: []*civ1.JobStatus{ |
| 375 | + {JobId: "job-1", JobKey: "ci.yml:backend:build", Status: "running"}, |
| 376 | + {JobId: "job-2", JobKey: "ci.yml:backend:test", Status: "running"}, |
| 377 | + }, |
| 378 | + }, |
| 379 | + }, |
| 380 | + } |
| 381 | + |
| 382 | + _, _, err := findLogsJob(resp, "run-1", "backend", "") |
| 383 | + if err == nil { |
| 384 | + t.Fatal("expected error for ambiguous segment match") |
| 385 | + } |
| 386 | + if strings.Contains(err.Error(), "--workflow") { |
| 387 | + t.Fatalf("error should suggest --job, not --workflow: %v", err) |
| 388 | + } |
| 389 | + if !strings.Contains(err.Error(), "more specific --job") { |
| 390 | + t.Fatalf("expected 'more specific --job' hint, got: %v", err) |
| 391 | + } |
| 392 | +} |
| 393 | + |
| 394 | +func TestFindLogsJob_ShortPreferredOverSegment(t *testing.T) { |
| 395 | + // Short name match should take priority over segment match |
| 396 | + resp := &civ1.GetRunStatusResponse{ |
| 397 | + RunId: "run-1", |
| 398 | + Workflows: []*civ1.WorkflowStatus{ |
| 399 | + { |
| 400 | + WorkflowPath: ".depot/workflows/ci.yml", |
| 401 | + Jobs: []*civ1.JobStatus{ |
| 402 | + {JobId: "job-segment", JobKey: "ci.yml:build:test", Status: "running"}, |
| 403 | + {JobId: "job-short", JobKey: "ci.yml:build", Status: "running"}, |
| 404 | + }, |
| 405 | + }, |
| 406 | + }, |
| 407 | + } |
| 408 | + |
| 409 | + // "build" short-matches "ci.yml:build" and segment-matches "ci.yml:build:test" |
| 410 | + job, _, err := findLogsJob(resp, "run-1", "build", "") |
| 411 | + if err != nil { |
| 412 | + t.Fatal(err) |
| 413 | + } |
| 414 | + if job.JobId != "job-short" { |
| 415 | + t.Fatalf("expected short match (job-short), got %q", job.JobId) |
| 416 | + } |
| 417 | +} |
| 418 | + |
317 | 419 | func TestJobKeyShort_MultipleColons(t *testing.T) { |
318 | 420 | got := jobKeyShort("ci.yml:foo:bar") |
319 | 421 | if got != "foo:bar" { |
|
0 commit comments