github.com/LukasHeimann/cloudfoundrycli/v8@v8.4.4/command/v7/create_user_provided_service_command_test.go (about) 1 package v7_test 2 3 import ( 4 "errors" 5 6 "github.com/LukasHeimann/cloudfoundrycli/v8/types" 7 8 "github.com/LukasHeimann/cloudfoundrycli/v8/actor/v7action" 9 "github.com/LukasHeimann/cloudfoundrycli/v8/command/commandfakes" 10 "github.com/LukasHeimann/cloudfoundrycli/v8/command/flag" 11 . "github.com/LukasHeimann/cloudfoundrycli/v8/command/v7" 12 "github.com/LukasHeimann/cloudfoundrycli/v8/command/v7/v7fakes" 13 "github.com/LukasHeimann/cloudfoundrycli/v8/resources" 14 "github.com/LukasHeimann/cloudfoundrycli/v8/util/configv3" 15 "github.com/LukasHeimann/cloudfoundrycli/v8/util/ui" 16 . "github.com/onsi/ginkgo" 17 . "github.com/onsi/gomega" 18 . "github.com/onsi/gomega/gbytes" 19 ) 20 21 var _ = Describe("create-user-provided-service Command", func() { 22 var ( 23 input *Buffer 24 testUI *ui.UI 25 fakeConfig *commandfakes.FakeConfig 26 fakeActor *v7fakes.FakeActor 27 fakeSharedActor *commandfakes.FakeSharedActor 28 cmd CreateUserProvidedServiceCommand 29 executeErr error 30 ) 31 32 BeforeEach(func() { 33 input = NewBuffer() 34 testUI = ui.NewTestUI(input, NewBuffer(), NewBuffer()) 35 fakeConfig = new(commandfakes.FakeConfig) 36 fakeActor = new(v7fakes.FakeActor) 37 fakeSharedActor = new(commandfakes.FakeSharedActor) 38 39 cmd = CreateUserProvidedServiceCommand{ 40 BaseCommand: BaseCommand{ 41 UI: testUI, 42 Config: fakeConfig, 43 SharedActor: fakeSharedActor, 44 Actor: fakeActor, 45 }, 46 } 47 }) 48 49 JustBeforeEach(func() { 50 executeErr = cmd.Execute(nil) 51 }) 52 53 It("checks the user is logged in, and targeting an org and space", func() { 54 Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1)) 55 orgChecked, spaceChecked := fakeSharedActor.CheckTargetArgsForCall(0) 56 Expect(orgChecked).To(BeTrue()) 57 Expect(spaceChecked).To(BeTrue()) 58 }) 59 60 When("checking the target returns an error", func() { 61 BeforeEach(func() { 62 fakeSharedActor.CheckTargetReturns(errors.New("explode")) 63 }) 64 65 It("returns the error", func() { 66 Expect(executeErr).To(MatchError("explode")) 67 }) 68 }) 69 70 When("the user is logged in, and is targeting an org and space", func() { 71 const ( 72 fakeServiceInstanceName = "fake-service-instance-name" 73 fakeOrgName = "fake-org-name" 74 fakeSpaceName = "fake-space-name" 75 fakeSpaceGUID = "fake-space-guid" 76 fakeUserName = "fake-user-name" 77 ) 78 79 BeforeEach(func() { 80 fakeConfig.TargetedSpaceReturns(configv3.Space{ 81 Name: fakeSpaceName, 82 GUID: fakeSpaceGUID, 83 }) 84 85 fakeConfig.TargetedOrganizationReturns(configv3.Organization{ 86 Name: fakeOrgName, 87 }) 88 89 fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil) 90 91 setPositionalFlags(&cmd, fakeServiceInstanceName) 92 93 fakeActor.CreateUserProvidedServiceInstanceReturns(v7action.Warnings{"be warned", "take care"}, nil) 94 }) 95 96 It("succeeds", func() { 97 Expect(executeErr).NotTo(HaveOccurred()) 98 }) 99 100 It("prints a message and warnings", func() { 101 Expect(testUI.Out).To(SatisfyAll( 102 Say("Creating user provided service %s in org %s / space %s as %s...", fakeServiceInstanceName, fakeOrgName, fakeSpaceName, fakeUserName), 103 Say("OK"), 104 )) 105 106 Expect(testUI.Err).To(SatisfyAll( 107 Say("be warned"), 108 Say("take care"), 109 )) 110 }) 111 112 It("calls the actor with the service instance name and space GUID", func() { 113 Expect(fakeActor.CreateUserProvidedServiceInstanceCallCount()).To(Equal(1)) 114 serviceInstance := fakeActor.CreateUserProvidedServiceInstanceArgsForCall(0) 115 Expect(serviceInstance).To(Equal(resources.ServiceInstance{ 116 Name: fakeServiceInstanceName, 117 SpaceGUID: fakeSpaceGUID, 118 })) 119 }) 120 121 When("all optional arguments are provided", func() { 122 BeforeEach(func() { 123 setFlag(&cmd, "-t", flag.Tags{IsSet: true, Value: []string{"list", "of", "tags"}}) 124 setFlag(&cmd, "-l", flag.OptionalString{IsSet: true, Value: "https://fake-sylogg.com"}) 125 setFlag(&cmd, "-r", flag.OptionalString{IsSet: true, Value: "https://fake-route.com"}) 126 setFlag(&cmd, "-p", flag.CredentialsOrJSON{ 127 OptionalObject: types.OptionalObject{ 128 IsSet: true, 129 Value: map[string]interface{}{ 130 "foo": "bar", 131 "baz": 42, 132 }, 133 }, 134 }) 135 }) 136 137 It("calls the actor with all the flag values", func() { 138 Expect(fakeActor.CreateUserProvidedServiceInstanceCallCount()).To(Equal(1)) 139 serviceInstance := fakeActor.CreateUserProvidedServiceInstanceArgsForCall(0) 140 Expect(serviceInstance).To(Equal(resources.ServiceInstance{ 141 Name: fakeServiceInstanceName, 142 SpaceGUID: fakeSpaceGUID, 143 Tags: types.NewOptionalStringSlice("list", "of", "tags"), 144 SyslogDrainURL: types.NewOptionalString("https://fake-sylogg.com"), 145 RouteServiceURL: types.NewOptionalString("https://fake-route.com"), 146 Credentials: types.NewOptionalObject(map[string]interface{}{ 147 "foo": "bar", 148 "baz": 42, 149 }), 150 })) 151 }) 152 }) 153 154 When("setting credentials interactively", func() { 155 BeforeEach(func() { 156 cmd.Credentials.IsSet = true 157 cmd.Credentials.UserPromptCredentials = []string{"pass phrase", "cred"} 158 159 _, err := input.Write([]byte("very secret passphrase\nsecret cred\n")) 160 Expect(err).NotTo(HaveOccurred()) 161 }) 162 163 It("prompts the user for credentials", func() { 164 Expect(testUI.Out).To(Say("pass phrase: ")) 165 Expect(testUI.Out).To(Say("cred: ")) 166 }) 167 168 It("does not echo the credentials", func() { 169 Expect(testUI.Out).NotTo(Say("secret")) 170 Expect(testUI.Err).NotTo(Say("secret")) 171 }) 172 173 It("succeeds", func() { 174 Expect(executeErr).NotTo(HaveOccurred()) 175 176 Expect(fakeActor.CreateUserProvidedServiceInstanceCallCount()).To(Equal(1)) 177 serviceInstance := fakeActor.CreateUserProvidedServiceInstanceArgsForCall(0) 178 Expect(serviceInstance).To(Equal(resources.ServiceInstance{ 179 Name: fakeServiceInstanceName, 180 SpaceGUID: fakeSpaceGUID, 181 Credentials: types.NewOptionalObject(map[string]interface{}{ 182 "pass phrase": "very secret passphrase", 183 "cred": "secret cred", 184 }), 185 })) 186 }) 187 }) 188 189 When("getting the user fails", func() { 190 BeforeEach(func() { 191 fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, errors.New("boom")) 192 }) 193 194 It("returns the error", func() { 195 Expect(executeErr).To(MatchError("boom")) 196 }) 197 }) 198 199 When("the actor returns an error", func() { 200 BeforeEach(func() { 201 fakeActor.CreateUserProvidedServiceInstanceReturns(v7action.Warnings{"be warned", "take care"}, errors.New("bang")) 202 }) 203 204 It("returns the error", func() { 205 Expect(executeErr).To(MatchError("bang")) 206 }) 207 208 It("prints a message and warnings", func() { 209 Expect(testUI.Out).To(Say("Creating user provided service %s in org %s / space %s as %s...", fakeServiceInstanceName, fakeOrgName, fakeSpaceName, fakeUserName)) 210 Expect(testUI.Out).NotTo(Say("OK")) 211 212 Expect(testUI.Err).To(SatisfyAll( 213 Say("be warned"), 214 Say("take care"), 215 )) 216 }) 217 }) 218 }) 219 })