get.porter.sh/porter@v1.3.0/cmd/porter/bundle_test.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"os"
     6  	"strings"
     7  	"testing"
     8  
     9  	"get.porter.sh/porter/pkg"
    10  	"get.porter.sh/porter/tests"
    11  
    12  	"get.porter.sh/porter/pkg/porter"
    13  	"github.com/spf13/cobra"
    14  	"github.com/stretchr/testify/assert"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestValidateInstallCommand(t *testing.T) {
    19  	testcases := []struct {
    20  		name      string
    21  		args      string
    22  		wantError string
    23  		wantOut   string
    24  	}{
    25  		{"no args", "install -r ghcr.io/getporter/examples/porter-hello:v0.2.0", "", ""},
    26  		// --cred should still work, but print a message
    27  		{"old cred flag", "install --cred mycreds -r ghcr.io/getporter/examples/porter-hello:v0.2.0", "", "Flag --cred has been deprecated, please use credential-set instead"},
    28  	}
    29  
    30  	for _, tc := range testcases {
    31  		t.Run(tc.name, func(t *testing.T) {
    32  			var outBuf bytes.Buffer
    33  			p := buildRootCommand()
    34  			p.SetOut(&outBuf)
    35  			p.SetErr(&outBuf)
    36  			osargs := strings.Split(tc.args, " ")
    37  			cmd, args, err := p.Find(osargs)
    38  			require.NoError(t, err)
    39  
    40  			err = cmd.ParseFlags(args)
    41  			require.NoError(t, err)
    42  
    43  			err = cmd.PreRunE(cmd, cmd.Flags().Args())
    44  			if tc.wantError == "" {
    45  				require.NoError(t, err)
    46  			} else {
    47  				require.EqualError(t, err, tc.wantError)
    48  			}
    49  
    50  			if tc.wantOut != "" {
    51  				tests.RequireOutputContains(t, outBuf.String(), tc.wantOut)
    52  			}
    53  		})
    54  	}
    55  }
    56  
    57  func TestValidateUninstallCommand(t *testing.T) {
    58  	testcases := []struct {
    59  		name      string
    60  		args      string
    61  		wantError string
    62  		wantOut   string
    63  	}{
    64  		{"no args", "uninstall mybuns", "", ""},
    65  		// --cred should still work, but print a message
    66  		{"old cred flag", "install --cred mycreds -r ghcr.io/getporter/examples/porter-hello:v0.2.0", "", "Flag --cred has been deprecated, please use credential-set instead"},
    67  	}
    68  
    69  	for _, tc := range testcases {
    70  		t.Run(tc.name, func(t *testing.T) {
    71  			var outBuf bytes.Buffer
    72  			p := buildRootCommand()
    73  			p.SetOut(&outBuf)
    74  			p.SetErr(&outBuf)
    75  			osargs := strings.Split(tc.args, " ")
    76  			cmd, args, err := p.Find(osargs)
    77  			require.NoError(t, err)
    78  
    79  			err = cmd.ParseFlags(args)
    80  			require.NoError(t, err)
    81  
    82  			err = cmd.PreRunE(cmd, cmd.Flags().Args())
    83  			if tc.wantError == "" {
    84  				require.NoError(t, err)
    85  			} else {
    86  				require.EqualError(t, err, tc.wantError)
    87  			}
    88  
    89  			if tc.wantOut != "" {
    90  				tests.RequireOutputContains(t, outBuf.String(), tc.wantOut)
    91  			}
    92  		})
    93  	}
    94  }
    95  
    96  func TestValidateInvokeCommand(t *testing.T) {
    97  	testcases := []struct {
    98  		name      string
    99  		args      string
   100  		wantError string
   101  	}{
   102  		{"no action", "invoke mybuns", "--action is required"},
   103  		{"action specified", "invoke mybuns --action status", ""},
   104  	}
   105  
   106  	for _, tc := range testcases {
   107  		t.Run(tc.name, func(t *testing.T) {
   108  			p := buildRootCommand()
   109  			osargs := strings.Split(tc.args, " ")
   110  			cmd, args, err := p.Find(osargs)
   111  			require.NoError(t, err)
   112  
   113  			err = cmd.ParseFlags(args)
   114  			require.NoError(t, err)
   115  
   116  			err = cmd.PreRunE(cmd, cmd.Flags().Args())
   117  			if tc.wantError == "" {
   118  				require.NoError(t, err)
   119  			} else {
   120  				require.EqualError(t, err, tc.wantError)
   121  			}
   122  		})
   123  	}
   124  }
   125  
   126  func TestValidateInstallationListCommand(t *testing.T) {
   127  	testcases := []struct {
   128  		name      string
   129  		args      string
   130  		wantError string
   131  	}{
   132  		{"no args", "installation list", ""},
   133  		{"output json", "installation list -o json", ""},
   134  		{"invalid format", "installation list -o wingdings", "invalid format: wingdings"},
   135  	}
   136  
   137  	for _, tc := range testcases {
   138  		t.Run(tc.name, func(t *testing.T) {
   139  			p := buildRootCommand()
   140  			osargs := strings.Split(tc.args, " ")
   141  			cmd, args, err := p.Find(osargs)
   142  			require.NoError(t, err)
   143  
   144  			err = cmd.ParseFlags(args)
   145  			require.NoError(t, err)
   146  
   147  			err = cmd.PreRunE(cmd, cmd.Flags().Args())
   148  			if tc.wantError == "" {
   149  				require.NoError(t, err)
   150  			} else {
   151  				require.EqualError(t, err, tc.wantError)
   152  			}
   153  		})
   154  	}
   155  }
   156  
   157  func TestBuildValidate_Driver(t *testing.T) {
   158  	// Do not run in parallel
   159  
   160  	testcases := []struct {
   161  		name         string
   162  		args         string
   163  		configDriver string // the driver set in the config
   164  		wantDriver   string
   165  		wantError    string
   166  	}{
   167  		{name: "no flag", wantDriver: "buildkit"},
   168  		{name: "invalid flag", args: "--driver=missing-driver", wantError: "invalid --driver value missing-driver"},
   169  		{name: "valid flag", args: "--driver=buildkit", wantDriver: "buildkit"},
   170  		{name: "invalid config", args: "", configDriver: "invalid-driver", wantError: "invalid --driver value invalid-driver"},
   171  		{name: "valid config", args: "", configDriver: "buildkit", wantDriver: "buildkit"}, // passing an empty flag to trigger defaulting it to the config value
   172  	}
   173  
   174  	for _, tc := range testcases {
   175  		t.Run(tc.name, func(t *testing.T) {
   176  			if tc.configDriver != "" {
   177  				os.Setenv("PORTER_BUILD_DRIVER", tc.configDriver)
   178  				defer os.Unsetenv("PORTER_BUILD_DRIVER")
   179  			}
   180  
   181  			p := porter.NewTestPorter(t)
   182  			defer p.Close()
   183  
   184  			rootCmd := buildRootCommandFrom(p.Porter)
   185  
   186  			fullArgs := []string{"build", tc.args}
   187  			rootCmd.SetArgs(fullArgs)
   188  			buildCmd, _, _ := rootCmd.Find(fullArgs)
   189  			buildCmd.RunE = func(cmd *cobra.Command, args []string) error {
   190  				// noop
   191  				return nil
   192  			}
   193  			err := p.FileSystem.WriteFile("porter.yaml", []byte(""), pkg.FileModeWritable)
   194  			require.NoError(t, err)
   195  
   196  			err = rootCmd.Execute()
   197  			if tc.wantError == "" {
   198  				require.NoError(t, err)
   199  				assert.Equal(t, tc.wantDriver, p.Data.BuildDriver)
   200  			} else {
   201  				require.EqualError(t, err, tc.wantError)
   202  			}
   203  		})
   204  	}
   205  }