2017-03-16 02:15:27 +02:00
|
|
|
package task_test
|
|
|
|
|
|
|
|
import (
|
2017-05-17 19:37:11 +02:00
|
|
|
"bytes"
|
2019-02-09 14:16:13 +02:00
|
|
|
"context"
|
2017-07-12 11:30:28 +02:00
|
|
|
"fmt"
|
2021-12-04 17:37:52 +02:00
|
|
|
"io"
|
2017-03-16 02:15:27 +02:00
|
|
|
"os"
|
|
|
|
"path/filepath"
|
2019-09-02 03:26:53 +02:00
|
|
|
"runtime"
|
2017-03-25 15:51:30 +02:00
|
|
|
"strings"
|
2017-03-16 02:15:27 +02:00
|
|
|
"testing"
|
2017-06-16 16:24:01 +02:00
|
|
|
|
2021-01-07 16:48:33 +02:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
2020-08-16 20:48:19 +02:00
|
|
|
"github.com/go-task/task/v3"
|
2020-08-19 10:59:58 +02:00
|
|
|
"github.com/go-task/task/v3/taskfile"
|
2017-03-16 02:15:27 +02:00
|
|
|
)
|
|
|
|
|
2021-05-31 03:48:48 +02:00
|
|
|
func init() {
|
|
|
|
_ = os.Setenv("NO_COLOR", "1")
|
|
|
|
}
|
|
|
|
|
2017-07-20 09:05:37 +02:00
|
|
|
// fileContentTest provides a basic reusable test-case for running a Taskfile
|
|
|
|
// and inspect generated files.
|
|
|
|
type fileContentTest struct {
|
2021-12-04 17:37:52 +02:00
|
|
|
Dir string
|
|
|
|
Entrypoint string
|
|
|
|
Target string
|
|
|
|
TrimSpace bool
|
|
|
|
Files map[string]string
|
2017-07-20 09:05:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (fct fileContentTest) name(file string) string {
|
|
|
|
return fmt.Sprintf("target=%q,file=%q", fct.Target, file)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (fct fileContentTest) Run(t *testing.T) {
|
|
|
|
for f := range fct.Files {
|
|
|
|
_ = os.Remove(filepath.Join(fct.Dir, f))
|
|
|
|
}
|
|
|
|
|
|
|
|
e := &task.Executor{
|
2021-12-04 17:37:52 +02:00
|
|
|
Dir: fct.Dir,
|
|
|
|
Entrypoint: fct.Entrypoint,
|
|
|
|
Stdout: io.Discard,
|
|
|
|
Stderr: io.Discard,
|
2017-07-20 09:05:37 +02:00
|
|
|
}
|
2018-03-11 19:39:40 +02:00
|
|
|
assert.NoError(t, e.Setup(), "e.Setup()")
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: fct.Target}), "e.Run(target)")
|
2017-07-20 09:05:37 +02:00
|
|
|
|
|
|
|
for name, expectContent := range fct.Files {
|
|
|
|
t.Run(fct.name(name), func(t *testing.T) {
|
2021-12-04 17:37:52 +02:00
|
|
|
b, err := os.ReadFile(filepath.Join(fct.Dir, name))
|
2017-07-20 09:05:37 +02:00
|
|
|
assert.NoError(t, err, "Error reading file")
|
|
|
|
s := string(b)
|
|
|
|
if fct.TrimSpace {
|
|
|
|
s = strings.TrimSpace(s)
|
|
|
|
}
|
|
|
|
assert.Equal(t, expectContent, s, "unexpected file content")
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-13 02:03:13 +02:00
|
|
|
func TestEmptyTask(t *testing.T) {
|
|
|
|
e := &task.Executor{
|
|
|
|
Dir: "testdata/empty_task",
|
2021-12-04 17:37:52 +02:00
|
|
|
Stdout: io.Discard,
|
|
|
|
Stderr: io.Discard,
|
2020-10-13 02:03:13 +02:00
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup(), "e.Setup()")
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "default"}))
|
|
|
|
}
|
|
|
|
|
2017-08-16 13:04:58 +02:00
|
|
|
func TestEnv(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/env",
|
|
|
|
Target: "default",
|
|
|
|
TrimSpace: false,
|
|
|
|
Files: map[string]string{
|
2019-01-02 16:05:40 +02:00
|
|
|
"local.txt": "GOOS='linux' GOARCH='amd64' CGO_ENABLED='0'\n",
|
|
|
|
"global.txt": "FOO='foo' BAR='overriden' BAZ='baz'\n",
|
2017-08-16 13:04:58 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
|
|
|
|
2018-02-18 14:50:39 +02:00
|
|
|
func TestVarsV2(t *testing.T) {
|
2017-09-03 12:48:06 +02:00
|
|
|
tt := fileContentTest{
|
2018-02-18 14:50:39 +02:00
|
|
|
Dir: "testdata/vars/v2",
|
2017-09-03 12:48:06 +02:00
|
|
|
Target: "default",
|
2018-02-18 14:50:39 +02:00
|
|
|
TrimSpace: true,
|
2017-09-03 12:48:06 +02:00
|
|
|
Files: map[string]string{
|
2018-02-18 14:50:39 +02:00
|
|
|
"foo.txt": "foo",
|
|
|
|
"bar.txt": "bar",
|
|
|
|
"baz.txt": "baz",
|
|
|
|
"tmpl_foo.txt": "foo",
|
|
|
|
"tmpl_bar.txt": "bar",
|
|
|
|
"tmpl_foo2.txt": "foo2",
|
|
|
|
"tmpl_bar2.txt": "bar2",
|
|
|
|
"shtmpl_foo.txt": "foo",
|
|
|
|
"shtmpl_foo2.txt": "foo2",
|
|
|
|
"nestedtmpl_foo.txt": "<no value>",
|
|
|
|
"nestedtmpl_foo2.txt": "foo2",
|
|
|
|
"foo2.txt": "foo2",
|
|
|
|
"bar2.txt": "bar2",
|
|
|
|
"baz2.txt": "baz2",
|
|
|
|
"tmpl2_foo.txt": "<no value>",
|
|
|
|
"tmpl2_foo2.txt": "foo2",
|
|
|
|
"tmpl2_bar.txt": "<no value>",
|
|
|
|
"tmpl2_bar2.txt": "bar2",
|
|
|
|
"shtmpl2_foo.txt": "<no value>",
|
|
|
|
"shtmpl2_foo2.txt": "foo2",
|
|
|
|
"nestedtmpl2_foo2.txt": "<no value>",
|
|
|
|
"override.txt": "bar",
|
2018-03-04 20:39:14 +02:00
|
|
|
"nested.txt": "Taskvars-TaskfileVars-TaskVars",
|
2019-12-08 00:43:10 +02:00
|
|
|
"task_name.txt": "hello",
|
2017-09-03 12:48:06 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
2018-02-18 14:50:39 +02:00
|
|
|
// Ensure identical results when running hello task directly.
|
|
|
|
tt.Target = "hello"
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
|
|
|
|
2020-05-16 20:45:41 +02:00
|
|
|
func TestVarsV3(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/vars/v3",
|
|
|
|
Target: "default",
|
|
|
|
Files: map[string]string{
|
|
|
|
"missing-var.txt": "\n",
|
|
|
|
"var-order.txt": "ABCDEF\n",
|
|
|
|
"dependent-sh.txt": "123456\n",
|
|
|
|
"with-call.txt": "Hi, ABC123!\n",
|
2021-01-12 16:09:46 +02:00
|
|
|
"from-dot-env.txt": "From .env file\n",
|
2020-05-16 20:45:41 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
|
|
|
|
2018-02-18 14:50:39 +02:00
|
|
|
func TestMultilineVars(t *testing.T) {
|
2019-08-18 17:37:21 +02:00
|
|
|
for _, dir := range []string{"testdata/vars/v2/multiline"} {
|
2018-02-18 14:50:39 +02:00
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: dir,
|
|
|
|
Target: "default",
|
|
|
|
TrimSpace: false,
|
|
|
|
Files: map[string]string{
|
|
|
|
// Note:
|
|
|
|
// - task does not strip a trailing newline from var entries
|
|
|
|
// - task strips one trailing newline from shell output
|
|
|
|
// - the cat command adds a trailing newline
|
|
|
|
"echo_foobar.txt": "foo\nbar\n",
|
|
|
|
"echo_n_foobar.txt": "foo\nbar\n",
|
|
|
|
"echo_n_multiline.txt": "\n\nfoo\n bar\nfoobar\n\nbaz\n\n",
|
|
|
|
"var_multiline.txt": "\n\nfoo\n bar\nfoobar\n\nbaz\n\n\n",
|
|
|
|
"var_catlines.txt": " foo bar foobar baz \n",
|
|
|
|
"var_enumfile.txt": "0:\n1:\n2:foo\n3: bar\n4:foobar\n5:\n6:baz\n7:\n8:\n",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
2017-09-03 12:48:06 +02:00
|
|
|
}
|
2017-07-20 09:05:37 +02:00
|
|
|
|
|
|
|
func TestVarsInvalidTmpl(t *testing.T) {
|
|
|
|
const (
|
2019-08-18 17:37:21 +02:00
|
|
|
dir = "testdata/vars/v2"
|
2017-07-20 09:05:37 +02:00
|
|
|
target = "invalid-var-tmpl"
|
|
|
|
expectError = "template: :1: unexpected EOF"
|
|
|
|
)
|
|
|
|
|
|
|
|
e := &task.Executor{
|
|
|
|
Dir: dir,
|
2021-12-04 17:37:52 +02:00
|
|
|
Stdout: io.Discard,
|
|
|
|
Stderr: io.Discard,
|
2017-07-20 09:05:37 +02:00
|
|
|
}
|
2018-03-11 19:39:40 +02:00
|
|
|
assert.NoError(t, e.Setup(), "e.Setup()")
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.EqualError(t, e.Run(context.Background(), taskfile.Call{Task: target}), expectError, "e.Run(target)")
|
2017-07-20 09:05:37 +02:00
|
|
|
}
|
|
|
|
|
2020-06-12 20:09:53 +02:00
|
|
|
func TestConcurrency(t *testing.T) {
|
|
|
|
const (
|
|
|
|
dir = "testdata/concurrency"
|
|
|
|
target = "default"
|
|
|
|
)
|
|
|
|
|
|
|
|
e := &task.Executor{
|
|
|
|
Dir: dir,
|
2021-12-04 17:37:52 +02:00
|
|
|
Stdout: io.Discard,
|
|
|
|
Stderr: io.Discard,
|
2020-06-12 20:09:53 +02:00
|
|
|
Concurrency: 1,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup(), "e.Setup()")
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: target}), "e.Run(target)")
|
|
|
|
}
|
|
|
|
|
2017-07-20 09:05:37 +02:00
|
|
|
func TestParams(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/params",
|
|
|
|
Target: "default",
|
|
|
|
TrimSpace: false,
|
|
|
|
Files: map[string]string{
|
|
|
|
"hello.txt": "Hello\n",
|
|
|
|
"world.txt": "World\n",
|
|
|
|
"exclamation.txt": "!\n",
|
|
|
|
"dep1.txt": "Dependence1\n",
|
|
|
|
"dep2.txt": "Dependence2\n",
|
|
|
|
"spanish.txt": "¡Holla mundo!\n",
|
|
|
|
"spanish-dep.txt": "¡Holla dependencia!\n",
|
|
|
|
"portuguese.txt": "Olá, mundo!\n",
|
|
|
|
"portuguese2.txt": "Olá, mundo!\n",
|
|
|
|
"german.txt": "Welt!\n",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
|
|
|
|
2017-03-16 02:15:27 +02:00
|
|
|
func TestDeps(t *testing.T) {
|
|
|
|
const dir = "testdata/deps"
|
|
|
|
|
|
|
|
files := []string{
|
|
|
|
"d1.txt",
|
|
|
|
"d2.txt",
|
|
|
|
"d3.txt",
|
|
|
|
"d11.txt",
|
|
|
|
"d12.txt",
|
|
|
|
"d13.txt",
|
|
|
|
"d21.txt",
|
|
|
|
"d22.txt",
|
|
|
|
"d23.txt",
|
|
|
|
"d31.txt",
|
|
|
|
"d32.txt",
|
|
|
|
"d33.txt",
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, f := range files {
|
2017-03-25 15:52:41 +02:00
|
|
|
_ = os.Remove(filepath.Join(dir, f))
|
2017-03-16 02:15:27 +02:00
|
|
|
}
|
|
|
|
|
2017-06-16 16:24:01 +02:00
|
|
|
e := &task.Executor{
|
2017-07-01 20:32:13 +02:00
|
|
|
Dir: dir,
|
2021-12-04 17:37:52 +02:00
|
|
|
Stdout: io.Discard,
|
|
|
|
Stderr: io.Discard,
|
2017-03-16 02:15:27 +02:00
|
|
|
}
|
2018-03-11 19:39:40 +02:00
|
|
|
assert.NoError(t, e.Setup())
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "default"}))
|
2017-03-16 02:15:27 +02:00
|
|
|
|
|
|
|
for _, f := range files {
|
|
|
|
f = filepath.Join(dir, f)
|
|
|
|
if _, err := os.Stat(f); err != nil {
|
2019-06-04 08:08:25 +02:00
|
|
|
t.Errorf("File %s should exist", f)
|
2017-03-16 02:15:27 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-03-25 15:51:30 +02:00
|
|
|
|
2017-05-17 19:37:11 +02:00
|
|
|
func TestStatus(t *testing.T) {
|
|
|
|
const dir = "testdata/status"
|
|
|
|
|
2021-04-20 15:04:21 +02:00
|
|
|
files := []string{
|
|
|
|
"foo.txt",
|
|
|
|
"bar.txt",
|
|
|
|
}
|
2017-05-17 19:37:11 +02:00
|
|
|
|
2021-04-20 15:04:21 +02:00
|
|
|
for _, f := range files {
|
|
|
|
path := filepath.Join(dir, f)
|
|
|
|
_ = os.Remove(path)
|
|
|
|
if _, err := os.Stat(path); err == nil {
|
|
|
|
t.Errorf("File should not exist: %v", err)
|
|
|
|
}
|
2017-05-17 19:37:11 +02:00
|
|
|
}
|
2017-07-01 20:32:13 +02:00
|
|
|
|
2018-02-17 20:12:41 +02:00
|
|
|
var buff bytes.Buffer
|
2017-07-01 20:32:13 +02:00
|
|
|
e := &task.Executor{
|
|
|
|
Dir: dir,
|
2018-02-17 20:12:41 +02:00
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
Silent: true,
|
2017-05-17 19:37:11 +02:00
|
|
|
}
|
2018-03-11 19:39:40 +02:00
|
|
|
assert.NoError(t, e.Setup())
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-foo"}))
|
2021-04-20 15:04:21 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-bar"}))
|
2017-07-01 20:32:13 +02:00
|
|
|
|
2021-04-20 15:04:21 +02:00
|
|
|
for _, f := range files {
|
|
|
|
if _, err := os.Stat(filepath.Join(dir, f)); err != nil {
|
|
|
|
t.Errorf("File should exist: %v", err)
|
|
|
|
}
|
2017-05-17 19:37:11 +02:00
|
|
|
}
|
|
|
|
|
2018-02-17 20:12:41 +02:00
|
|
|
e.Silent = false
|
2017-07-01 20:32:13 +02:00
|
|
|
|
2021-04-20 15:04:21 +02:00
|
|
|
// all: not up-to-date
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-foo"}))
|
2021-04-20 15:04:21 +02:00
|
|
|
assert.Equal(t, "task: [gen-foo] touch foo.txt", strings.TrimSpace(buff.String()))
|
|
|
|
buff.Reset()
|
|
|
|
// status: not up-to-date
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-foo"}))
|
|
|
|
assert.Equal(t, "task: [gen-foo] touch foo.txt", strings.TrimSpace(buff.String()))
|
|
|
|
buff.Reset()
|
2017-07-01 20:32:13 +02:00
|
|
|
|
2021-04-20 15:04:21 +02:00
|
|
|
// sources: not up-to-date
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-bar"}))
|
|
|
|
assert.Equal(t, "task: [gen-bar] touch bar.txt", strings.TrimSpace(buff.String()))
|
|
|
|
buff.Reset()
|
|
|
|
// all: up-to-date
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "gen-bar"}))
|
|
|
|
assert.Equal(t, `task: Task "gen-bar" is up to date`, strings.TrimSpace(buff.String()))
|
|
|
|
buff.Reset()
|
2017-05-17 19:37:11 +02:00
|
|
|
}
|
2017-05-17 20:38:46 +02:00
|
|
|
|
2019-05-17 22:13:47 +02:00
|
|
|
func TestPrecondition(t *testing.T) {
|
|
|
|
const dir = "testdata/precondition"
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := &task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
}
|
|
|
|
|
|
|
|
// A precondition that has been met
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "foo"}))
|
|
|
|
if buff.String() != "" {
|
|
|
|
t.Errorf("Got Output when none was expected: %s", buff.String())
|
|
|
|
}
|
|
|
|
|
|
|
|
// A precondition that was not met
|
|
|
|
assert.Error(t, e.Run(context.Background(), taskfile.Call{Task: "impossible"}))
|
|
|
|
|
2019-06-11 21:20:56 +02:00
|
|
|
if buff.String() != "task: 1 != 0 obviously!\n" {
|
2019-05-17 22:13:47 +02:00
|
|
|
t.Errorf("Wrong output message: %s", buff.String())
|
|
|
|
}
|
|
|
|
buff.Reset()
|
|
|
|
|
|
|
|
// Calling a task with a precondition in a dependency fails the task
|
2019-06-16 02:58:37 +02:00
|
|
|
assert.Error(t, e.Run(context.Background(), taskfile.Call{Task: "depends_on_impossible"}))
|
2019-05-28 22:02:59 +02:00
|
|
|
|
2019-06-11 21:20:56 +02:00
|
|
|
if buff.String() != "task: 1 != 0 obviously!\n" {
|
2019-05-17 22:13:47 +02:00
|
|
|
t.Errorf("Wrong output message: %s", buff.String())
|
|
|
|
}
|
|
|
|
buff.Reset()
|
|
|
|
|
|
|
|
// Calling a task with a precondition in a cmd fails the task
|
|
|
|
assert.Error(t, e.Run(context.Background(), taskfile.Call{Task: "executes_failing_task_as_cmd"}))
|
2019-06-11 21:20:56 +02:00
|
|
|
if buff.String() != "task: 1 != 0 obviously!\n" {
|
2019-05-17 22:13:47 +02:00
|
|
|
t.Errorf("Wrong output message: %s", buff.String())
|
|
|
|
}
|
|
|
|
buff.Reset()
|
|
|
|
}
|
|
|
|
|
2017-07-12 11:30:28 +02:00
|
|
|
func TestGenerates(t *testing.T) {
|
2021-01-07 16:17:38 +02:00
|
|
|
const dir = "testdata/generates"
|
|
|
|
|
2019-02-22 01:52:27 +02:00
|
|
|
const (
|
|
|
|
srcTask = "sub/src.txt"
|
|
|
|
relTask = "rel.txt"
|
2021-01-09 17:09:23 +02:00
|
|
|
absTask = "abs.txt"
|
2019-02-22 01:52:27 +02:00
|
|
|
fileWithSpaces = "my text file.txt"
|
|
|
|
)
|
2017-07-12 11:30:28 +02:00
|
|
|
|
|
|
|
var srcFile = filepath.Join(dir, srcTask)
|
|
|
|
|
2019-02-22 01:52:27 +02:00
|
|
|
for _, task := range []string{srcTask, relTask, absTask, fileWithSpaces} {
|
2017-07-12 11:30:28 +02:00
|
|
|
path := filepath.Join(dir, task)
|
|
|
|
_ = os.Remove(path)
|
|
|
|
if _, err := os.Stat(path); err == nil {
|
2019-06-04 08:08:25 +02:00
|
|
|
t.Errorf("File should not exist: %v", err)
|
2017-07-12 11:30:28 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
buff := bytes.NewBuffer(nil)
|
|
|
|
e := &task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: buff,
|
|
|
|
Stderr: buff,
|
|
|
|
}
|
2018-03-11 19:39:40 +02:00
|
|
|
assert.NoError(t, e.Setup())
|
2017-07-12 11:30:28 +02:00
|
|
|
|
2019-02-22 01:52:27 +02:00
|
|
|
for _, theTask := range []string{relTask, absTask, fileWithSpaces} {
|
2017-09-07 18:57:06 +02:00
|
|
|
var destFile = filepath.Join(dir, theTask)
|
2017-07-12 11:30:28 +02:00
|
|
|
var upToDate = fmt.Sprintf("task: Task \"%s\" is up to date\n", srcTask) +
|
2017-09-07 18:57:06 +02:00
|
|
|
fmt.Sprintf("task: Task \"%s\" is up to date\n", theTask)
|
2017-07-12 11:30:28 +02:00
|
|
|
|
|
|
|
// Run task for the first time.
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: theTask}))
|
2017-07-12 11:30:28 +02:00
|
|
|
|
|
|
|
if _, err := os.Stat(srcFile); err != nil {
|
2019-06-04 08:08:25 +02:00
|
|
|
t.Errorf("File should exist: %v", err)
|
2017-07-12 11:30:28 +02:00
|
|
|
}
|
|
|
|
if _, err := os.Stat(destFile); err != nil {
|
2019-06-04 08:08:25 +02:00
|
|
|
t.Errorf("File should exist: %v", err)
|
2017-07-12 11:30:28 +02:00
|
|
|
}
|
|
|
|
// Ensure task was not incorrectly found to be up-to-date on first run.
|
|
|
|
if buff.String() == upToDate {
|
|
|
|
t.Errorf("Wrong output message: %s", buff.String())
|
|
|
|
}
|
|
|
|
buff.Reset()
|
|
|
|
|
|
|
|
// Re-run task to ensure it's now found to be up-to-date.
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: theTask}))
|
2017-07-12 11:30:28 +02:00
|
|
|
if buff.String() != upToDate {
|
|
|
|
t.Errorf("Wrong output message: %s", buff.String())
|
|
|
|
}
|
|
|
|
buff.Reset()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-16 16:44:13 +02:00
|
|
|
func TestStatusChecksum(t *testing.T) {
|
|
|
|
const dir = "testdata/checksum"
|
|
|
|
|
|
|
|
files := []string{
|
|
|
|
"generated.txt",
|
2017-11-02 14:37:02 +02:00
|
|
|
".task/checksum/build",
|
2017-09-16 16:44:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, f := range files {
|
|
|
|
_ = os.Remove(filepath.Join(dir, f))
|
|
|
|
|
|
|
|
_, err := os.Stat(filepath.Join(dir, f))
|
|
|
|
assert.Error(t, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
}
|
2018-03-11 19:39:40 +02:00
|
|
|
assert.NoError(t, e.Setup())
|
2017-09-16 16:44:13 +02:00
|
|
|
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "build"}))
|
2017-09-16 16:44:13 +02:00
|
|
|
for _, f := range files {
|
|
|
|
_, err := os.Stat(filepath.Join(dir, f))
|
|
|
|
assert.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
buff.Reset()
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "build"}))
|
2017-09-16 16:44:13 +02:00
|
|
|
assert.Equal(t, `task: Task "build" is up to date`+"\n", buff.String())
|
2019-09-14 22:54:41 +02:00
|
|
|
}
|
2019-06-11 20:49:37 +02:00
|
|
|
|
2020-06-14 11:02:25 +02:00
|
|
|
func TestLabelUpToDate(t *testing.T) {
|
|
|
|
const dir = "testdata/label_uptodate"
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "foo"}))
|
|
|
|
assert.Contains(t, buff.String(), "foobar")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLabelSummary(t *testing.T) {
|
|
|
|
const dir = "testdata/label_summary"
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Summary: true,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "foo"}))
|
|
|
|
assert.Contains(t, buff.String(), "foobar")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLabelInStatus(t *testing.T) {
|
|
|
|
const dir = "testdata/label_status"
|
|
|
|
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
err := e.Status(context.Background(), taskfile.Call{Task: "foo"})
|
|
|
|
if assert.Error(t, err) {
|
|
|
|
assert.Contains(t, err.Error(), "foobar")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLabelWithVariableExpansion(t *testing.T) {
|
|
|
|
const dir = "testdata/label_var"
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "foo"}))
|
|
|
|
assert.Contains(t, buff.String(), "foobaz")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLabelInSummary(t *testing.T) {
|
|
|
|
const dir = "testdata/label_summary"
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "foo"}))
|
|
|
|
assert.Contains(t, buff.String(), "foobar")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLabelInList(t *testing.T) {
|
|
|
|
const dir = "testdata/label_list"
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
2022-01-04 22:16:21 +02:00
|
|
|
e.ListTasksWithDesc()
|
2020-06-14 11:02:25 +02:00
|
|
|
assert.Contains(t, buff.String(), "foobar")
|
|
|
|
}
|
|
|
|
|
2020-11-13 23:24:34 +02:00
|
|
|
// task -al case 1: listAll list all tasks
|
|
|
|
func TestListAllShowsNoDesc(t *testing.T) {
|
|
|
|
const dir = "testdata/list_mixed_desc"
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
|
|
|
|
var title string
|
2022-01-03 19:12:18 +02:00
|
|
|
e.ListAllTasks()
|
2020-11-13 23:24:34 +02:00
|
|
|
for _, title = range []string{
|
|
|
|
"foo",
|
|
|
|
"voo",
|
|
|
|
"doo",
|
|
|
|
} {
|
|
|
|
assert.Contains(t, buff.String(), title)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// task -al case 2: !listAll list some tasks (only those with desc)
|
|
|
|
func TestListCanListDescOnly(t *testing.T) {
|
|
|
|
const dir = "testdata/list_mixed_desc"
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.NoError(t, e.Setup())
|
2022-01-03 19:12:18 +02:00
|
|
|
e.ListTasksWithDesc()
|
2020-11-13 23:24:34 +02:00
|
|
|
|
|
|
|
var title string
|
|
|
|
assert.Contains(t, buff.String(), "foo")
|
|
|
|
for _, title = range []string{
|
|
|
|
"voo",
|
|
|
|
"doo",
|
|
|
|
} {
|
|
|
|
assert.NotContains(t, buff.String(), title)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-14 22:54:41 +02:00
|
|
|
func TestStatusVariables(t *testing.T) {
|
2019-09-14 23:04:41 +02:00
|
|
|
const dir = "testdata/status_vars"
|
2019-09-14 22:54:41 +02:00
|
|
|
|
2019-09-14 23:04:41 +02:00
|
|
|
_ = os.RemoveAll(filepath.Join(dir, ".task"))
|
|
|
|
_ = os.Remove(filepath.Join(dir, "generated.txt"))
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
Silent: false,
|
|
|
|
Verbose: true,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "build"}))
|
|
|
|
|
|
|
|
assert.Contains(t, buff.String(), "d41d8cd98f00b204e9800998ecf8427e")
|
|
|
|
|
|
|
|
inf, err := os.Stat(filepath.Join(dir, "source.txt"))
|
|
|
|
assert.NoError(t, err)
|
|
|
|
ts := fmt.Sprintf("%d", inf.ModTime().Unix())
|
|
|
|
tf := fmt.Sprintf("%s", inf.ModTime())
|
|
|
|
|
|
|
|
assert.Contains(t, buff.String(), ts)
|
|
|
|
assert.Contains(t, buff.String(), tf)
|
2017-09-16 16:44:13 +02:00
|
|
|
}
|
|
|
|
|
2017-05-17 20:38:46 +02:00
|
|
|
func TestInit(t *testing.T) {
|
|
|
|
const dir = "testdata/init"
|
2021-12-04 17:37:52 +02:00
|
|
|
var file = filepath.Join(dir, "Taskfile.yaml")
|
2017-05-17 20:38:46 +02:00
|
|
|
|
|
|
|
_ = os.Remove(file)
|
|
|
|
if _, err := os.Stat(file); err == nil {
|
2021-12-04 17:37:52 +02:00
|
|
|
t.Errorf("Taskfile.yaml should not exist")
|
2017-05-17 20:38:46 +02:00
|
|
|
}
|
|
|
|
|
2021-12-04 17:37:52 +02:00
|
|
|
if err := task.InitTaskfile(io.Discard, dir); err != nil {
|
2017-05-17 20:38:46 +02:00
|
|
|
t.Error(err)
|
|
|
|
}
|
2017-07-01 20:32:13 +02:00
|
|
|
|
2017-05-17 20:38:46 +02:00
|
|
|
if _, err := os.Stat(file); err != nil {
|
2021-12-04 17:37:52 +02:00
|
|
|
t.Errorf("Taskfile.yaml should exist")
|
2017-05-17 20:38:46 +02:00
|
|
|
}
|
2021-12-04 17:37:52 +02:00
|
|
|
_ = os.Remove(file)
|
2017-05-17 20:38:46 +02:00
|
|
|
}
|
2017-07-02 20:30:50 +02:00
|
|
|
|
2017-07-08 18:33:55 +02:00
|
|
|
func TestCyclicDep(t *testing.T) {
|
|
|
|
const dir = "testdata/cyclic"
|
|
|
|
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
2021-12-04 17:37:52 +02:00
|
|
|
Stdout: io.Discard,
|
|
|
|
Stderr: io.Discard,
|
2017-07-08 18:33:55 +02:00
|
|
|
}
|
2018-03-11 19:39:40 +02:00
|
|
|
assert.NoError(t, e.Setup())
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.IsType(t, &task.MaximumTaskCallExceededError{}, e.Run(context.Background(), taskfile.Call{Task: "task-1"}))
|
2017-07-08 18:33:55 +02:00
|
|
|
}
|
2017-12-29 22:27:32 +02:00
|
|
|
|
|
|
|
func TestTaskVersion(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
|
|
Dir string
|
2018-03-03 23:54:42 +02:00
|
|
|
Version string
|
2017-12-29 22:27:32 +02:00
|
|
|
}{
|
2018-03-03 23:54:42 +02:00
|
|
|
{"testdata/version/v2", "2"},
|
2017-12-29 22:27:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, test := range tests {
|
|
|
|
t.Run(test.Dir, func(t *testing.T) {
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: test.Dir,
|
2021-12-04 17:37:52 +02:00
|
|
|
Stdout: io.Discard,
|
|
|
|
Stderr: io.Discard,
|
2017-12-29 22:27:32 +02:00
|
|
|
}
|
2018-03-11 19:39:40 +02:00
|
|
|
assert.NoError(t, e.Setup())
|
2017-12-29 22:27:32 +02:00
|
|
|
assert.Equal(t, test.Version, e.Taskfile.Version)
|
|
|
|
assert.Equal(t, 2, len(e.Taskfile.Tasks))
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
2018-07-10 10:44:58 +02:00
|
|
|
|
|
|
|
func TestTaskIgnoreErrors(t *testing.T) {
|
|
|
|
const dir = "testdata/ignore_errors"
|
|
|
|
|
2018-08-05 17:56:55 +02:00
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
2021-12-04 17:37:52 +02:00
|
|
|
Stdout: io.Discard,
|
|
|
|
Stderr: io.Discard,
|
2018-08-05 17:56:55 +02:00
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "task-should-pass"}))
|
|
|
|
assert.Error(t, e.Run(context.Background(), taskfile.Call{Task: "task-should-fail"}))
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "cmd-should-pass"}))
|
|
|
|
assert.Error(t, e.Run(context.Background(), taskfile.Call{Task: "cmd-should-fail"}))
|
2018-07-10 10:44:58 +02:00
|
|
|
}
|
2018-08-01 10:47:25 +02:00
|
|
|
|
2018-07-15 20:37:20 +02:00
|
|
|
func TestExpand(t *testing.T) {
|
|
|
|
const dir = "testdata/expand"
|
|
|
|
|
2019-09-09 03:07:48 +02:00
|
|
|
home, err := os.UserHomeDir()
|
2018-07-15 20:37:20 +02:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("Couldn't get $HOME: %v", err)
|
|
|
|
}
|
|
|
|
var buff bytes.Buffer
|
|
|
|
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "pwd"}))
|
2018-07-15 20:37:20 +02:00
|
|
|
assert.Equal(t, home, strings.TrimSpace(buff.String()))
|
|
|
|
}
|
2018-08-01 00:09:55 +02:00
|
|
|
|
2018-08-05 16:28:02 +02:00
|
|
|
func TestDry(t *testing.T) {
|
|
|
|
const dir = "testdata/dry"
|
2018-08-01 00:09:55 +02:00
|
|
|
|
|
|
|
file := filepath.Join(dir, "file.txt")
|
|
|
|
_ = os.Remove(file)
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
2018-08-05 16:28:02 +02:00
|
|
|
Dry: true,
|
2018-08-01 00:09:55 +02:00
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
2019-02-09 14:16:13 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "build"}))
|
2018-08-01 00:09:55 +02:00
|
|
|
|
2020-11-05 22:27:42 +02:00
|
|
|
assert.Equal(t, "task: [build] touch file.txt", strings.TrimSpace(buff.String()))
|
2018-08-01 00:09:55 +02:00
|
|
|
if _, err := os.Stat(file); err == nil {
|
|
|
|
t.Errorf("File should not exist %s", file)
|
|
|
|
}
|
|
|
|
}
|
2018-10-13 21:56:51 +02:00
|
|
|
|
2019-02-09 14:41:19 +02:00
|
|
|
// TestDryChecksum tests if the checksum file is not being written to disk
|
|
|
|
// if the dry mode is enabled.
|
|
|
|
func TestDryChecksum(t *testing.T) {
|
|
|
|
const dir = "testdata/dry_checksum"
|
|
|
|
|
|
|
|
checksumFile := filepath.Join(dir, ".task/checksum/default")
|
|
|
|
_ = os.Remove(checksumFile)
|
|
|
|
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
2021-12-04 17:37:52 +02:00
|
|
|
Stdout: io.Discard,
|
|
|
|
Stderr: io.Discard,
|
2019-02-09 14:41:19 +02:00
|
|
|
Dry: true,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "default"}))
|
|
|
|
|
|
|
|
_, err := os.Stat(checksumFile)
|
|
|
|
assert.Error(t, err, "checksum file should not exist")
|
|
|
|
|
|
|
|
e.Dry = false
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "default"}))
|
|
|
|
_, err = os.Stat(checksumFile)
|
|
|
|
assert.NoError(t, err, "checksum file should exist")
|
|
|
|
}
|
|
|
|
|
2018-10-13 21:56:51 +02:00
|
|
|
func TestIncludes(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/includes",
|
|
|
|
Target: "default",
|
|
|
|
TrimSpace: true,
|
|
|
|
Files: map[string]string{
|
2020-01-29 10:25:11 +02:00
|
|
|
"main.txt": "main",
|
|
|
|
"included_directory.txt": "included_directory",
|
|
|
|
"included_directory_without_dir.txt": "included_directory_without_dir",
|
|
|
|
"included_taskfile_without_dir.txt": "included_taskfile_without_dir",
|
|
|
|
"./module2/included_directory_with_dir.txt": "included_directory_with_dir",
|
|
|
|
"./module2/included_taskfile_with_dir.txt": "included_taskfile_with_dir",
|
2020-05-17 21:03:03 +02:00
|
|
|
"os_include.txt": "os",
|
2018-10-13 21:56:51 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
2018-12-02 18:17:32 +02:00
|
|
|
|
2020-02-15 16:24:06 +02:00
|
|
|
func TestIncorrectVersionIncludes(t *testing.T) {
|
|
|
|
const dir = "testdata/incorrect_includes"
|
|
|
|
expectedError := "task: Import with additional parameters is only available starting on Taskfile version v3"
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
Silent: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.EqualError(t, e.Setup(), expectedError)
|
|
|
|
}
|
|
|
|
|
2018-12-02 18:17:32 +02:00
|
|
|
func TestIncludesEmptyMain(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/includes_empty",
|
|
|
|
Target: "included:default",
|
|
|
|
TrimSpace: true,
|
|
|
|
Files: map[string]string{
|
|
|
|
"file.txt": "default",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
2018-12-09 19:54:58 +02:00
|
|
|
|
|
|
|
func TestIncludesDependencies(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/includes_deps",
|
|
|
|
Target: "default",
|
|
|
|
TrimSpace: true,
|
|
|
|
Files: map[string]string{
|
|
|
|
"default.txt": "default",
|
|
|
|
"called_dep.txt": "called_dep",
|
|
|
|
"called_task.txt": "called_task",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
2019-02-03 01:12:57 +02:00
|
|
|
|
|
|
|
func TestIncludesCallingRoot(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/includes_call_root_task",
|
|
|
|
Target: "included:call-root",
|
|
|
|
TrimSpace: true,
|
|
|
|
Files: map[string]string{
|
|
|
|
"root_task.txt": "root task",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
2019-02-24 10:53:49 +02:00
|
|
|
|
2021-08-11 18:28:44 +02:00
|
|
|
func TestIncludesOptional(t *testing.T) {
|
2021-12-04 17:37:52 +02:00
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/includes_optional",
|
|
|
|
Target: "default",
|
|
|
|
TrimSpace: true,
|
|
|
|
Files: map[string]string{
|
|
|
|
"called_dep.txt": "called_dep",
|
|
|
|
}}
|
|
|
|
tt.Run(t)
|
2021-08-11 18:28:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestIncludesOptionalImplicitFalse(t *testing.T) {
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: "testdata/includes_optional_implicit_false",
|
2021-12-04 17:37:52 +02:00
|
|
|
Stdout: io.Discard,
|
|
|
|
Stderr: io.Discard,
|
2021-08-11 18:28:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
err := e.Setup()
|
|
|
|
assert.Error(t, err)
|
|
|
|
assert.Equal(t, "stat testdata/includes_optional_implicit_false/TaskfileOptional.yml: no such file or directory", err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestIncludesOptionalExplicitFalse(t *testing.T) {
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: "testdata/includes_optional_explicit_false",
|
2021-12-04 17:37:52 +02:00
|
|
|
Stdout: io.Discard,
|
|
|
|
Stderr: io.Discard,
|
2021-08-11 18:28:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
err := e.Setup()
|
|
|
|
assert.Error(t, err)
|
|
|
|
assert.Equal(t, "stat testdata/includes_optional_explicit_false/TaskfileOptional.yml: no such file or directory", err.Error())
|
|
|
|
}
|
|
|
|
|
2021-12-04 17:37:52 +02:00
|
|
|
func TestIncludesFromCustomTaskfile(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/includes_yaml",
|
|
|
|
Entrypoint: "Custom.ext",
|
|
|
|
Target: "default",
|
|
|
|
TrimSpace: true,
|
|
|
|
Files: map[string]string{
|
|
|
|
"main.txt": "main",
|
|
|
|
"included_with_yaml_extension.txt": "included_with_yaml_extension",
|
|
|
|
"included_with_custom_file.txt": "included_with_custom_file",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
|
|
|
|
2019-02-24 16:54:11 +02:00
|
|
|
func TestSummary(t *testing.T) {
|
2019-02-24 16:37:02 +02:00
|
|
|
const dir = "testdata/summary"
|
2019-02-24 10:53:49 +02:00
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
2019-02-24 16:33:09 +02:00
|
|
|
Summary: true,
|
2019-02-24 12:01:48 +02:00
|
|
|
Silent: true,
|
2019-02-24 10:53:49 +02:00
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
2019-03-04 13:13:13 +02:00
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "task-with-summary"}, taskfile.Call{Task: "other-task-with-summary"}))
|
2019-02-24 15:20:39 +02:00
|
|
|
|
2021-12-04 17:37:52 +02:00
|
|
|
data, err := os.ReadFile(filepath.Join(dir, "task-with-summary.txt"))
|
2019-09-02 03:26:53 +02:00
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
expectedOutput := string(data)
|
|
|
|
if runtime.GOOS == "windows" {
|
|
|
|
expectedOutput = strings.Replace(expectedOutput, "\r\n", "\n", -1)
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.Equal(t, expectedOutput, buff.String())
|
2019-02-24 15:20:39 +02:00
|
|
|
}
|
2019-06-04 09:45:11 +02:00
|
|
|
|
|
|
|
func TestWhenNoDirAttributeItRunsInSameDirAsTaskfile(t *testing.T) {
|
|
|
|
const expected = "dir"
|
|
|
|
const dir = "testdata/" + expected
|
|
|
|
var out bytes.Buffer
|
|
|
|
e := &task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &out,
|
|
|
|
Stderr: &out,
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "whereami"}))
|
|
|
|
|
|
|
|
// got should be the "dir" part of "testdata/dir"
|
|
|
|
got := strings.TrimSuffix(filepath.Base(out.String()), "\n")
|
|
|
|
assert.Equal(t, expected, got, "Mismatch in the working directory")
|
|
|
|
}
|
|
|
|
|
2019-06-04 18:36:35 +02:00
|
|
|
func TestWhenDirAttributeAndDirExistsItRunsInThatDir(t *testing.T) {
|
|
|
|
const expected = "exists"
|
|
|
|
const dir = "testdata/dir/explicit_exists"
|
|
|
|
var out bytes.Buffer
|
|
|
|
e := &task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &out,
|
|
|
|
Stderr: &out,
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "whereami"}))
|
|
|
|
|
|
|
|
got := strings.TrimSuffix(filepath.Base(out.String()), "\n")
|
|
|
|
assert.Equal(t, expected, got, "Mismatch in the working directory")
|
|
|
|
}
|
|
|
|
|
2019-06-04 18:58:22 +02:00
|
|
|
func TestWhenDirAttributeItCreatesMissingAndRunsInThatDir(t *testing.T) {
|
|
|
|
const expected = "createme"
|
|
|
|
const dir = "testdata/dir/explicit_doesnt_exist/"
|
|
|
|
const toBeCreated = dir + expected
|
|
|
|
const target = "whereami"
|
|
|
|
var out bytes.Buffer
|
|
|
|
e := &task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &out,
|
|
|
|
Stderr: &out,
|
|
|
|
}
|
|
|
|
|
|
|
|
// Ensure that the directory to be created doesn't actually exist.
|
2019-09-09 03:51:56 +02:00
|
|
|
_ = os.RemoveAll(toBeCreated)
|
2019-06-04 18:58:22 +02:00
|
|
|
if _, err := os.Stat(toBeCreated); err == nil {
|
|
|
|
t.Errorf("Directory should not exist: %v", err)
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: target}))
|
|
|
|
|
|
|
|
got := strings.TrimSuffix(filepath.Base(out.String()), "\n")
|
|
|
|
assert.Equal(t, expected, got, "Mismatch in the working directory")
|
|
|
|
|
|
|
|
// Clean-up after ourselves only if no error.
|
2019-09-09 03:51:56 +02:00
|
|
|
_ = os.RemoveAll(toBeCreated)
|
2021-01-07 16:17:38 +02:00
|
|
|
}
|
|
|
|
|
2021-09-26 15:30:32 +02:00
|
|
|
func TestDynamicVariablesRunOnTheNewCreatedDir(t *testing.T) {
|
|
|
|
const expected = "created"
|
|
|
|
const dir = "testdata/dir/dynamic_var_on_created_dir/"
|
|
|
|
const toBeCreated = dir + expected
|
|
|
|
const target = "default"
|
|
|
|
var out bytes.Buffer
|
|
|
|
e := &task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &out,
|
|
|
|
Stderr: &out,
|
|
|
|
}
|
|
|
|
|
|
|
|
// Ensure that the directory to be created doesn't actually exist.
|
|
|
|
_ = os.RemoveAll(toBeCreated)
|
|
|
|
if _, err := os.Stat(toBeCreated); err == nil {
|
|
|
|
t.Errorf("Directory should not exist: %v", err)
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: target}))
|
2019-06-04 18:58:22 +02:00
|
|
|
|
|
|
|
got := strings.TrimSuffix(filepath.Base(out.String()), "\n")
|
|
|
|
assert.Equal(t, expected, got, "Mismatch in the working directory")
|
|
|
|
|
|
|
|
// Clean-up after ourselves only if no error.
|
2019-09-09 03:51:56 +02:00
|
|
|
_ = os.RemoveAll(toBeCreated)
|
2021-01-07 16:17:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestDynamicVariablesShouldRunOnTheTaskDir(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/dir/dynamic_var",
|
|
|
|
Target: "default",
|
|
|
|
TrimSpace: false,
|
|
|
|
Files: map[string]string{
|
2021-01-09 17:09:23 +02:00
|
|
|
"subdirectory/from_root_taskfile.txt": "subdirectory\n",
|
|
|
|
"subdirectory/from_included_taskfile.txt": "subdirectory\n",
|
|
|
|
"subdirectory/from_included_taskfile_task.txt": "subdirectory\n",
|
|
|
|
"subdirectory/from_interpolated_dir.txt": "subdirectory\n",
|
2021-01-07 16:17:38 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
2019-06-04 18:58:22 +02:00
|
|
|
}
|
2019-08-18 17:37:21 +02:00
|
|
|
|
|
|
|
func TestDisplaysErrorOnUnsupportedVersion(t *testing.T) {
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: "testdata/version/v1",
|
2021-12-04 17:37:52 +02:00
|
|
|
Stdout: io.Discard,
|
|
|
|
Stderr: io.Discard,
|
2019-08-18 17:37:21 +02:00
|
|
|
}
|
2019-08-19 21:01:01 +02:00
|
|
|
err := e.Setup()
|
|
|
|
assert.Error(t, err)
|
|
|
|
assert.Equal(t, "task: Taskfile versions prior to v2 are not supported anymore", err.Error())
|
|
|
|
|
2019-08-18 17:37:21 +02:00
|
|
|
}
|
2019-12-08 02:28:02 +02:00
|
|
|
|
|
|
|
func TestShortTaskNotation(t *testing.T) {
|
|
|
|
const dir = "testdata/short_task_notation"
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
Silent: true,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "default"}))
|
|
|
|
assert.Equal(t, "string-slice-1\nstring-slice-2\nstring\n", buff.String())
|
|
|
|
}
|
2020-08-04 00:18:38 +02:00
|
|
|
|
|
|
|
func TestDotenvShouldIncludeAllEnvFiles(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
2020-10-04 00:39:58 +02:00
|
|
|
Dir: "testdata/dotenv/default",
|
2020-08-04 00:18:38 +02:00
|
|
|
Target: "default",
|
|
|
|
TrimSpace: false,
|
|
|
|
Files: map[string]string{
|
2020-08-16 20:48:19 +02:00
|
|
|
"include.txt": "INCLUDE1='from_include1' INCLUDE2='from_include2'\n",
|
2020-08-04 00:18:38 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDotenvShouldErrorWhenIncludingDependantDotenvs(t *testing.T) {
|
2020-10-04 00:39:58 +02:00
|
|
|
const dir = "testdata/dotenv/error_included_envs"
|
|
|
|
const entry = "Taskfile.yml"
|
2020-08-04 00:18:38 +02:00
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
2020-08-16 20:48:19 +02:00
|
|
|
Dir: dir,
|
2020-08-04 00:18:38 +02:00
|
|
|
Entrypoint: entry,
|
2020-08-16 20:48:19 +02:00
|
|
|
Summary: true,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
2020-08-04 00:18:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
err := e.Setup()
|
|
|
|
assert.Error(t, err)
|
|
|
|
assert.Contains(t, err.Error(), "move the dotenv")
|
|
|
|
}
|
2020-10-04 00:39:58 +02:00
|
|
|
|
|
|
|
func TestDotenvShouldAllowMissingEnv(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/dotenv/missing_env",
|
|
|
|
Target: "default",
|
|
|
|
TrimSpace: false,
|
|
|
|
Files: map[string]string{
|
|
|
|
"include.txt": "INCLUDE1='' INCLUDE2=''\n",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
2020-12-27 22:15:12 +02:00
|
|
|
|
2021-06-05 20:54:10 +02:00
|
|
|
func TestDotenvHasLocalEnvInPath(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/dotenv/local_env_in_path",
|
|
|
|
Target: "default",
|
|
|
|
TrimSpace: false,
|
|
|
|
Files: map[string]string{
|
|
|
|
"var.txt": "VAR='var_in_dot_env_1'\n",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDotenvHasLocalVarInPath(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/dotenv/local_var_in_path",
|
|
|
|
Target: "default",
|
|
|
|
TrimSpace: false,
|
|
|
|
Files: map[string]string{
|
|
|
|
"var.txt": "VAR='var_in_dot_env_3'\n",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDotenvHasEnvVarInPath(t *testing.T) {
|
|
|
|
os.Setenv("ENV_VAR", "testing")
|
|
|
|
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/dotenv/env_var_in_path",
|
|
|
|
Target: "default",
|
|
|
|
TrimSpace: false,
|
|
|
|
Files: map[string]string{
|
|
|
|
"var.txt": "VAR='var_in_dot_env_2'\n",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
|
|
|
|
2020-12-27 22:15:12 +02:00
|
|
|
func TestExitImmediately(t *testing.T) {
|
|
|
|
const dir = "testdata/exit_immediately"
|
|
|
|
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
Silent: true,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
|
|
|
|
assert.Error(t, e.Run(context.Background(), taskfile.Call{Task: "default"}))
|
|
|
|
assert.Contains(t, buff.String(), `"this_should_fail": executable file not found in $PATH`)
|
|
|
|
}
|
2020-08-17 21:25:17 +02:00
|
|
|
|
|
|
|
func TestRunOnlyRunsJobsHashOnce(t *testing.T) {
|
|
|
|
tt := fileContentTest{
|
|
|
|
Dir: "testdata/run",
|
|
|
|
Target: "generate-hash",
|
|
|
|
Files: map[string]string{
|
|
|
|
"hash.txt": "starting 1\n1\n2\n",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
tt.Run(t)
|
|
|
|
}
|
2021-09-14 17:01:33 +02:00
|
|
|
|
2021-12-15 07:03:37 +02:00
|
|
|
func TestDeferredCmds(t *testing.T) {
|
|
|
|
const dir = "testdata/deferred"
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
|
|
|
|
expectedOutputOrder := strings.TrimSpace(`
|
|
|
|
task: [task-2] echo 'cmd ran'
|
|
|
|
cmd ran
|
|
|
|
task: [task-2] exit 1
|
|
|
|
task: [task-2] echo 'failing' && exit 2
|
|
|
|
failing
|
|
|
|
task: [task-2] echo 'echo ran'
|
|
|
|
echo ran
|
2022-01-02 23:38:06 +02:00
|
|
|
task: [task-1] echo 'task-1 ran successfully'
|
|
|
|
task-1 ran successfully
|
2021-12-15 07:03:37 +02:00
|
|
|
`)
|
|
|
|
assert.Error(t, e.Run(context.Background(), taskfile.Call{Task: "task-2"}))
|
|
|
|
fmt.Println(buff.String())
|
|
|
|
assert.Contains(t, buff.String(), expectedOutputOrder)
|
|
|
|
}
|
|
|
|
|
2021-09-14 17:01:33 +02:00
|
|
|
func TestIgnoreNilElements(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
dir string
|
|
|
|
}{
|
|
|
|
{"nil cmd", "testdata/ignore_nil_elements/cmds"},
|
|
|
|
{"nil dep", "testdata/ignore_nil_elements/deps"},
|
2021-12-04 17:37:52 +02:00
|
|
|
{"nil include", "testdata/ignore_nil_elements/includes"},
|
2021-09-14 17:01:33 +02:00
|
|
|
{"nil precondition", "testdata/ignore_nil_elements/preconditions"},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, test := range tests {
|
|
|
|
t.Run(test.name, func(t *testing.T) {
|
|
|
|
var buff bytes.Buffer
|
|
|
|
e := task.Executor{
|
|
|
|
Dir: test.dir,
|
|
|
|
Stdout: &buff,
|
|
|
|
Stderr: &buff,
|
|
|
|
Silent: true,
|
|
|
|
}
|
|
|
|
assert.NoError(t, e.Setup())
|
|
|
|
assert.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "default"}))
|
|
|
|
assert.Equal(t, "string-slice-1\n", buff.String())
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|