diff --git a/executor_test.go b/executor_test.go index 48a18807..e635e6e1 100644 --- a/executor_test.go +++ b/executor_test.go @@ -1067,3 +1067,65 @@ func TestFailfast(t *testing.T) { ) }) } + +func TestIf(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + task string + vars map[string]any + verbose bool + }{ + // Basic command-level if + {name: "cmd-if-true", task: "cmd-if-true"}, + {name: "cmd-if-false", task: "cmd-if-false"}, + + // Task-level if + {name: "task-if-true", task: "task-if-true"}, + {name: "task-if-false", task: "task-if-false", verbose: true}, + + // Task call with if + {name: "task-call-if-true", task: "task-call-if-true"}, + {name: "task-call-if-false", task: "task-call-if-false", verbose: true}, + + // Go template conditions + {name: "template-eq-true", task: "template-eq-true"}, + {name: "template-eq-false", task: "template-eq-false", verbose: true}, + {name: "template-ne", task: "template-ne"}, + {name: "template-bool-true", task: "template-bool-true"}, + {name: "template-bool-false", task: "template-bool-false"}, + {name: "template-direct-true", task: "template-direct-true"}, + {name: "template-direct-false", task: "template-direct-false"}, + {name: "template-and", task: "template-and"}, + {name: "template-or", task: "template-or"}, + + // CLI variable override + {name: "template-cli-var", task: "template-cli-var", vars: map[string]any{"MY_VAR": "yes"}}, + + // Task-level if with template + {name: "task-level-template", task: "task-level-template"}, + {name: "task-level-template-false", task: "task-level-template-false", verbose: true}, + + // For loop with if + {name: "if-in-for-loop", task: "if-in-for-loop", verbose: true}, + } + + for _, test := range tests { + opts := []ExecutorTestOption{ + WithName(test.name), + WithExecutorOptions( + task.WithDir("testdata/if"), + task.WithSilent(true), + task.WithVerbose(test.verbose), + ), + WithTask(test.task), + } + if test.vars != nil { + for k, v := range test.vars { + opts = append(opts, WithVar(k, v)) + } + } + NewExecutorTest(t, opts...) + } +} diff --git a/testdata/if/testdata/TestIf-cmd-if-false.golden b/testdata/if/testdata/TestIf-cmd-if-false.golden new file mode 100644 index 00000000..56157dc3 --- /dev/null +++ b/testdata/if/testdata/TestIf-cmd-if-false.golden @@ -0,0 +1 @@ +this runs diff --git a/testdata/if/testdata/TestIf-cmd-if-true.golden b/testdata/if/testdata/TestIf-cmd-if-true.golden new file mode 100644 index 00000000..6966f0ad --- /dev/null +++ b/testdata/if/testdata/TestIf-cmd-if-true.golden @@ -0,0 +1 @@ +executed diff --git a/testdata/if/testdata/TestIf-if-in-for-loop.golden b/testdata/if/testdata/TestIf-if-in-for-loop.golden new file mode 100644 index 00000000..73ea6a60 --- /dev/null +++ b/testdata/if/testdata/TestIf-if-in-for-loop.golden @@ -0,0 +1,7 @@ +task: "if-in-for-loop" started +task: [if-in-for-loop] echo "processing a" +processing a +task: [if-in-for-loop] if condition not met - skipped +task: [if-in-for-loop] echo "processing c" +processing c +task: "if-in-for-loop" finished diff --git a/testdata/if/testdata/TestIf-task-call-if-false.golden b/testdata/if/testdata/TestIf-task-call-if-false.golden new file mode 100644 index 00000000..51e65e88 --- /dev/null +++ b/testdata/if/testdata/TestIf-task-call-if-false.golden @@ -0,0 +1,5 @@ +task: "task-call-if-false" started +task: [task-call-if-false] if condition not met - skipped +task: [task-call-if-false] echo "continues after skipped task" +continues after skipped task +task: "task-call-if-false" finished diff --git a/testdata/if/testdata/TestIf-task-call-if-true.golden b/testdata/if/testdata/TestIf-task-call-if-true.golden new file mode 100644 index 00000000..80e46c76 --- /dev/null +++ b/testdata/if/testdata/TestIf-task-call-if-true.golden @@ -0,0 +1,2 @@ +subtask ran +after task call diff --git a/testdata/if/testdata/TestIf-task-if-false.golden b/testdata/if/testdata/TestIf-task-if-false.golden new file mode 100644 index 00000000..d21c985a --- /dev/null +++ b/testdata/if/testdata/TestIf-task-if-false.golden @@ -0,0 +1 @@ +task: "task-if-false" if condition not met - skipped diff --git a/testdata/if/testdata/TestIf-task-if-true.golden b/testdata/if/testdata/TestIf-task-if-true.golden new file mode 100644 index 00000000..f69342ab --- /dev/null +++ b/testdata/if/testdata/TestIf-task-if-true.golden @@ -0,0 +1 @@ +task executed diff --git a/testdata/if/testdata/TestIf-task-level-template-false.golden b/testdata/if/testdata/TestIf-task-level-template-false.golden new file mode 100644 index 00000000..549d157d --- /dev/null +++ b/testdata/if/testdata/TestIf-task-level-template-false.golden @@ -0,0 +1 @@ +task: "task-level-template-false" if condition not met - skipped diff --git a/testdata/if/testdata/TestIf-task-level-template.golden b/testdata/if/testdata/TestIf-task-level-template.golden new file mode 100644 index 00000000..1f2a3643 --- /dev/null +++ b/testdata/if/testdata/TestIf-task-level-template.golden @@ -0,0 +1 @@ +task runs in prod diff --git a/testdata/if/testdata/TestIf-template-and.golden b/testdata/if/testdata/TestIf-template-and.golden new file mode 100644 index 00000000..f2c87fb5 --- /dev/null +++ b/testdata/if/testdata/TestIf-template-and.golden @@ -0,0 +1 @@ +both conditions met diff --git a/testdata/if/testdata/TestIf-template-bool-false.golden b/testdata/if/testdata/TestIf-template-bool-false.golden new file mode 100644 index 00000000..520bca12 --- /dev/null +++ b/testdata/if/testdata/TestIf-template-bool-false.golden @@ -0,0 +1 @@ +feature was disabled diff --git a/testdata/if/testdata/TestIf-template-bool-true.golden b/testdata/if/testdata/TestIf-template-bool-true.golden new file mode 100644 index 00000000..63063af7 --- /dev/null +++ b/testdata/if/testdata/TestIf-template-bool-true.golden @@ -0,0 +1 @@ +feature enabled diff --git a/testdata/if/testdata/TestIf-template-cli-var.golden b/testdata/if/testdata/TestIf-template-cli-var.golden new file mode 100644 index 00000000..5e19287b --- /dev/null +++ b/testdata/if/testdata/TestIf-template-cli-var.golden @@ -0,0 +1 @@ +MY_VAR is yes diff --git a/testdata/if/testdata/TestIf-template-direct-false.golden b/testdata/if/testdata/TestIf-template-direct-false.golden new file mode 100644 index 00000000..aa18cb60 --- /dev/null +++ b/testdata/if/testdata/TestIf-template-direct-false.golden @@ -0,0 +1 @@ +direct false skipped correctly diff --git a/testdata/if/testdata/TestIf-template-direct-true.golden b/testdata/if/testdata/TestIf-template-direct-true.golden new file mode 100644 index 00000000..feaf4490 --- /dev/null +++ b/testdata/if/testdata/TestIf-template-direct-true.golden @@ -0,0 +1 @@ +direct true works diff --git a/testdata/if/testdata/TestIf-template-eq-false.golden b/testdata/if/testdata/TestIf-template-eq-false.golden new file mode 100644 index 00000000..12850e7c --- /dev/null +++ b/testdata/if/testdata/TestIf-template-eq-false.golden @@ -0,0 +1,5 @@ +task: "template-eq-false" started +task: [template-eq-false] if condition not met - skipped +task: [template-eq-false] echo "this runs" +this runs +task: "template-eq-false" finished diff --git a/testdata/if/testdata/TestIf-template-eq-true.golden b/testdata/if/testdata/TestIf-template-eq-true.golden new file mode 100644 index 00000000..bfae5dd6 --- /dev/null +++ b/testdata/if/testdata/TestIf-template-eq-true.golden @@ -0,0 +1 @@ +env is prod diff --git a/testdata/if/testdata/TestIf-template-ne.golden b/testdata/if/testdata/TestIf-template-ne.golden new file mode 100644 index 00000000..10e2e20a --- /dev/null +++ b/testdata/if/testdata/TestIf-template-ne.golden @@ -0,0 +1 @@ +env is not dev diff --git a/testdata/if/testdata/TestIf-template-or.golden b/testdata/if/testdata/TestIf-template-or.golden new file mode 100644 index 00000000..57aca4f7 --- /dev/null +++ b/testdata/if/testdata/TestIf-template-or.golden @@ -0,0 +1 @@ +at least one condition met