coca_test.go 1.1 KB
Newer Older
P
Phodal Huang 已提交
1 2 3 4
package cmd

import (
	"bytes"
P
Phodal Huang 已提交
5
	"github.com/mattn/go-shellwords"
P
Phodal Huang 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
	"github.com/spf13/cobra"
	"os"
	"strings"
	"testing"
)

// cmdTestCase describes a test case that works with releases.
type cmdTestCase struct {
	name      string
	cmd       string
	golden    string
	wantError bool
}

func runTestCmd(t *testing.T, tests []cmdTestCase) {
	t.Helper()
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			defer resetEnv()()

			t.Log("running cmd: ", tt.cmd)
			_, output, err := executeActionCommandC(tt.cmd)
			if (err != nil) != tt.wantError {
				t.Errorf("expected error, got '%v'", err)
			}
			if tt.golden != "" {
				AssertGoldenString(t, output, tt.golden)
			}
		})
	}
}

func executeActionCommandC(cmd string) (*cobra.Command, string, error) {
	args, err := shellwords.Parse(cmd)
	if err != nil {
		return nil, "", err
	}
	buf := new(bytes.Buffer)

45
	rootCmd.SetOut(buf)
P
Phodal Huang 已提交
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
	rootCmd.SetArgs(args)

	c, err := rootCmd.ExecuteC()

	return c, buf.String(), err
}

func resetEnv() func() {
	origEnv := os.Environ()
	return func() {
		os.Clearenv()
		for _, pair := range origEnv {
			kv := strings.SplitN(pair, "=", 2)
			os.Setenv(kv[0], kv[1])
		}
	}
}