It("gets the UAA endpoint and saves it to the config file", func() { requirementsFactory.ApiEndpointSuccess = true testcmd.RunCommand(cmd, testcmd.NewContext("auth", []string{"*****@*****.**", "password"}), requirementsFactory) Expect(repo.GetLoginPromptsWasCalled).To(BeTrue()) }) Describe("when authentication fails", func() { BeforeEach(func() { repo.AuthError = true testcmd.RunCommand(cmd, testcmd.NewContext("auth", []string{"username", "password"}), requirementsFactory) }) It("does not prompt the user when provided username and password", func() { testassert.SliceContains(ui.Outputs, testassert.Lines{ {config.ApiEndpoint()}, {"Authenticating..."}, {"FAILED"}, {"Error authenticating"}, }) }) It("clears the user's session", func() { Expect(config.AccessToken()).To(BeEmpty()) Expect(config.RefreshToken()).To(BeEmpty()) Expect(config.SpaceFields()).To(Equal(models.SpaceFields{})) Expect(config.OrganizationFields()).To(Equal(models.OrganizationFields{})) }) }) }) })
It("refreshes the token when UAA requests fail", func() { apiServer := httptest.NewTLSServer(refreshTokenApiEndPoint( `{ "error": "invalid_token", "error_description": "Auth token is invalid" }`, testnet.TestResponse{Status: http.StatusOK}, )) defer apiServer.Close() ccGateway.SetTrustedCerts(apiServer.TLS.Certificates) config, auth := createAuthenticationRepository(apiServer, authServer) uaaGateway.SetTokenRefresher(auth) request, apiErr := uaaGateway.NewRequest("POST", config.ApiEndpoint()+"/v2/foo", config.AccessToken(), strings.NewReader("expected body")) apiErr = uaaGateway.PerformRequest(request) Expect(apiErr).NotTo(HaveOccurred()) Expect(config.AccessToken()).To(Equal("bearer new-access-token")) Expect(config.RefreshToken()).To(Equal("new-refresh-token")) }) It("refreshes the token when CC requests fail", func() { apiServer := httptest.NewTLSServer(refreshTokenApiEndPoint( `{ "code": 1000, "description": "Auth token is invalid" }`, testnet.TestResponse{Status: http.StatusOK})) defer apiServer.Close() ccGateway.SetTrustedCerts(apiServer.TLS.Certificates) config, auth := createAuthenticationRepository(apiServer, authServer) ccGateway.SetTokenRefresher(auth) request, apiErr := ccGateway.NewRequest("POST", config.ApiEndpoint()+"/v2/foo", config.AccessToken(), strings.NewReader("expected body")) apiErr = ccGateway.PerformRequest(request) Expect(apiErr).NotTo(HaveOccurred())
space := models.SpaceFields{} space.Name = "my-space" space.Guid = "my-space-guid" config.SetApiEndpoint(testServer.URL) config.SetAccessToken("some access token") config.SetRefreshToken("some refresh token") config.SetOrganizationFields(org) config.SetSpaceFields(space) repo.UpdateEndpoint(testServer.URL) Expect(config.OrganizationFields()).To(Equal(org)) Expect(config.SpaceFields()).To(Equal(space)) Expect(config.AccessToken()).To(Equal("some access token")) Expect(config.RefreshToken()).To(Equal("some refresh token")) }) It("returns a failure response when the API request fails", func() { testServerFn = func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) } _, apiResponse := repo.UpdateEndpoint(testServer.URL) Expect(apiResponse.IsNotSuccessful()).To(BeTrue()) }) It("returns a failure response when the API returns invalid JSON", func() { testServerFn = invalidJsonResponseApiEndpoint
l := NewLogin(ui, Config, authRepo, endpointRepo, orgRepo, spaceRepo) testcmd.RunCommand(l, testcmd.NewContext("login", Flags), nil) testassert.SliceContains(ui.Outputs, testassert.Lines{ {"Select an org"}, {"1. some-org"}, {"2. my-new-org"}, {"Select a space"}, {"1. my-space"}, {"2. some-space"}, }) Expect(Config.OrganizationFields().Guid).To(Equal("my-new-org-guid")) Expect(Config.SpaceFields().Guid).To(Equal("my-space-guid")) Expect(Config.AccessToken()).To(Equal("my_access_token")) Expect(Config.RefreshToken()).To(Equal("my_refresh_token")) Expect(endpointRepo.UpdateEndpointReceived).To(Equal("api.example.com")) Expect(orgRepo.FindByNameName).To(Equal("my-new-org")) Expect(spaceRepo.FindByNameName).To(Equal("my-space")) Expect(ui.ShowConfigurationCalled).To(BeTrue()) }) It("lets the user select an org and space by name", func() { ui.Inputs = []string{"api.example.com", "*****@*****.**", "password", "my-new-org", "my-space"} l := NewLogin(ui, Config, authRepo, endpointRepo, orgRepo, spaceRepo) testcmd.RunCommand(l, testcmd.NewContext("login", Flags), nil)
}) It("logs in", func() { testServer, handler, config = setupAuthDependencies(successfulLoginRequest) auth := NewUAAAuthenticationRepository(gateway, config) apiErr := auth.Authenticate(map[string]string{ "username": "******", "password": "******", }) Expect(handler).To(testnet.HaveAllRequestsCalled()) Expect(apiErr).NotTo(HaveOccurred()) Expect(config.AuthenticationEndpoint()).To(Equal(testServer.URL)) Expect(config.AccessToken()).To(Equal("BEARER my_access_token")) Expect(config.RefreshToken()).To(Equal("my_refresh_token")) }) It("returns a failure response when login fails", func() { testServer, handler, config = setupAuthDependencies(unsuccessfulLoginRequest) auth := NewUAAAuthenticationRepository(gateway, config) apiErr := auth.Authenticate(map[string]string{ "username": "******", "password": "******", }) Expect(handler).To(testnet.HaveAllRequestsCalled()) Expect(apiErr).NotTo(BeNil()) Expect(apiErr.Error()).To(Equal("Password is incorrect, please try again.")) Expect(config.AccessToken()).To(BeEmpty())