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  })