github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/iamuum/iamuumv1/access_group_members_test.go (about) 1 package iamuumv1 2 3 import ( 4 "log" 5 "net/http" 6 7 bluemix "github.com/IBM-Cloud/bluemix-go" 8 "github.com/IBM-Cloud/bluemix-go/client" 9 "github.com/IBM-Cloud/bluemix-go/models" 10 "github.com/IBM-Cloud/bluemix-go/session" 11 . "github.com/onsi/ginkgo" 12 . "github.com/onsi/gomega" 13 "github.com/onsi/gomega/ghttp" 14 ) 15 16 var _ = Describe("AccessGroupMemberRepository", func() { 17 var ( 18 server *ghttp.Server 19 ) 20 21 Describe("List()", func() { 22 Context("When API error 403 returns", func() { 23 BeforeEach(func() { 24 server = ghttp.NewServer() 25 server.AppendHandlers( 26 ghttp.CombineHandlers( 27 ghttp.VerifyRequest(http.MethodGet, "/v1/groups/def/members"), 28 ghttp.RespondWith(http.StatusForbidden, ` 29 { 30 "message": "The provided access token does not have the proper authority to access this operation." 31 }`), 32 ), 33 ) 34 }) 35 36 It("should return API 403 error", func() { 37 _, err := newTestAccessGroupMemberRepo(server.URL()).List("def") 38 Expect(err).Should(HaveOccurred()) 39 Expect(err.Error()).Should(ContainSubstring("Request failed with status code: 403")) 40 }) 41 }) 42 43 Context("When other JSON error returns", func() { 44 BeforeEach(func() { 45 server = ghttp.NewServer() 46 server.AppendHandlers( 47 ghttp.CombineHandlers( 48 ghttp.VerifyRequest(http.MethodGet, "/v1/groups/abc/members"), 49 ghttp.RespondWith(http.StatusBadGateway, `{ 50 "message": "other json error" 51 }`), 52 ), 53 ) 54 }) 55 56 It("should return server error", func() { 57 _, err := newTestAccessGroupMemberRepo(server.URL()).List("abc") 58 Expect(err).Should(HaveOccurred()) 59 Expect(err.Error()).Should(ContainSubstring("other json error")) 60 }) 61 }) 62 63 Context("When no group member returned", func() { 64 BeforeEach(func() { 65 server = ghttp.NewServer() 66 server.AppendHandlers( 67 ghttp.CombineHandlers( 68 ghttp.VerifyRequest(http.MethodGet, "/v1/groups/abc/members"), 69 ghttp.RespondWith(http.StatusOK, ` 70 { 71 "limit": 50, 72 "offset": 0, 73 "total_count": 0 74 }`), 75 ), 76 ) 77 }) 78 79 It("should return empty", func() { 80 members, err := newTestAccessGroupMemberRepo(server.URL()).List("abc") 81 82 Expect(err).ShouldNot(HaveOccurred()) 83 Expect(members).Should(BeEmpty()) 84 }) 85 }) 86 87 Context("When there is one page", func() { 88 BeforeEach(func() { 89 server = ghttp.NewServer() 90 server.AppendHandlers( 91 ghttp.CombineHandlers( 92 ghttp.VerifyRequest(http.MethodGet, "/v1/groups/abc/members"), 93 ghttp.RespondWith(http.StatusOK, ` 94 { 95 "limit": 50, 96 "offset": 0, 97 "total_count": 2, 98 "members": [{ 99 "href": "https://iam.stage1.bluemix.net/008facc4-412f-463e-bd1b-99dd7dcfa27b", 100 "id": "008facc4-412f-463e-bd1b-99dd7dcfa27b", 101 "type": "Editor" 102 },{ 103 "href": "https://iam.stage1.bluemix.net/048af74a-8435-4783-8ad9-8e207fa24afd", 104 "id": "048af74a-8435-4783-8ad9-8e207fa24afd", 105 "type": "Viewer" 106 }] 107 }`), 108 ), 109 ) 110 }) 111 112 It("should return one page", func() { 113 members, err := newTestAccessGroupMemberRepo(server.URL()).List("abc") 114 115 Expect(err).ShouldNot(HaveOccurred()) 116 Expect(members).Should(HaveLen(2)) 117 118 Expect(members[0].ID).Should(Equal("008facc4-412f-463e-bd1b-99dd7dcfa27b")) 119 Expect(members[0].Type).Should(Equal("Editor")) 120 121 Expect(members[1].ID).Should(Equal("048af74a-8435-4783-8ad9-8e207fa24afd")) 122 Expect(members[1].Type).Should(Equal("Viewer")) 123 }) 124 }) 125 126 Context("When there are multiple pages", func() { 127 BeforeEach(func() { 128 server = ghttp.NewServer() 129 server.AppendHandlers( 130 ghttp.CombineHandlers( 131 ghttp.VerifyRequest(http.MethodGet, "/v1/groups/abc/members"), 132 ghttp.RespondWith(http.StatusOK, ` 133 { 134 "limit": 1, 135 "offset": 0, 136 "total_count": 2, 137 "next": { 138 "href": "`+server.URL()+`/v1/groups/abc/members?page=1" 139 }, 140 "members": [{ 141 "href": "https://iam.stage1.bluemix.net/008facc4-412f-463e-bd1b-99dd7dcfa27b", 142 "id": "008facc4-412f-463e-bd1b-99dd7dcfa27b", 143 "type": "Editor" 144 }] 145 }`), 146 ), 147 ghttp.CombineHandlers( 148 ghttp.VerifyRequest(http.MethodGet, "/v1/groups/abc/members", "page=1"), 149 ghttp.RespondWith(http.StatusOK, ` 150 { 151 "limit": 1, 152 "offset": 1, 153 "total_count": 2, 154 "members": [{ 155 "href": "https://iam.stage1.bluemix.net/048af74a-8435-4783-8ad9-8e207fa24afd", 156 "id": "048af74a-8435-4783-8ad9-8e207fa24afd", 157 "type": "Viewer" 158 }] 159 }`), 160 ), 161 ) 162 }) 163 164 It("should return all pages", func() { 165 members, err := newTestAccessGroupMemberRepo(server.URL()).List("abc") 166 167 Expect(err).ShouldNot(HaveOccurred()) 168 Expect(members).Should(HaveLen(2)) 169 170 Expect(members[0].ID).Should(Equal("008facc4-412f-463e-bd1b-99dd7dcfa27b")) 171 Expect(members[0].Type).Should(Equal("Editor")) 172 173 Expect(members[1].ID).Should(Equal("048af74a-8435-4783-8ad9-8e207fa24afd")) 174 Expect(members[1].Type).Should(Equal("Viewer")) 175 }) 176 }) 177 }) 178 179 Describe("Add()", func() { 180 Context("When add one group member", func() { 181 BeforeEach(func() { 182 server = ghttp.NewServer() 183 server.AppendHandlers( 184 ghttp.CombineHandlers( 185 ghttp.VerifyRequest(http.MethodPut, "/v1/groups/abc/members"), 186 ghttp.VerifyJSONRepresenting(AddGroupMemberRequest{ 187 Members: []models.AccessGroupMember{ 188 models.AccessGroupMember{ 189 ID: "test", 190 Type: AccessGroupMemberUser, 191 }, 192 }, 193 }), 194 ghttp.RespondWith(http.StatusMultiStatus, ` 195 { 196 "members": [{ 197 "msg":"", 198 "ok":true, 199 "id":"test", 200 "type":"user" 201 }] 202 }`), 203 ), 204 ) 205 }) 206 207 It("should return success", func() { 208 response, err := newTestAccessGroupMemberRepo(server.URL()).Add("abc", AddGroupMemberRequest{ 209 Members: []models.AccessGroupMember{ 210 models.AccessGroupMember{ 211 ID: "test", 212 Type: AccessGroupMemberUser, 213 }, 214 }, 215 }) 216 217 Expect(err).ShouldNot(HaveOccurred()) 218 Expect(response.Members).Should(HaveLen(1)) 219 Expect(response.Members[0].ID).Should(Equal("test")) 220 Expect(response.Members[0].Type).Should(Equal(AccessGroupMemberUser)) 221 Expect(response.Members[0].OK).Should(BeTrue()) 222 }) 223 }) 224 225 Context("When add multiple group members with partial success", func() { 226 BeforeEach(func() { 227 server = ghttp.NewServer() 228 server.AppendHandlers( 229 ghttp.CombineHandlers( 230 ghttp.VerifyRequest(http.MethodPut, "/v1/groups/abc/members"), 231 ghttp.VerifyJSONRepresenting(AddGroupMemberRequest{ 232 Members: []models.AccessGroupMember{ 233 models.AccessGroupMember{ 234 ID: "test", 235 Type: AccessGroupMemberUser, 236 }, 237 models.AccessGroupMember{ 238 ID: "test2", 239 Type: AccessGroupMemberUser, 240 }, 241 }, 242 }), 243 ghttp.RespondWith(http.StatusMultiStatus, ` 244 { 245 "members": [{ 246 "msg":"", 247 "ok":true, 248 "id":"test", 249 "type":"user" 250 },{ 251 "msg":"", 252 "ok":false, 253 "id":"test2", 254 "type":"user" 255 }] 256 }`), 257 ), 258 ) 259 }) 260 261 It("should return partial success", func() { 262 response, err := newTestAccessGroupMemberRepo(server.URL()).Add("abc", AddGroupMemberRequest{ 263 Members: []models.AccessGroupMember{ 264 models.AccessGroupMember{ 265 ID: "test", 266 Type: AccessGroupMemberUser, 267 }, 268 models.AccessGroupMember{ 269 ID: "test2", 270 Type: AccessGroupMemberUser, 271 }, 272 }, 273 }) 274 275 Expect(err).ShouldNot(HaveOccurred()) 276 Expect(response.Members).Should(HaveLen(2)) 277 Expect(response.Members[0].ID).Should(Equal("test")) 278 Expect(response.Members[0].Type).Should(Equal(AccessGroupMemberUser)) 279 Expect(response.Members[0].OK).Should(BeTrue()) 280 Expect(response.Members[1].ID).Should(Equal("test2")) 281 Expect(response.Members[1].Type).Should(Equal(AccessGroupMemberUser)) 282 Expect(response.Members[1].OK).Should(BeFalse()) 283 }) 284 }) 285 286 Context("When access group is not found", func() { 287 BeforeEach(func() { 288 server = ghttp.NewServer() 289 server.AppendHandlers( 290 ghttp.CombineHandlers( 291 ghttp.VerifyRequest(http.MethodPut, "/v1/groups/abc/members"), 292 ghttp.VerifyJSONRepresenting(AddGroupMemberRequest{ 293 Members: []models.AccessGroupMember{ 294 models.AccessGroupMember{ 295 ID: "test", 296 Type: AccessGroupMemberUser, 297 }, 298 }, 299 }), 300 ghttp.RespondWith(http.StatusNotFound, ` 301 { 302 "StatusCode": 404, 303 "code": "not_found", 304 "message": "No groups found for the member test." 305 }`), 306 ), 307 ) 308 }) 309 310 It("should return not found error", func() { 311 _, err := newTestAccessGroupMemberRepo(server.URL()).Add("abc", AddGroupMemberRequest{ 312 Members: []models.AccessGroupMember{ 313 models.AccessGroupMember{ 314 ID: "test", 315 Type: AccessGroupMemberUser, 316 }, 317 }, 318 }) 319 320 Expect(err).Should(HaveOccurred()) 321 Expect(err.Error()).Should(ContainSubstring("not_found")) 322 }) 323 }) 324 }) 325 326 Describe("Remove()", func() { 327 Context("When member is deleted", func() { 328 BeforeEach(func() { 329 server = ghttp.NewServer() 330 server.AppendHandlers( 331 ghttp.CombineHandlers( 332 ghttp.VerifyRequest(http.MethodDelete, "/v1/groups/abc/members/test"), 333 ghttp.RespondWith(http.StatusNoContent, ""), 334 ), 335 ) 336 }) 337 338 It("should return success", func() { 339 err := newTestAccessGroupMemberRepo(server.URL()).Remove("abc", "test") 340 341 Expect(err).Should(Succeed()) 342 }) 343 }) 344 345 Context("When member is not found", func() { 346 BeforeEach(func() { 347 server = ghttp.NewServer() 348 server.AppendHandlers( 349 ghttp.CombineHandlers( 350 ghttp.VerifyRequest(http.MethodDelete, "/v1/groups/abc/members/test"), 351 ghttp.RespondWith(http.StatusNotFound, `{ 352 "StatusCode": 404, 353 "code": "not_found", 354 "message": "Group member test is not found" 355 }`), 356 ), 357 ) 358 }) 359 360 It("should return not found error", func() { 361 err := newTestAccessGroupMemberRepo(server.URL()).Remove("abc", "test") 362 363 Expect(err).Should(HaveOccurred()) 364 Expect(err.Error()).Should(ContainSubstring("not_found")) 365 }) 366 }) 367 }) 368 369 }) 370 371 func newTestAccessGroupMemberRepo(url string) AccessGroupMemberRepository { 372 sess, err := session.New() 373 if err != nil { 374 log.Fatal(err) 375 } 376 conf := sess.Config.Copy() 377 conf.Endpoint = &url 378 client := client.Client{ 379 Config: conf, 380 ServiceName: bluemix.IAMUUMService, 381 } 382 return NewAccessGroupMemberRepository(&client) 383 }