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 }