From 70de1597eb2b1586bd499814158b2546fff6f9a7 Mon Sep 17 00:00:00 2001 From: Christopher Phillips Date: Tue, 13 Feb 2024 12:08:07 -0500 Subject: [PATCH] test: add cli test framework Signed-off-by: Christopher Phillips --- cmd/grant/cli/cli.go | 8 +++++-- test/cli/main_test.go | 38 +++++++++++++++++++++++++++++++++ test/cli/utils_test.go | 11 ++++++++++ test/cli/version_test.go | 46 ++++++++++++++++++++++++++++++---------- 4 files changed, 90 insertions(+), 13 deletions(-) create mode 100644 test/cli/main_test.go diff --git a/cmd/grant/cli/cli.go b/cmd/grant/cli/cli.go index 654a7b9..7588ebc 100644 --- a/cmd/grant/cli/cli.go +++ b/cmd/grant/cli/cli.go @@ -55,8 +55,12 @@ func New(id clio.Identification) clio.Application { root := command.Root(app) - root.AddCommand(command.Check(app)) - root.AddCommand(command.List(app)) + root.AddCommand( + command.Check(app), + command.List(app), + clio.VersionCommand(id), + ) + // root.AddCommand(command.Inspect(app)) return app diff --git a/test/cli/main_test.go b/test/cli/main_test.go new file mode 100644 index 0000000..2ec45ac --- /dev/null +++ b/test/cli/main_test.go @@ -0,0 +1,38 @@ +package cli + +import ( + "log" + "os" + "os/exec" + "testing" +) + +const grantTmpPath = "../../.tmp/grant" + +func buildBinary() (string, error) { + buildCmd := exec.Command("go", "build", "-o", grantTmpPath, "../../cmd/grant/main.go") // Adjust the last argument to your package path if necessary + err := buildCmd.Run() + return grantTmpPath, err +} + +// setup function that you want to run before any tests +func setup(m *testing.M) { + _, err := buildBinary() + if err != nil { + log.Fatalf("Failed to build binary: %v", err) + } +} + +// teardown function to clean up after the tests +func teardown() { + // Your cleanup code here + println("Running teardown after all tests.") +} + +// TestMain is the entry point for testing +func TestMain(m *testing.M) { + setup(m) // Call setup + code := m.Run() // Run the tests and store the result + teardown() // Call teardown + os.Exit(code) // Exit with the result of the tests +} diff --git a/test/cli/utils_test.go b/test/cli/utils_test.go index 7f1e458..28182fc 100644 --- a/test/cli/utils_test.go +++ b/test/cli/utils_test.go @@ -1 +1,12 @@ package cli + +import "os" + +func fileExists(filename string) bool { + info, err := os.Stat(filename) + if os.IsNotExist(err) { + return false + } + // We also check if the file might actually be a directory. + return !info.IsDir() +} diff --git a/test/cli/version_test.go b/test/cli/version_test.go index 44baa67..823884b 100644 --- a/test/cli/version_test.go +++ b/test/cli/version_test.go @@ -1,29 +1,53 @@ package cli -import "testing" +import ( + "os/exec" + "testing" + "github.com/stretchr/testify/assert" +) + +// Note main_test.go is used to set up and teardown the tests. This is the entry point for testing and +// responsible for building the most recent version of the grant binary. func Test_VersionCommand(t *testing.T) { tests := []struct { - name string - command string + name string + command string + expectedInOutput []string }{ { - name: "text output", - command: "version", + name: "text output", + command: "--version", + expectedInOutput: []string{"[not provided]"}, }, { - name: "json output", - command: "version -o json", - }, - { - name: "root command short version output", - command: "--version", + name: "long form", + command: "version", + expectedInOutput: []string{ + "Application:", + "Version:", + "BuildDate:", + "GitCommit:", + "GitDescription:", + "Platform:", + "GoVersion:", + "Compiler:", + }, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { + // check if the command is available + cmd := exec.Command(grantTmpPath, test.command) + output, err := cmd.CombinedOutput() + if err != nil { + t.Fatalf("command failed: %v: cmd output: %s", err, string(output)) + } + for _, expected := range test.expectedInOutput { + assert.Contains(t, string(output), expected, "expected output: %s not found in command output: %s", expected, string(output)) + } }) } }