github.com/loafoe/cli@v7.1.0+incompatible/command/v7/create_user_command_test.go (about) 1 package v7_test 2 3 import ( 4 "errors" 5 6 "code.cloudfoundry.org/cli/actor/actionerror" 7 "code.cloudfoundry.org/cli/actor/v7action" 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 9 "code.cloudfoundry.org/cli/api/uaa" 10 "code.cloudfoundry.org/cli/command/commandfakes" 11 "code.cloudfoundry.org/cli/command/translatableerror" 12 . "code.cloudfoundry.org/cli/command/v7" 13 "code.cloudfoundry.org/cli/command/v7/v7fakes" 14 "code.cloudfoundry.org/cli/resources" 15 "code.cloudfoundry.org/cli/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 Command", func() { 22 var ( 23 cmd CreateUserCommand 24 testUI *ui.UI 25 fakeConfig *commandfakes.FakeConfig 26 fakeSharedActor *commandfakes.FakeSharedActor 27 fakeActor *v7fakes.FakeActor 28 binaryName string 29 executeErr error 30 input *Buffer 31 ) 32 33 BeforeEach(func() { 34 input = NewBuffer() 35 testUI = ui.NewTestUI(input, NewBuffer(), NewBuffer()) 36 fakeConfig = new(commandfakes.FakeConfig) 37 fakeSharedActor = new(commandfakes.FakeSharedActor) 38 fakeActor = new(v7fakes.FakeActor) 39 40 cmd = CreateUserCommand{ 41 BaseCommand: BaseCommand{ 42 UI: testUI, 43 Config: fakeConfig, 44 SharedActor: fakeSharedActor, 45 Actor: fakeActor, 46 }, 47 } 48 49 cmd.Args.Username = "some-user" 50 password := "some-password" 51 cmd.Args.Password = &password 52 53 binaryName = "faceman" 54 fakeConfig.BinaryNameReturns(binaryName) 55 }) 56 57 JustBeforeEach(func() { 58 executeErr = cmd.Execute(nil) 59 }) 60 61 When("checking target fails", func() { 62 BeforeEach(func() { 63 fakeSharedActor.CheckTargetReturns(actionerror.NotLoggedInError{BinaryName: binaryName}) 64 }) 65 66 It("returns an error", func() { 67 Expect(executeErr).To(MatchError(actionerror.NotLoggedInError{BinaryName: "faceman"})) 68 69 Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1)) 70 checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0) 71 Expect(checkTargetedOrg).To(BeFalse()) 72 Expect(checkTargetedSpace).To(BeFalse()) 73 }) 74 }) 75 76 When("the user is logged in", func() { 77 When("password is not provided", func() { 78 BeforeEach(func() { 79 cmd.Args.Password = nil 80 }) 81 82 When("origin is empty string", func() { 83 BeforeEach(func() { 84 cmd.Origin = "" 85 }) 86 87 It("returns the RequiredArgumentError", func() { 88 Expect(executeErr).To(MatchError(translatableerror.RequiredArgumentError{ArgumentName: "PASSWORD"})) 89 }) 90 }) 91 92 When("origin is UAA", func() { 93 BeforeEach(func() { 94 cmd.Origin = "UAA" 95 }) 96 97 It("returns the RequiredArgumentError", func() { 98 Expect(executeErr).To(MatchError(translatableerror.RequiredArgumentError{ArgumentName: "PASSWORD"})) 99 }) 100 }) 101 102 When("origin is not UAA or the empty string", func() { 103 BeforeEach(func() { 104 fakeActor.CreateUserReturns( 105 resources.User{GUID: "new-user-cc-guid"}, 106 v7action.Warnings{"warning"}, 107 nil) 108 cmd.Origin = "some-origin" 109 fakeActor.GetUserReturns( 110 resources.User{}, 111 actionerror.UserNotFoundError{}) 112 }) 113 114 It("creates the user and displays all warnings", func() { 115 Expect(executeErr).ToNot(HaveOccurred()) 116 Expect(fakeActor.GetUserCallCount()).To(Equal(1)) 117 118 username, origin := fakeActor.GetUserArgsForCall(0) 119 Expect(username).To(Equal("some-user")) 120 Expect(origin).To(Equal("some-origin")) 121 Expect(fakeActor.CreateUserCallCount()).To(Equal(1)) 122 username, password, origin := fakeActor.CreateUserArgsForCall(0) 123 Expect(username).To(Equal("some-user")) 124 Expect(password).To(Equal("")) 125 Expect(origin).To(Equal("some-origin")) 126 127 Expect(testUI.Out).To(Say("Creating user some-user...")) 128 Expect(testUI.Out).To(Say("OK")) 129 Expect(testUI.Out).To(Say("TIP: Assign roles with 'faceman set-org-role' and 'faceman set-space-role'.")) 130 Expect(testUI.Err).To(Say("warning")) 131 }) 132 }) 133 134 When("password-prompt flag is set", func() { 135 BeforeEach(func() { 136 cmd.PasswordPrompt = true 137 _, err := input.Write([]byte("some-password\n")) 138 Expect(err).ToNot(HaveOccurred()) 139 140 }) 141 142 When("the user already exists in UAA", func() { 143 BeforeEach(func() { 144 fakeActor.GetUserReturns( 145 resources.User{GUID: "user-guid"}, 146 nil) 147 }) 148 149 It("does not prompt for a password or attempt to create a user", func() { 150 Expect(executeErr).ToNot(HaveOccurred()) 151 Expect(testUI.Out).To(Not(Say("Password:"))) 152 153 Expect(testUI.Out).To(Say("Creating user some-user...")) 154 Expect(fakeActor.CreateUserCallCount()).To(Equal(0)) 155 Expect(testUI.Err).To(Say("User 'some-user' already exists.")) 156 Expect(testUI.Out).To(Say("OK")) 157 }) 158 }) 159 160 When("the user does not yet exist in UAA", func() { 161 BeforeEach(func() { 162 fakeActor.CreateUserReturns( 163 resources.User{GUID: "new-user-cc-guid"}, 164 v7action.Warnings{"warning"}, 165 nil) 166 fakeActor.GetUserReturns( 167 resources.User{}, 168 actionerror.UserNotFoundError{}) 169 }) 170 171 It("prompts for a password", func() { 172 Expect(executeErr).ToNot(HaveOccurred()) 173 Expect(testUI.Out).To(Say("Password:")) 174 175 Expect(testUI.Out).To(Say("Creating user some-user...")) 176 177 Expect(fakeActor.CreateUserCallCount()).To(Equal(1)) 178 _, password, _ := fakeActor.CreateUserArgsForCall(0) 179 Expect(password).To(Equal("some-password")) 180 181 Expect(testUI.Out).To(Say("OK")) 182 Expect(testUI.Out).To(Say("TIP: Assign roles with 'faceman set-org-role' and 'faceman set-space-role'.")) 183 Expect(testUI.Err).To(Say("warning")) 184 }) 185 }) 186 }) 187 }) 188 189 When("password is provided", func() { 190 BeforeEach(func() { 191 cmd.Args.Username = "some-user" 192 password := "password" 193 cmd.Args.Password = &password 194 cmd.Origin = "" 195 }) 196 197 When("origin is empty string", func() { 198 It("defaults origin to 'uaa'", func() { 199 Expect(executeErr).ToNot(HaveOccurred()) 200 Expect(fakeActor.GetUserCallCount()).To(Equal(1)) 201 202 username, origin := fakeActor.GetUserArgsForCall(0) 203 Expect(username).To(Equal("some-user")) 204 Expect(origin).To(Equal(constant.DefaultOriginUaa)) 205 }) 206 }) 207 }) 208 209 When("an error occurs", func() { 210 When("the error is not translatable", func() { 211 var returnedErr error 212 213 BeforeEach(func() { 214 returnedErr = errors.New("non-translatable error") 215 fakeActor.CreateUserReturns( 216 resources.User{}, 217 v7action.Warnings{"warning-1", "warning-2"}, 218 returnedErr) 219 fakeActor.GetUserReturns( 220 resources.User{}, 221 actionerror.UserNotFoundError{}) 222 }) 223 224 It("returns the same error and all warnings", func() { 225 Expect(executeErr).To(MatchError(returnedErr)) 226 Expect(testUI.Err).To(Say("warning-1")) 227 Expect(testUI.Err).To(Say("warning-2")) 228 }) 229 }) 230 231 When("the error is a uaa.ConflictError", func() { 232 var returnedErr error 233 234 BeforeEach(func() { 235 returnedErr = uaa.ConflictError{} 236 fakeActor.CreateUserReturns( 237 resources.User{}, 238 v7action.Warnings{"warning-1", "warning-2"}, 239 returnedErr) 240 fakeActor.GetUserReturns( 241 resources.User{}, 242 actionerror.UserNotFoundError{}) 243 }) 244 245 It("displays the error and all warnings", func() { 246 Expect(executeErr).To(BeNil()) 247 Expect(testUI.Err).To(Say("warning-1")) 248 Expect(testUI.Err).To(Say("warning-2")) 249 Expect(testUI.Err).To(Say("User 'some-user' already exists.")) 250 }) 251 }) 252 }) 253 }) 254 })