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  }