github.com/khulnasoft/cli@v0.0.0-20240402070845-01bcad7beefa/cli/command/secret/inspect_test.go (about) 1 package secret 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "testing" 8 "time" 9 10 "github.com/docker/docker/api/types/swarm" 11 "github.com/khulnasoft/cli/internal/test" 12 "github.com/khulnasoft/cli/internal/test/builders" 13 "github.com/pkg/errors" 14 "gotest.tools/v3/assert" 15 "gotest.tools/v3/golden" 16 ) 17 18 func TestSecretInspectErrors(t *testing.T) { 19 testCases := []struct { 20 args []string 21 flags map[string]string 22 secretInspectFunc func(ctx context.Context, secretID string) (swarm.Secret, []byte, error) 23 expectedError string 24 }{ 25 { 26 expectedError: "requires at least 1 argument", 27 }, 28 { 29 args: []string{"foo"}, 30 secretInspectFunc: func(_ context.Context, secretID string) (swarm.Secret, []byte, error) { 31 return swarm.Secret{}, nil, errors.Errorf("error while inspecting the secret") 32 }, 33 expectedError: "error while inspecting the secret", 34 }, 35 { 36 args: []string{"foo"}, 37 flags: map[string]string{ 38 "format": "{{invalid format}}", 39 }, 40 expectedError: "template parsing error", 41 }, 42 { 43 args: []string{"foo", "bar"}, 44 secretInspectFunc: func(_ context.Context, secretID string) (swarm.Secret, []byte, error) { 45 if secretID == "foo" { 46 return *builders.Secret(builders.SecretName("foo")), nil, nil 47 } 48 return swarm.Secret{}, nil, errors.Errorf("error while inspecting the secret") 49 }, 50 expectedError: "error while inspecting the secret", 51 }, 52 } 53 for _, tc := range testCases { 54 cmd := newSecretInspectCommand( 55 test.NewFakeCli(&fakeClient{ 56 secretInspectFunc: tc.secretInspectFunc, 57 }), 58 ) 59 cmd.SetArgs(tc.args) 60 for key, value := range tc.flags { 61 assert.Check(t, cmd.Flags().Set(key, value)) 62 } 63 cmd.SetOut(io.Discard) 64 assert.ErrorContains(t, cmd.Execute(), tc.expectedError) 65 } 66 } 67 68 func TestSecretInspectWithoutFormat(t *testing.T) { 69 testCases := []struct { 70 name string 71 args []string 72 secretInspectFunc func(ctx context.Context, secretID string) (swarm.Secret, []byte, error) 73 }{ 74 { 75 name: "single-secret", 76 args: []string{"foo"}, 77 secretInspectFunc: func(_ context.Context, name string) (swarm.Secret, []byte, error) { 78 if name != "foo" { 79 return swarm.Secret{}, nil, errors.Errorf("Invalid name, expected %s, got %s", "foo", name) 80 } 81 return *builders.Secret(builders.SecretID("ID-foo"), builders.SecretName("foo")), nil, nil 82 }, 83 }, 84 { 85 name: "multiple-secrets-with-labels", 86 args: []string{"foo", "bar"}, 87 secretInspectFunc: func(_ context.Context, name string) (swarm.Secret, []byte, error) { 88 return *builders.Secret(builders.SecretID("ID-"+name), builders.SecretName(name), builders.SecretLabels(map[string]string{ 89 "label1": "label-foo", 90 })), nil, nil 91 }, 92 }, 93 } 94 for _, tc := range testCases { 95 cli := test.NewFakeCli(&fakeClient{ 96 secretInspectFunc: tc.secretInspectFunc, 97 }) 98 cmd := newSecretInspectCommand(cli) 99 cmd.SetArgs(tc.args) 100 assert.NilError(t, cmd.Execute()) 101 golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("secret-inspect-without-format.%s.golden", tc.name)) 102 } 103 } 104 105 func TestSecretInspectWithFormat(t *testing.T) { 106 secretInspectFunc := func(_ context.Context, name string) (swarm.Secret, []byte, error) { 107 return *builders.Secret(builders.SecretName("foo"), builders.SecretLabels(map[string]string{ 108 "label1": "label-foo", 109 })), nil, nil 110 } 111 testCases := []struct { 112 name string 113 format string 114 args []string 115 secretInspectFunc func(_ context.Context, name string) (swarm.Secret, []byte, error) 116 }{ 117 { 118 name: "simple-template", 119 format: "{{.Spec.Name}}", 120 args: []string{"foo"}, 121 secretInspectFunc: secretInspectFunc, 122 }, 123 { 124 name: "json-template", 125 format: "{{json .Spec.Labels}}", 126 args: []string{"foo"}, 127 secretInspectFunc: secretInspectFunc, 128 }, 129 } 130 for _, tc := range testCases { 131 cli := test.NewFakeCli(&fakeClient{ 132 secretInspectFunc: tc.secretInspectFunc, 133 }) 134 cmd := newSecretInspectCommand(cli) 135 cmd.SetArgs(tc.args) 136 assert.Check(t, cmd.Flags().Set("format", tc.format)) 137 assert.NilError(t, cmd.Execute()) 138 golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("secret-inspect-with-format.%s.golden", tc.name)) 139 } 140 } 141 142 func TestSecretInspectPretty(t *testing.T) { 143 testCases := []struct { 144 name string 145 secretInspectFunc func(context.Context, string) (swarm.Secret, []byte, error) 146 }{ 147 { 148 name: "simple", 149 secretInspectFunc: func(_ context.Context, id string) (swarm.Secret, []byte, error) { 150 return *builders.Secret( 151 builders.SecretLabels(map[string]string{ 152 "lbl1": "value1", 153 }), 154 builders.SecretID("secretID"), 155 builders.SecretName("secretName"), 156 builders.SecretDriver("driver"), 157 builders.SecretCreatedAt(time.Time{}), 158 builders.SecretUpdatedAt(time.Time{}), 159 ), []byte{}, nil 160 }, 161 }, 162 } 163 for _, tc := range testCases { 164 cli := test.NewFakeCli(&fakeClient{ 165 secretInspectFunc: tc.secretInspectFunc, 166 }) 167 cmd := newSecretInspectCommand(cli) 168 cmd.SetArgs([]string{"secretID"}) 169 assert.Check(t, cmd.Flags().Set("pretty", "true")) 170 assert.NilError(t, cmd.Execute()) 171 golden.Assert(t, cli.OutBuffer().String(), fmt.Sprintf("secret-inspect-pretty.%s.golden", tc.name)) 172 } 173 }