github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/cf/commands/user/space_users_test.go (about) 1 package user_test 2 3 import ( 4 "errors" 5 6 "github.com/liamawhite/cli-with-i18n/cf/api/apifakes" 7 "github.com/liamawhite/cli-with-i18n/cf/api/spaces/spacesfakes" 8 "github.com/liamawhite/cli-with-i18n/cf/commandregistry" 9 "github.com/liamawhite/cli-with-i18n/cf/configuration/coreconfig" 10 "github.com/liamawhite/cli-with-i18n/cf/models" 11 "github.com/liamawhite/cli-with-i18n/cf/requirements" 12 "github.com/liamawhite/cli-with-i18n/cf/requirements/requirementsfakes" 13 "github.com/liamawhite/cli-with-i18n/cf/trace/tracefakes" 14 "github.com/liamawhite/cli-with-i18n/plugin/models" 15 testcmd "github.com/liamawhite/cli-with-i18n/util/testhelpers/commands" 16 testconfig "github.com/liamawhite/cli-with-i18n/util/testhelpers/configuration" 17 testterm "github.com/liamawhite/cli-with-i18n/util/testhelpers/terminal" 18 . "github.com/onsi/ginkgo" 19 . "github.com/onsi/gomega" 20 21 "os" 22 23 . "github.com/liamawhite/cli-with-i18n/util/testhelpers/matchers" 24 ) 25 26 var _ = Describe("space-users command", func() { 27 var ( 28 ui *testterm.FakeUI 29 requirementsFactory *requirementsfakes.FakeFactory 30 spaceRepo *spacesfakes.FakeSpaceRepository 31 userRepo *apifakes.FakeUserRepository 32 configRepo coreconfig.Repository 33 deps commandregistry.Dependency 34 ) 35 36 updateCommandDependency := func(pluginCall bool) { 37 deps.UI = ui 38 deps.Config = configRepo 39 deps.RepoLocator = deps.RepoLocator.SetUserRepository(userRepo) 40 deps.RepoLocator = deps.RepoLocator.SetSpaceRepository(spaceRepo) 41 42 commandregistry.Commands.SetCommand(commandregistry.Commands.FindCommand("space-users").SetDependency(deps, pluginCall)) 43 } 44 45 BeforeEach(func() { 46 configRepo = testconfig.NewRepositoryWithDefaults() 47 ui = &testterm.FakeUI{} 48 requirementsFactory = new(requirementsfakes.FakeFactory) 49 spaceRepo = new(spacesfakes.FakeSpaceRepository) 50 userRepo = new(apifakes.FakeUserRepository) 51 deps = commandregistry.NewDependency(os.Stdout, new(tracefakes.FakePrinter), "") 52 }) 53 54 runCommand := func(args ...string) bool { 55 return testcmd.RunCLICommand("space-users", args, requirementsFactory, updateCommandDependency, false, ui) 56 } 57 58 Describe("requirements", func() { 59 It("fails when not logged in", func() { 60 requirementsFactory.NewLoginRequirementReturns(requirements.Failing{Message: "not logged in"}) 61 Expect(runCommand("my-org", "my-space")).To(BeFalse()) 62 }) 63 64 It("succeeds when logged in", func() { 65 requirementsFactory.NewLoginRequirementReturns(requirements.Passing{}) 66 organizationReq := new(requirementsfakes.FakeOrganizationRequirement) 67 organizationReq.GetOrganizationReturns( 68 models.Organization{ 69 OrganizationFields: models.OrganizationFields{ 70 Name: "some-org", 71 }, 72 }, 73 ) 74 spaceRepo.FindByNameInOrgReturns( 75 models.Space{ 76 SpaceFields: models.SpaceFields{ 77 Name: "whatever-space", 78 }, 79 }, nil) 80 requirementsFactory.NewOrganizationRequirementReturns(organizationReq) 81 passed := runCommand("some-org", "whatever-space") 82 83 Expect(passed).To(BeTrue()) 84 Expect(ui.Outputs()).To(ContainSubstrings([]string{"Getting users in org some-org / space whatever-space as my-user"})) 85 }) 86 }) 87 88 It("fails with usage when not invoked with exactly two args", func() { 89 runCommand("my-org") 90 Expect(ui.Outputs()).To(ContainSubstrings( 91 []string{"Incorrect Usage", "Requires arguments"}, 92 )) 93 }) 94 95 Context("when logged in and given some users in the org and space", func() { 96 BeforeEach(func() { 97 requirementsFactory.NewLoginRequirementReturns(requirements.Passing{}) 98 99 org := models.Organization{} 100 org.Name = "Org1" 101 org.GUID = "org1-guid" 102 space := models.Space{} 103 space.Name = "Space1" 104 space.GUID = "space1-guid" 105 106 organizationReq := new(requirementsfakes.FakeOrganizationRequirement) 107 organizationReq.GetOrganizationReturns(org) 108 requirementsFactory.NewOrganizationRequirementReturns(organizationReq) 109 spaceRepo.FindByNameInOrgReturns(space, nil) 110 111 user := models.UserFields{} 112 user.Username = "user1" 113 user2 := models.UserFields{} 114 user2.Username = "user2" 115 user3 := models.UserFields{} 116 user3.Username = "user3" 117 user4 := models.UserFields{} 118 user4.Username = "user4" 119 userRepo.ListUsersInSpaceForRoleWithNoUAAStub = func(_ string, roleName models.Role) ([]models.UserFields, error) { 120 userFields := map[models.Role][]models.UserFields{ 121 models.RoleSpaceManager: {user, user2}, 122 models.RoleSpaceDeveloper: {user4}, 123 models.RoleSpaceAuditor: {user3}, 124 }[roleName] 125 return userFields, nil 126 } 127 }) 128 129 It("tells you about the space users in the given space", func() { 130 runCommand("my-org", "my-space") 131 132 actualSpaceName, actualOrgGUID := spaceRepo.FindByNameInOrgArgsForCall(0) 133 Expect(actualSpaceName).To(Equal("my-space")) 134 Expect(actualOrgGUID).To(Equal("org1-guid")) 135 136 Expect(userRepo.ListUsersInSpaceForRoleWithNoUAACallCount()).To(Equal(3)) 137 for i, expectedRole := range []models.Role{models.RoleSpaceManager, models.RoleSpaceDeveloper, models.RoleSpaceAuditor} { 138 spaceGUID, actualRole := userRepo.ListUsersInSpaceForRoleWithNoUAAArgsForCall(i) 139 Expect(spaceGUID).To(Equal("space1-guid")) 140 Expect(actualRole).To(Equal(expectedRole)) 141 } 142 143 Expect(ui.Outputs()).To(BeInDisplayOrder( 144 []string{"Getting users in org", "Org1", "Space1", "my-user"}, 145 []string{"SPACE MANAGER"}, 146 []string{"user1"}, 147 []string{"user2"}, 148 []string{"SPACE DEVELOPER"}, 149 []string{"user4"}, 150 []string{"SPACE AUDITOR"}, 151 []string{"user3"}, 152 )) 153 }) 154 155 It("fails with an error when user network call fails", func() { 156 userRepo.ListUsersInSpaceForRoleWithNoUAAStub = func(_ string, role models.Role) ([]models.UserFields, error) { 157 if role == models.RoleSpaceManager { 158 return []models.UserFields{}, errors.New("internet badness occurred") 159 } 160 return []models.UserFields{}, nil 161 } 162 runCommand("my-org", "my-space") 163 Expect(ui.Outputs()).To(BeInDisplayOrder( 164 []string{"Getting users in org", "Org1"}, 165 []string{"internet badness occurred"}, 166 )) 167 }) 168 }) 169 170 Context("when logged in and there are no non-managers in the space", func() { 171 BeforeEach(func() { 172 requirementsFactory.NewLoginRequirementReturns(requirements.Passing{}) 173 174 org := models.Organization{} 175 org.Name = "Org1" 176 org.GUID = "org1-guid" 177 space := models.Space{} 178 space.Name = "Space1" 179 space.GUID = "space1-guid" 180 181 organizationReq := new(requirementsfakes.FakeOrganizationRequirement) 182 organizationReq.GetOrganizationReturns(org) 183 requirementsFactory.NewOrganizationRequirementReturns(organizationReq) 184 spaceRepo.FindByNameInOrgReturns(space, nil) 185 186 user := models.UserFields{} 187 user.Username = "mr-pointy-hair" 188 userRepo.ListUsersInSpaceForRoleWithNoUAAStub = func(_ string, roleName models.Role) ([]models.UserFields, error) { 189 userFields := map[models.Role][]models.UserFields{ 190 models.RoleSpaceManager: {user}, 191 models.RoleSpaceDeveloper: {}, 192 models.RoleSpaceAuditor: {}, 193 }[roleName] 194 return userFields, nil 195 } 196 }) 197 198 It("shows a friendly message when there are no users in a role", func() { 199 runCommand("my-org", "my-space") 200 201 Expect(ui.Outputs()).To(BeInDisplayOrder( 202 []string{"Getting users in org"}, 203 []string{"SPACE MANAGER"}, 204 []string{"mr-pointy-hair"}, 205 []string{"SPACE DEVELOPER"}, 206 []string{"No SPACE DEVELOPER found"}, 207 []string{"SPACE AUDITOR"}, 208 []string{"No SPACE AUDITOR found"}, 209 )) 210 }) 211 }) 212 213 Describe("when invoked by a plugin", func() { 214 var ( 215 pluginUserModel []plugin_models.GetSpaceUsers_Model 216 ) 217 218 Context("single roles", func() { 219 BeforeEach(func() { 220 org := models.Organization{} 221 org.Name = "the-org" 222 org.GUID = "the-org-guid" 223 224 space := models.Space{} 225 space.Name = "the-space" 226 space.GUID = "the-space-guid" 227 228 // space managers 229 user := models.UserFields{} 230 user.Username = "user1" 231 user.GUID = "1111" 232 233 user2 := models.UserFields{} 234 user2.Username = "user2" 235 user2.GUID = "2222" 236 237 // space auditor 238 user3 := models.UserFields{} 239 user3.Username = "user3" 240 user3.GUID = "3333" 241 242 // space developer 243 user4 := models.UserFields{} 244 user4.Username = "user4" 245 user4.GUID = "4444" 246 247 userRepo.ListUsersInSpaceForRoleWithNoUAAStub = func(_ string, roleName models.Role) ([]models.UserFields, error) { 248 userFields := map[models.Role][]models.UserFields{ 249 models.RoleSpaceManager: {user, user2}, 250 models.RoleSpaceDeveloper: {user4}, 251 models.RoleSpaceAuditor: {user3}, 252 }[roleName] 253 return userFields, nil 254 } 255 256 requirementsFactory.NewLoginRequirementReturns(requirements.Passing{}) 257 organizationReq := new(requirementsfakes.FakeOrganizationRequirement) 258 organizationReq.GetOrganizationReturns(org) 259 requirementsFactory.NewOrganizationRequirementReturns(organizationReq) 260 pluginUserModel = []plugin_models.GetSpaceUsers_Model{} 261 deps.PluginModels.SpaceUsers = &pluginUserModel 262 }) 263 264 It("populates the plugin model with users with single roles", func() { 265 testcmd.RunCLICommand("space-users", []string{"the-org", "the-space"}, requirementsFactory, updateCommandDependency, true, ui) 266 267 Expect(pluginUserModel).To(HaveLen(4)) 268 for _, u := range pluginUserModel { 269 switch u.Username { 270 case "user1": 271 Expect(u.Guid).To(Equal("1111")) 272 Expect(u.Roles).To(ConsistOf([]string{"RoleSpaceManager"})) 273 case "user2": 274 Expect(u.Guid).To(Equal("2222")) 275 Expect(u.Roles).To(ConsistOf([]string{"RoleSpaceManager"})) 276 case "user3": 277 Expect(u.Guid).To(Equal("3333")) 278 Expect(u.Roles).To(ConsistOf([]string{"RoleSpaceAuditor"})) 279 case "user4": 280 Expect(u.Guid).To(Equal("4444")) 281 Expect(u.Roles).To(ConsistOf([]string{"RoleSpaceDeveloper"})) 282 default: 283 Fail("unexpected user: " + u.Username) 284 } 285 } 286 }) 287 }) 288 289 Context("multiple roles", func() { 290 BeforeEach(func() { 291 org := models.Organization{} 292 org.Name = "the-org" 293 org.GUID = "the-org-guid" 294 295 space := models.Space{} 296 space.Name = "the-space" 297 space.GUID = "the-space-guid" 298 299 // space managers 300 user := models.UserFields{} 301 user.Username = "user1" 302 user.GUID = "1111" 303 304 user2 := models.UserFields{} 305 user2.Username = "user2" 306 user2.GUID = "2222" 307 308 // space auditor 309 user3 := models.UserFields{} 310 user3.Username = "user3" 311 user3.GUID = "3333" 312 313 // space developer 314 user4 := models.UserFields{} 315 user4.Username = "user4" 316 user4.GUID = "4444" 317 318 userRepo.ListUsersInSpaceForRoleWithNoUAAStub = func(_ string, roleName models.Role) ([]models.UserFields, error) { 319 userFields := map[models.Role][]models.UserFields{ 320 models.RoleSpaceManager: {user, user2, user3, user4}, 321 models.RoleSpaceDeveloper: {user2, user4}, 322 models.RoleSpaceAuditor: {user, user3}, 323 }[roleName] 324 return userFields, nil 325 } 326 327 requirementsFactory.NewLoginRequirementReturns(requirements.Passing{}) 328 organizationReq := new(requirementsfakes.FakeOrganizationRequirement) 329 organizationReq.GetOrganizationReturns(org) 330 requirementsFactory.NewOrganizationRequirementReturns(organizationReq) 331 pluginUserModel = []plugin_models.GetSpaceUsers_Model{} 332 deps.PluginModels.SpaceUsers = &pluginUserModel 333 }) 334 335 It("populates the plugin model with users with multiple roles", func() { 336 testcmd.RunCLICommand("space-users", []string{"the-org", "the-space"}, requirementsFactory, updateCommandDependency, true, ui) 337 338 Expect(pluginUserModel).To(HaveLen(4)) 339 for _, u := range pluginUserModel { 340 switch u.Username { 341 case "user1": 342 Expect(u.Guid).To(Equal("1111")) 343 Expect(u.Roles).To(ConsistOf([]string{"RoleSpaceManager", "RoleSpaceAuditor"})) 344 case "user2": 345 Expect(u.Guid).To(Equal("2222")) 346 Expect(u.Roles).To(ConsistOf([]string{"RoleSpaceManager", "RoleSpaceDeveloper"})) 347 case "user3": 348 Expect(u.Guid).To(Equal("3333")) 349 Expect(u.Roles).To(ConsistOf([]string{"RoleSpaceManager", "RoleSpaceAuditor"})) 350 case "user4": 351 Expect(u.Guid).To(Equal("4444")) 352 Expect(u.Roles).To(ConsistOf([]string{"RoleSpaceManager", "RoleSpaceDeveloper"})) 353 default: 354 Fail("unexpected user: " + u.Username) 355 } 356 } 357 }) 358 }) 359 }) 360 })