github.com/jenspinney/cli@v6.42.1-0.20190207184520-7450c600020e+incompatible/cf/commands/user/set_space_role_test.go (about) 1 package user_test 2 3 import ( 4 "errors" 5 6 "code.cloudfoundry.org/cli/cf/commandregistry" 7 "code.cloudfoundry.org/cli/cf/commands/user" 8 "code.cloudfoundry.org/cli/cf/configuration/coreconfig" 9 "code.cloudfoundry.org/cli/cf/flags" 10 "code.cloudfoundry.org/cli/cf/models" 11 "code.cloudfoundry.org/cli/cf/requirements" 12 "code.cloudfoundry.org/cli/cf/requirements/requirementsfakes" 13 14 "code.cloudfoundry.org/cli/cf/api/apifakes" 15 "code.cloudfoundry.org/cli/cf/api/featureflags/featureflagsfakes" 16 "code.cloudfoundry.org/cli/cf/api/spaces/spacesfakes" 17 testconfig "code.cloudfoundry.org/cli/cf/util/testhelpers/configuration" 18 testterm "code.cloudfoundry.org/cli/cf/util/testhelpers/terminal" 19 20 . "code.cloudfoundry.org/cli/cf/util/testhelpers/matchers" 21 . "github.com/onsi/ginkgo" 22 . "github.com/onsi/gomega" 23 ) 24 25 var _ = Describe("SetSpaceRole", func() { 26 var ( 27 ui *testterm.FakeUI 28 configRepo coreconfig.Repository 29 userRepo *apifakes.FakeUserRepository 30 spaceRepo *spacesfakes.FakeSpaceRepository 31 flagRepo *featureflagsfakes.FakeFeatureFlagRepository 32 33 cmd commandregistry.Command 34 deps commandregistry.Dependency 35 factory *requirementsfakes.FakeFactory 36 flagContext flags.FlagContext 37 38 loginRequirement requirements.Requirement 39 userRequirement *requirementsfakes.FakeUserRequirement 40 organizationRequirement *requirementsfakes.FakeOrganizationRequirement 41 ) 42 43 BeforeEach(func() { 44 ui = &testterm.FakeUI{} 45 configRepo = testconfig.NewRepositoryWithDefaults() 46 userRepo = new(apifakes.FakeUserRepository) 47 repoLocator := deps.RepoLocator.SetUserRepository(userRepo) 48 spaceRepo = new(spacesfakes.FakeSpaceRepository) 49 repoLocator = repoLocator.SetSpaceRepository(spaceRepo) 50 flagRepo = new(featureflagsfakes.FakeFeatureFlagRepository) 51 repoLocator = repoLocator.SetFeatureFlagRepository(flagRepo) 52 53 deps = commandregistry.Dependency{ 54 UI: ui, 55 Config: configRepo, 56 RepoLocator: repoLocator, 57 } 58 59 cmd = &user.SetSpaceRole{} 60 cmd.SetDependency(deps, false) 61 62 flagContext = flags.NewFlagContext(map[string]flags.FlagSet{}) 63 64 factory = new(requirementsfakes.FakeFactory) 65 66 loginRequirement = &passingRequirement{} 67 factory.NewLoginRequirementReturns(loginRequirement) 68 69 userRequirement = new(requirementsfakes.FakeUserRequirement) 70 userRequirement.ExecuteReturns(nil) 71 factory.NewUserRequirementReturns(userRequirement) 72 73 organizationRequirement = new(requirementsfakes.FakeOrganizationRequirement) 74 organizationRequirement.ExecuteReturns(nil) 75 factory.NewOrganizationRequirementReturns(organizationRequirement) 76 }) 77 78 Describe("Requirements", func() { 79 Context("when not provided exactly four args", func() { 80 BeforeEach(func() { 81 flagContext.Parse("the-user-name", "the-org-name", "the-space-name") 82 }) 83 84 It("fails with usage", func() { 85 _, err := cmd.Requirements(factory, flagContext) 86 Expect(err).To(HaveOccurred()) 87 Expect(ui.Outputs()).To(ContainSubstrings( 88 []string{"Incorrect Usage. Requires USERNAME, ORG, SPACE, ROLE as arguments"}, 89 []string{"NAME"}, 90 []string{"USAGE"}, 91 )) 92 }) 93 }) 94 95 Context("when provided four args", func() { 96 BeforeEach(func() { 97 flagContext.Parse("the-user-name", "the-org-name", "the-space-name", "SpaceManager") 98 }) 99 100 It("returns a LoginRequirement", func() { 101 actualRequirements, err := cmd.Requirements(factory, flagContext) 102 Expect(err).NotTo(HaveOccurred()) 103 Expect(factory.NewLoginRequirementCallCount()).To(Equal(1)) 104 105 Expect(actualRequirements).To(ContainElement(loginRequirement)) 106 }) 107 108 It("returns an OrgRequirement", func() { 109 actualRequirements, err := cmd.Requirements(factory, flagContext) 110 Expect(err).NotTo(HaveOccurred()) 111 Expect(factory.NewOrganizationRequirementCallCount()).To(Equal(1)) 112 Expect(factory.NewOrganizationRequirementArgsForCall(0)).To(Equal("the-org-name")) 113 114 Expect(actualRequirements).To(ContainElement(organizationRequirement)) 115 }) 116 117 It("requests the set_roles_by_username flag", func() { 118 cmd.Requirements(factory, flagContext) 119 Expect(flagRepo.FindByNameCallCount()).To(Equal(1)) 120 Expect(flagRepo.FindByNameArgsForCall(0)).To(Equal("set_roles_by_username")) 121 }) 122 123 Context("when the set_roles_by_username flag exists and is enabled", func() { 124 BeforeEach(func() { 125 flagRepo.FindByNameReturns(models.FeatureFlag{Enabled: true}, nil) 126 }) 127 128 It("returns a UserRequirement", func() { 129 actualRequirements, err := cmd.Requirements(factory, flagContext) 130 Expect(err).NotTo(HaveOccurred()) 131 Expect(factory.NewUserRequirementCallCount()).To(Equal(1)) 132 actualUsername, actualWantGUID := factory.NewUserRequirementArgsForCall(0) 133 Expect(actualUsername).To(Equal("the-user-name")) 134 Expect(actualWantGUID).To(BeFalse()) 135 136 Expect(actualRequirements).To(ContainElement(userRequirement)) 137 }) 138 }) 139 140 Context("when the set_roles_by_username flag exists and is disabled", func() { 141 BeforeEach(func() { 142 flagRepo.FindByNameReturns(models.FeatureFlag{Enabled: false}, nil) 143 }) 144 145 It("returns a UserRequirement", func() { 146 actualRequirements, err := cmd.Requirements(factory, flagContext) 147 Expect(err).NotTo(HaveOccurred()) 148 Expect(factory.NewUserRequirementCallCount()).To(Equal(1)) 149 actualUsername, actualWantGUID := factory.NewUserRequirementArgsForCall(0) 150 Expect(actualUsername).To(Equal("the-user-name")) 151 Expect(actualWantGUID).To(BeTrue()) 152 153 Expect(actualRequirements).To(ContainElement(userRequirement)) 154 }) 155 }) 156 157 Context("when the set_roles_by_username flag cannot be retrieved", func() { 158 BeforeEach(func() { 159 flagRepo.FindByNameReturns(models.FeatureFlag{}, errors.New("some error")) 160 }) 161 162 It("returns a UserRequirement", func() { 163 actualRequirements, err := cmd.Requirements(factory, flagContext) 164 Expect(err).NotTo(HaveOccurred()) 165 Expect(factory.NewUserRequirementCallCount()).To(Equal(1)) 166 actualUsername, actualWantGUID := factory.NewUserRequirementArgsForCall(0) 167 Expect(actualUsername).To(Equal("the-user-name")) 168 Expect(actualWantGUID).To(BeTrue()) 169 170 Expect(actualRequirements).To(ContainElement(userRequirement)) 171 }) 172 }) 173 }) 174 }) 175 176 Describe("Execute", func() { 177 var ( 178 org models.Organization 179 err error 180 ) 181 182 BeforeEach(func() { 183 flagContext.Parse("the-user-name", "the-org-name", "the-space-name", "SpaceManager") 184 cmd.Requirements(factory, flagContext) 185 186 org = models.Organization{} 187 org.GUID = "the-org-guid" 188 org.Name = "the-org-name" 189 organizationRequirement.GetOrganizationReturns(org) 190 }) 191 192 JustBeforeEach(func() { 193 err = cmd.Execute(flagContext) 194 }) 195 196 Context("when the space is not found", func() { 197 BeforeEach(func() { 198 spaceRepo.FindByNameInOrgReturns(models.Space{}, errors.New("space-repo-error")) 199 }) 200 201 It("doesn't call CC", func() { 202 Expect(userRepo.SetSpaceRoleByGUIDCallCount()).To(BeZero()) 203 Expect(userRepo.SetSpaceRoleByUsernameCallCount()).To(BeZero()) 204 }) 205 206 It("returns an error", func() { 207 Expect(err).To(HaveOccurred()) 208 Expect(err.Error()).To(Equal("space-repo-error")) 209 }) 210 }) 211 212 Context("when the space is found", func() { 213 BeforeEach(func() { 214 space := models.Space{} 215 space.GUID = "the-space-guid" 216 space.Name = "the-space-name" 217 spaceRepo.FindByNameInOrgReturns(space, nil) 218 }) 219 220 Context("when the UserRequirement returns a user with a GUID", func() { 221 BeforeEach(func() { 222 userFields := models.UserFields{GUID: "the-user-guid", Username: "the-user-name"} 223 userRequirement.GetUserReturns(userFields) 224 }) 225 226 It("tells the user it is assigning the role", func() { 227 Expect(err).NotTo(HaveOccurred()) 228 Expect(ui.Outputs()).To(ContainSubstrings( 229 []string{"Assigning role", "SpaceManager", "the-user-name", "the-org", "the-user-name"}, 230 []string{"OK"}, 231 )) 232 }) 233 234 It("sets the role using the GUID", func() { 235 Expect(err).NotTo(HaveOccurred()) 236 Expect(userRepo.SetSpaceRoleByGUIDCallCount()).To(Equal(1)) 237 actualUserGUID, actualSpaceGUID, actualOrgGUID, actualRole := userRepo.SetSpaceRoleByGUIDArgsForCall(0) 238 Expect(actualUserGUID).To(Equal("the-user-guid")) 239 Expect(actualSpaceGUID).To(Equal("the-space-guid")) 240 Expect(actualOrgGUID).To(Equal("the-org-guid")) 241 Expect(actualRole).To(Equal(models.RoleSpaceManager)) 242 }) 243 244 Context("when the call to CC fails", func() { 245 BeforeEach(func() { 246 userRepo.SetSpaceRoleByGUIDReturns(errors.New("user-repo-error")) 247 }) 248 249 It("returns an error", func() { 250 Expect(err).To(HaveOccurred()) 251 Expect(err.Error()).To(Equal("user-repo-error")) 252 }) 253 }) 254 }) 255 256 Context("when the UserRequirement returns a user without a GUID", func() { 257 BeforeEach(func() { 258 userRequirement.GetUserReturns(models.UserFields{Username: "the-user-name"}) 259 }) 260 261 It("sets the role using the given username", func() { 262 Expect(err).NotTo(HaveOccurred()) 263 username, spaceGUID, orgGUID, role := userRepo.SetSpaceRoleByUsernameArgsForCall(0) 264 Expect(username).To(Equal("the-user-name")) 265 Expect(spaceGUID).To(Equal("the-space-guid")) 266 Expect(orgGUID).To(Equal("the-org-guid")) 267 Expect(role).To(Equal(models.RoleSpaceManager)) 268 }) 269 270 It("tells the user it assigned the role", func() { 271 Expect(err).NotTo(HaveOccurred()) 272 Expect(ui.Outputs()).To(ContainSubstrings( 273 []string{"Assigning role", "SpaceManager", "the-user-name", "the-org", "the-user-name"}, 274 []string{"OK"}, 275 )) 276 }) 277 278 Context("when the call to CC fails", func() { 279 BeforeEach(func() { 280 userRepo.SetSpaceRoleByUsernameReturns(errors.New("user-repo-error")) 281 }) 282 283 It("returns an error", func() { 284 Expect(err).To(HaveOccurred()) 285 Expect(err.Error()).To(Equal("user-repo-error")) 286 }) 287 }) 288 }) 289 }) 290 }) 291 })