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  }