package main import ( "strings" "testing" ) type execArgs struct { gomplate bool argPrefixes []string } func TestRun(t *testing.T) { tests := []struct { name string args []string execReturns error whichReturns string wantExecArgs execArgs wantErr error }{ { name: "executable not dex", args: []string{"tuna", "fish"}, wantExecArgs: execArgs{gomplate: false, argPrefixes: []string{"tuna", "fish"}}, }, { name: "executable is full path to dex", args: []string{"/usr/local/bin/dex", "marshmallow", "zelda"}, whichReturns: "/usr/local/bin/dex", wantExecArgs: execArgs{gomplate: false, argPrefixes: []string{"/usr/local/bin/dex", "marshmallow", "zelda"}}, }, { name: "command is not serve", args: []string{"dex", "marshmallow", "zelda"}, wantExecArgs: execArgs{gomplate: false, argPrefixes: []string{"dex", "marshmallow", "zelda"}}, }, { name: "no templates", args: []string{"dex", "serve", "config.yaml.not-a-template"}, wantExecArgs: execArgs{gomplate: false, argPrefixes: []string{"dex", "serve", "config.yaml.not-a-template"}}, }, { name: "no templates", args: []string{"dex", "serve", "config.yaml.not-a-template"}, wantExecArgs: execArgs{gomplate: false, argPrefixes: []string{"dex", "serve", "config.yaml.not-a-template"}}, }, { name: ".tpl template", args: []string{"dex", "serve", "config.tpl"}, wantExecArgs: execArgs{gomplate: true, argPrefixes: []string{"dex", "serve", "/tmp/dex.config.yaml-"}}, }, { name: ".tmpl template", args: []string{"dex", "serve", "config.tmpl"}, wantExecArgs: execArgs{gomplate: true, argPrefixes: []string{"dex", "serve", "/tmp/dex.config.yaml-"}}, }, { name: ".yaml template", args: []string{"dex", "serve", "some/path/config.yaml"}, wantExecArgs: execArgs{gomplate: true, argPrefixes: []string{"dex", "serve", "/tmp/dex.config.yaml-"}}, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { var gotExecArgs []string var runsGomplate bool fakeExec := func(args ...string) error { gotExecArgs = append(args, gotExecArgs...) return test.execReturns } fakeWhich := func(_ string) string { return test.whichReturns } fakeGomplate := func(file string) (string, error) { runsGomplate = true return "/tmp/dex.config.yaml-", nil } gotErr := run(test.args, fakeExec, fakeWhich, fakeGomplate) if (test.wantErr == nil) != (gotErr == nil) { t.Errorf("wanted error %s, got %s", test.wantErr, gotErr) } if !execArgsMatch(test.wantExecArgs, runsGomplate, gotExecArgs) { t.Errorf("wanted exec args %+v (running gomplate: %+v), got %+v (running gomplate: %+v)", test.wantExecArgs.argPrefixes, test.wantExecArgs.gomplate, gotExecArgs, runsGomplate) } }) } } func execArgsMatch(wantExecArgs execArgs, gomplate bool, gotExecArgs []string) bool { if wantExecArgs.gomplate != gomplate { return false } for i := range wantExecArgs.argPrefixes { if !strings.HasPrefix(gotExecArgs[i], wantExecArgs.argPrefixes[i]) { return false } } return true }