github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/iamuum/iamuumv2/access_group_members_test.go (about) 1 package iamuumv2 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, "/v2/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, "/v2/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, "/v2/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, "/v2/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("")) 119 Expect(members[0].Type).Should(Equal("Editor")) 120 121 Expect(members[1].ID).Should(Equal("")) 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, "/v2/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()+`/v2/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, "/v2/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("")) 171 Expect(members[0].Type).Should(Equal("Editor")) 172 173 Expect(members[1].ID).Should(Equal("")) 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, "/v2/groups/abc/members"), 186 ghttp.VerifyJSONRepresenting(AddGroupMemberRequestV2{ 187 Members: []models.AccessGroupMemberV2{ 188 models.AccessGroupMemberV2{ 189 ID: "test", 190 Type: AccessGroupMemberUser, 191 }, 192 }, 193 }), 194 ghttp.RespondWith(http.StatusMultiStatus, ` 195 { 196 "members": [{ 197 "id":"test", 198 "type":"user" 199 }] 200 }`), 201 ), 202 ) 203 }) 204 205 It("should return success", func() { 206 response, err := newTestAccessGroupMemberRepo(server.URL()).Add("abc", AddGroupMemberRequestV2{ 207 Members: []models.AccessGroupMemberV2{ 208 models.AccessGroupMemberV2{ 209 ID: "test", 210 Type: AccessGroupMemberUser, 211 }, 212 }, 213 }) 214 215 Expect(err).ShouldNot(HaveOccurred()) 216 Expect(response.Members).Should(HaveLen(1)) 217 Expect(response.Members[0].ID).Should(Equal("")) 218 Expect(response.Members[0].Type).Should(Equal(AccessGroupMemberUser)) 219 }) 220 }) 221 222 Context("When add multiple group members with partial success", func() { 223 BeforeEach(func() { 224 server = ghttp.NewServer() 225 server.AppendHandlers( 226 ghttp.CombineHandlers( 227 ghttp.VerifyRequest(http.MethodPut, "/v2/groups/abc/members"), 228 ghttp.VerifyJSONRepresenting(AddGroupMemberRequestV2{ 229 Members: []models.AccessGroupMemberV2{ 230 models.AccessGroupMemberV2{ 231 ID: "test", 232 Type: AccessGroupMemberUser, 233 }, 234 models.AccessGroupMemberV2{ 235 ID: "test2", 236 Type: AccessGroupMemberUser, 237 }, 238 }, 239 }), 240 ghttp.RespondWith(http.StatusMultiStatus, ` 241 { 242 "members": [{ 243 "id":"test", 244 "type":"user" 245 },{ 246 "id":"test2", 247 "type":"user" 248 }] 249 }`), 250 ), 251 ) 252 }) 253 254 It("should return partial success", func() { 255 response, err := newTestAccessGroupMemberRepo(server.URL()).Add("abc", AddGroupMemberRequestV2{ 256 Members: []models.AccessGroupMemberV2{ 257 models.AccessGroupMemberV2{ 258 ID: "test", 259 Type: AccessGroupMemberUser, 260 }, 261 models.AccessGroupMemberV2{ 262 ID: "test2", 263 Type: AccessGroupMemberUser, 264 }, 265 }, 266 }) 267 268 Expect(err).ShouldNot(HaveOccurred()) 269 Expect(response.Members).Should(HaveLen(2)) 270 Expect(response.Members[0].ID).Should(Equal("")) 271 Expect(response.Members[0].Type).Should(Equal(AccessGroupMemberUser)) 272 Expect(response.Members[1].ID).Should(Equal("")) 273 Expect(response.Members[1].Type).Should(Equal(AccessGroupMemberUser)) 274 }) 275 }) 276 277 Context("When access group is not found", func() { 278 BeforeEach(func() { 279 server = ghttp.NewServer() 280 server.AppendHandlers( 281 ghttp.CombineHandlers( 282 ghttp.VerifyRequest(http.MethodPut, "/v2/groups/abc/members"), 283 ghttp.VerifyJSONRepresenting(AddGroupMemberRequestV2{ 284 Members: []models.AccessGroupMemberV2{ 285 models.AccessGroupMemberV2{ 286 ID: "test", 287 Type: AccessGroupMemberUser, 288 }, 289 }, 290 }), 291 ghttp.RespondWith(http.StatusNotFound, ` 292 { 293 "StatusCode": 404, 294 "code": "not_found", 295 "message": "No groups found for the member test." 296 }`), 297 ), 298 ) 299 }) 300 301 It("should return not found error", func() { 302 _, err := newTestAccessGroupMemberRepo(server.URL()).Add("abc", AddGroupMemberRequestV2{ 303 Members: []models.AccessGroupMemberV2{ 304 models.AccessGroupMemberV2{ 305 ID: "test", 306 Type: AccessGroupMemberUser, 307 }, 308 }, 309 }) 310 311 Expect(err).Should(HaveOccurred()) 312 Expect(err.Error()).Should(ContainSubstring("not_found")) 313 }) 314 }) 315 }) 316 317 Describe("Remove()", func() { 318 Context("When member is deleted", func() { 319 BeforeEach(func() { 320 server = ghttp.NewServer() 321 server.AppendHandlers( 322 ghttp.CombineHandlers( 323 ghttp.VerifyRequest(http.MethodDelete, "/v2/groups/abc/members/test"), 324 ghttp.RespondWith(http.StatusNoContent, ""), 325 ), 326 ) 327 }) 328 329 It("should return success", func() { 330 err := newTestAccessGroupMemberRepo(server.URL()).Remove("abc", "test") 331 332 Expect(err).Should(Succeed()) 333 }) 334 }) 335 336 Context("When member is not found", func() { 337 BeforeEach(func() { 338 server = ghttp.NewServer() 339 server.AppendHandlers( 340 ghttp.CombineHandlers( 341 ghttp.VerifyRequest(http.MethodDelete, "/v2/groups/abc/members/test"), 342 ghttp.RespondWith(http.StatusNotFound, `{ 343 "StatusCode": 404, 344 "code": "not_found", 345 "message": "Group member test is not found" 346 }`), 347 ), 348 ) 349 }) 350 351 It("should return not found error", func() { 352 err := newTestAccessGroupMemberRepo(server.URL()).Remove("abc", "test") 353 354 Expect(err).Should(HaveOccurred()) 355 Expect(err.Error()).Should(ContainSubstring("not_found")) 356 }) 357 }) 358 }) 359 360 }) 361 362 func newTestAccessGroupMemberRepo(url string) AccessGroupMemberRepositoryV2 { 363 sess, err := session.New() 364 if err != nil { 365 log.Fatal(err) 366 } 367 conf := sess.Config.Copy() 368 conf.Endpoint = &url 369 client := client.Client{ 370 Config: conf, 371 ServiceName: bluemix.IAMUUMServicev2, 372 } 373 return NewAccessGroupMemberRepository(&client) 374 }