github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/cf/api/users_test.go (about) 1 package api_test 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/url" 7 "time" 8 9 "github.com/liamawhite/cli-with-i18n/cf/api" 10 "github.com/liamawhite/cli-with-i18n/cf/configuration/coreconfig" 11 "github.com/liamawhite/cli-with-i18n/cf/errors" 12 "github.com/liamawhite/cli-with-i18n/cf/models" 13 "github.com/liamawhite/cli-with-i18n/cf/net" 14 "github.com/liamawhite/cli-with-i18n/cf/trace/tracefakes" 15 16 "github.com/liamawhite/cli-with-i18n/cf/terminal/terminalfakes" 17 testconfig "github.com/liamawhite/cli-with-i18n/util/testhelpers/configuration" 18 19 . "github.com/onsi/ginkgo" 20 . "github.com/onsi/gomega" 21 "github.com/onsi/gomega/ghttp" 22 ) 23 24 var _ = Describe("UserRepository", func() { 25 var ( 26 client api.UserRepository 27 28 config coreconfig.ReadWriter 29 ccServer *ghttp.Server 30 uaaServer *ghttp.Server 31 ccGateway net.Gateway 32 uaaGateway net.Gateway 33 ) 34 35 BeforeEach(func() { 36 ccServer = ghttp.NewServer() 37 uaaServer = ghttp.NewServer() 38 39 config = testconfig.NewRepositoryWithDefaults() 40 config.SetAPIEndpoint(ccServer.URL()) 41 config.SetUaaEndpoint(uaaServer.URL()) 42 ccGateway = net.NewCloudControllerGateway(config, time.Now, new(terminalfakes.FakeUI), new(tracefakes.FakePrinter), "") 43 uaaGateway = net.NewUAAGateway(config, new(terminalfakes.FakeUI), new(tracefakes.FakePrinter), "") 44 client = api.NewCloudControllerUserRepository(config, uaaGateway, ccGateway) 45 }) 46 47 AfterEach(func() { 48 if ccServer != nil { 49 ccServer.Close() 50 } 51 if uaaServer != nil { 52 uaaServer.Close() 53 } 54 }) 55 56 Describe("ListUsersInOrgForRole", func() { 57 Context("when there are no users in the given org with the given role", func() { 58 BeforeEach(func() { 59 ccServer.AppendHandlers( 60 ghttp.CombineHandlers( 61 ghttp.VerifyRequest("GET", "/v2/organizations/org-guid/managers"), 62 ghttp.VerifyHeader(http.Header{ 63 "accept": []string{"application/json"}, 64 }), 65 ghttp.RespondWith(http.StatusOK, `{"resources":[]}`), 66 ), 67 ) 68 }) 69 70 It("makes a request to CC", func() { 71 _, err := client.ListUsersInOrgForRole("org-guid", models.RoleOrgManager) 72 Expect(err).NotTo(HaveOccurred()) 73 Expect(ccServer.ReceivedRequests()).To(HaveLen(1)) 74 }) 75 76 It("returns no users", func() { 77 users, err := client.ListUsersInOrgForRole("org-guid", models.RoleOrgManager) 78 Expect(err).NotTo(HaveOccurred()) 79 Expect(len(users)).To(Equal(0)) 80 }) 81 }) 82 83 Context("when there are users in the given org with the given role", func() { 84 BeforeEach(func() { 85 ccServer.AppendHandlers( 86 ghttp.CombineHandlers( 87 ghttp.VerifyRequest("GET", "/v2/organizations/org-guid/managers"), 88 ghttp.VerifyHeader(http.Header{ 89 "accept": []string{"application/json"}, 90 }), 91 ghttp.RespondWith(http.StatusOK, `{ 92 "resources":[ 93 {"metadata": {"guid": "user-1-guid"}, "entity": {}} 94 ]}`), 95 ), 96 ) 97 98 uaaServer.AppendHandlers( 99 ghttp.CombineHandlers( 100 ghttp.VerifyRequest("GET", "/Users", fmt.Sprintf("attributes=id,userName&filter=%s", url.QueryEscape(`ID eq "user-1-guid"`))), 101 ghttp.VerifyHeader(http.Header{ 102 "accept": []string{"application/json"}, 103 }), 104 ghttp.RespondWith(http.StatusOK, `{ 105 "resources": [ 106 { "id": "user-1-guid", "userName": "Super user 1" } 107 ]}`), 108 ), 109 ) 110 }) 111 112 It("makes a request to CC", func() { 113 _, err := client.ListUsersInOrgForRole("org-guid", models.RoleOrgManager) 114 Expect(err).NotTo(HaveOccurred()) 115 Expect(ccServer.ReceivedRequests()).To(HaveLen(1)) 116 }) 117 118 It("makes a request to UAA", func() { 119 _, err := client.ListUsersInOrgForRole("org-guid", models.RoleOrgManager) 120 Expect(err).NotTo(HaveOccurred()) 121 Expect(uaaServer.ReceivedRequests()).To(HaveLen(1)) 122 }) 123 124 It("returns the users", func() { 125 users, err := client.ListUsersInOrgForRole("org-guid", models.RoleOrgManager) 126 Expect(err).NotTo(HaveOccurred()) 127 128 Expect(len(users)).To(Equal(1)) 129 Expect(users[0].GUID).To(Equal("user-1-guid")) 130 Expect(users[0].Username).To(Equal("Super user 1")) 131 }) 132 }) 133 134 Context("when there are multiple pages of users in the given org with the given role", func() { 135 BeforeEach(func() { 136 ccServer.AppendHandlers( 137 ghttp.CombineHandlers( 138 ghttp.VerifyRequest("GET", "/v2/organizations/org-guid/managers"), 139 ghttp.VerifyHeader(http.Header{ 140 "accept": []string{"application/json"}, 141 }), 142 ghttp.RespondWith(http.StatusOK, `{ 143 "next_url": "/v2/organizations/org-guid/managers?page=2", 144 "resources":[ 145 {"metadata": {"guid": "user-1-guid"}, "entity": {}} 146 ]}`), 147 ), 148 ghttp.CombineHandlers( 149 ghttp.VerifyRequest("GET", "/v2/organizations/org-guid/managers", "page=2"), 150 ghttp.VerifyHeader(http.Header{ 151 "accept": []string{"application/json"}, 152 }), 153 ghttp.RespondWith(http.StatusOK, `{ 154 "resources":[ 155 {"metadata": {"guid": "user-2-guid"}, "entity": {"username":"user 2 from cc"}}, 156 {"metadata": {"guid": "user-3-guid"}, "entity": {"username":"user 3 from cc"}} 157 ]}`), 158 ), 159 ) 160 161 uaaServer.AppendHandlers( 162 ghttp.CombineHandlers( 163 ghttp.VerifyRequest("GET", "/Users", fmt.Sprintf("attributes=id,userName&filter=%s", url.QueryEscape(`ID eq "user-1-guid" or ID eq "user-2-guid" or ID eq "user-3-guid"`))), 164 ghttp.VerifyHeader(http.Header{ 165 "accept": []string{"application/json"}, 166 }), 167 ghttp.RespondWith(http.StatusOK, `{ 168 "resources": [ 169 { "id": "user-1-guid", "userName": "Super user 1" }, 170 { "id": "user-2-guid", "userName": "Super user 2" }, 171 { "id": "user-3-guid", "userName": "Super user 3" } 172 ] 173 }`), 174 ), 175 ) 176 }) 177 178 It("makes a request to CC for each page of results", func() { 179 _, err := client.ListUsersInOrgForRole("org-guid", models.RoleOrgManager) 180 Expect(err).NotTo(HaveOccurred()) 181 Expect(ccServer.ReceivedRequests()).To(HaveLen(2)) 182 }) 183 184 It("makes a request to UAA", func() { 185 _, err := client.ListUsersInOrgForRole("org-guid", models.RoleOrgManager) 186 Expect(err).NotTo(HaveOccurred()) 187 Expect(uaaServer.ReceivedRequests()).To(HaveLen(1)) 188 }) 189 190 It("returns all paginated users", func() { 191 users, err := client.ListUsersInOrgForRole("org-guid", models.RoleOrgManager) 192 Expect(err).NotTo(HaveOccurred()) 193 194 Expect(len(users)).To(Equal(3)) 195 Expect(users[0].GUID).To(Equal("user-1-guid")) 196 Expect(users[0].Username).To(Equal("Super user 1")) 197 Expect(users[1].GUID).To(Equal("user-2-guid")) 198 Expect(users[1].Username).To(Equal("Super user 2")) 199 Expect(users[2].GUID).To(Equal("user-3-guid")) 200 Expect(users[2].Username).To(Equal("Super user 3")) 201 }) 202 }) 203 204 Context("when CC returns an error", func() { 205 BeforeEach(func() { 206 ccServer.AppendHandlers( 207 ghttp.CombineHandlers( 208 ghttp.VerifyRequest("GET", "/v2/organizations/org-guid/managers"), 209 ghttp.VerifyHeader(http.Header{ 210 "accept": []string{"application/json"}, 211 }), 212 ghttp.RespondWith(http.StatusGatewayTimeout, nil), 213 ), 214 ) 215 }) 216 217 It("does not make a request to UAA", func() { 218 client.ListUsersInOrgForRole("org-guid", models.RoleOrgManager) 219 Expect(uaaServer.ReceivedRequests()).To(BeZero()) 220 }) 221 222 It("returns an error", func() { 223 _, err := client.ListUsersInOrgForRole("org-guid", models.RoleOrgManager) 224 httpErr, ok := err.(errors.HTTPError) 225 Expect(ok).To(BeTrue()) 226 Expect(httpErr.StatusCode()).To(Equal(http.StatusGatewayTimeout)) 227 }) 228 }) 229 230 Context("when the UAA endpoint has not been configured", func() { 231 BeforeEach(func() { 232 ccServer.AppendHandlers( 233 ghttp.CombineHandlers( 234 ghttp.VerifyRequest("GET", "/v2/organizations/org-guid/managers"), 235 ghttp.VerifyHeader(http.Header{ 236 "accept": []string{"application/json"}, 237 }), 238 ghttp.RespondWith(http.StatusOK, `{ 239 "resources":[ 240 {"metadata": {"guid": "user-1-guid"}, "entity": {}} 241 ]}`), 242 ), 243 ) 244 config.SetUaaEndpoint("") 245 }) 246 247 It("returns an error", func() { 248 _, err := client.ListUsersInOrgForRole("org-guid", models.RoleOrgManager) 249 Expect(err).To(HaveOccurred()) 250 }) 251 }) 252 }) 253 254 Describe("ListUsersInOrgForRoleWithNoUAA", func() { 255 Context("when there are users in the given org with the given role", func() { 256 BeforeEach(func() { 257 ccServer.AppendHandlers( 258 ghttp.CombineHandlers( 259 ghttp.VerifyRequest("GET", "/v2/organizations/org-guid/managers"), 260 ghttp.VerifyHeader(http.Header{ 261 "accept": []string{"application/json"}, 262 }), 263 ghttp.RespondWith(http.StatusOK, `{ 264 "resources":[ 265 {"metadata": {"guid": "user-1-guid"}, "entity": {}} 266 ]}`), 267 ), 268 ) 269 }) 270 271 It("makes a request to CC", func() { 272 _, err := client.ListUsersInOrgForRoleWithNoUAA("org-guid", models.RoleOrgManager) 273 Expect(err).NotTo(HaveOccurred()) 274 Expect(ccServer.ReceivedRequests()).To(HaveLen(1)) 275 }) 276 277 It("does not make a request to UAA", func() { 278 _, err := client.ListUsersInOrgForRoleWithNoUAA("org-guid", models.RoleOrgManager) 279 Expect(err).NotTo(HaveOccurred()) 280 Expect(uaaServer.ReceivedRequests()).To(BeZero()) 281 }) 282 283 It("returns the users", func() { 284 users, err := client.ListUsersInOrgForRoleWithNoUAA("org-guid", models.RoleOrgManager) 285 Expect(err).NotTo(HaveOccurred()) 286 287 Expect(len(users)).To(Equal(1)) 288 Expect(users[0].GUID).To(Equal("user-1-guid")) 289 Expect(users[0].Username).To(BeEmpty()) 290 }) 291 }) 292 293 Context("when there are multiple pages of users in the given org with the given role", func() { 294 BeforeEach(func() { 295 ccServer.AppendHandlers( 296 ghttp.CombineHandlers( 297 ghttp.VerifyRequest("GET", "/v2/organizations/org-guid/managers"), 298 ghttp.VerifyHeader(http.Header{ 299 "accept": []string{"application/json"}, 300 }), 301 ghttp.RespondWith(http.StatusOK, `{ 302 "next_url": "/v2/organizations/org-guid/managers?page=2", 303 "resources":[ 304 {"metadata": {"guid": "user-1-guid"}, "entity": {}} 305 ]}`), 306 ), 307 ghttp.CombineHandlers( 308 ghttp.VerifyRequest("GET", "/v2/organizations/org-guid/managers", "page=2"), 309 ghttp.VerifyHeader(http.Header{ 310 "accept": []string{"application/json"}, 311 }), 312 ghttp.RespondWith(http.StatusOK, `{ 313 "resources":[ 314 {"metadata": {"guid": "user-2-guid"}, "entity": {"username":"user 2 from cc"}}, 315 {"metadata": {"guid": "user-3-guid"}, "entity": {"username":"user 3 from cc"}} 316 ]}`), 317 ), 318 ) 319 }) 320 321 It("makes a request to CC for each page of results", func() { 322 _, err := client.ListUsersInOrgForRoleWithNoUAA("org-guid", models.RoleOrgManager) 323 Expect(err).NotTo(HaveOccurred()) 324 Expect(ccServer.ReceivedRequests()).To(HaveLen(2)) 325 }) 326 327 It("does not make a request to UAA", func() { 328 _, err := client.ListUsersInOrgForRoleWithNoUAA("org-guid", models.RoleOrgManager) 329 Expect(err).NotTo(HaveOccurred()) 330 Expect(uaaServer.ReceivedRequests()).To(BeZero()) 331 }) 332 333 It("returns all paginated users", func() { 334 users, err := client.ListUsersInOrgForRoleWithNoUAA("org-guid", models.RoleOrgManager) 335 Expect(err).NotTo(HaveOccurred()) 336 337 Expect(len(users)).To(Equal(3)) 338 Expect(users[0].GUID).To(Equal("user-1-guid")) 339 Expect(users[0].Username).To(BeEmpty()) 340 Expect(users[1].GUID).To(Equal("user-2-guid")) 341 Expect(users[1].Username).To(Equal("user 2 from cc")) 342 Expect(users[2].GUID).To(Equal("user-3-guid")) 343 Expect(users[2].Username).To(Equal("user 3 from cc")) 344 }) 345 }) 346 347 Context("when there are no users in the given org with the given role", func() { 348 BeforeEach(func() { 349 ccServer.AppendHandlers( 350 ghttp.CombineHandlers( 351 ghttp.VerifyRequest("GET", "/v2/organizations/org-guid/managers"), 352 ghttp.VerifyHeader(http.Header{ 353 "accept": []string{"application/json"}, 354 }), 355 ghttp.RespondWith(http.StatusOK, `{"resources":[]}`), 356 ), 357 ) 358 }) 359 360 It("makes a request to CC", func() { 361 _, err := client.ListUsersInOrgForRoleWithNoUAA("org-guid", models.RoleOrgManager) 362 Expect(err).NotTo(HaveOccurred()) 363 Expect(ccServer.ReceivedRequests()).To(HaveLen(1)) 364 }) 365 366 It("does not make a request to UAA", func() { 367 _, err := client.ListUsersInOrgForRoleWithNoUAA("org-guid", models.RoleOrgManager) 368 Expect(err).NotTo(HaveOccurred()) 369 Expect(uaaServer.ReceivedRequests()).To(BeZero()) 370 }) 371 372 It("returns no users", func() { 373 users, err := client.ListUsersInOrgForRoleWithNoUAA("org-guid", models.RoleOrgManager) 374 Expect(err).NotTo(HaveOccurred()) 375 Expect(len(users)).To(Equal(0)) 376 }) 377 }) 378 379 Context("when CC returns an error", func() { 380 BeforeEach(func() { 381 ccServer.AppendHandlers( 382 ghttp.CombineHandlers( 383 ghttp.VerifyRequest("GET", "/v2/organizations/org-guid/managers"), 384 ghttp.VerifyHeader(http.Header{ 385 "accept": []string{"application/json"}, 386 }), 387 ghttp.RespondWith(http.StatusGatewayTimeout, nil), 388 ), 389 ) 390 }) 391 392 It("does not make a request to UAA", func() { 393 client.ListUsersInOrgForRoleWithNoUAA("org-guid", models.RoleOrgManager) 394 Expect(uaaServer.ReceivedRequests()).To(BeZero()) 395 }) 396 397 It("returns an error", func() { 398 _, err := client.ListUsersInOrgForRoleWithNoUAA("org-guid", models.RoleOrgManager) 399 httpErr, ok := err.(errors.HTTPError) 400 Expect(ok).To(BeTrue()) 401 Expect(httpErr.StatusCode()).To(Equal(http.StatusGatewayTimeout)) 402 }) 403 }) 404 }) 405 })