github.com/wanddynosios/cli/v8@v8.7.9-0.20240221182337-1a92e3a7017f/actor/v7action/user_test.go (about)

     1  package v7action_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	"code.cloudfoundry.org/cli/actor/actionerror"
     7  	. "code.cloudfoundry.org/cli/actor/v7action"
     8  	"code.cloudfoundry.org/cli/actor/v7action/v7actionfakes"
     9  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
    11  	"code.cloudfoundry.org/cli/api/uaa"
    12  	"code.cloudfoundry.org/cli/resources"
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  )
    16  
    17  var _ = Describe("User Actions", func() {
    18  	var (
    19  		actor                     *Actor
    20  		fakeUAAClient             *v7actionfakes.FakeUAAClient
    21  		fakeCloudControllerClient *v7actionfakes.FakeCloudControllerClient
    22  	)
    23  
    24  	BeforeEach(func() {
    25  		fakeUAAClient = new(v7actionfakes.FakeUAAClient)
    26  		fakeCloudControllerClient = new(v7actionfakes.FakeCloudControllerClient)
    27  		fakeConfig := new(v7actionfakes.FakeConfig)
    28  		actor = NewActor(fakeCloudControllerClient, fakeConfig, nil, fakeUAAClient, nil, nil)
    29  	})
    30  
    31  	Describe("CreateUser", func() {
    32  		var (
    33  			actualUser     resources.User
    34  			actualWarnings Warnings
    35  			actualErr      error
    36  		)
    37  
    38  		JustBeforeEach(func() {
    39  			actualUser, actualWarnings, actualErr = actor.CreateUser("some-new-user", "some-password", "some-origin")
    40  		})
    41  
    42  		When("no API errors occur", func() {
    43  			var createdUser resources.User
    44  
    45  			BeforeEach(func() {
    46  				createdUser = resources.User{
    47  					GUID: "new-user-cc-guid",
    48  				}
    49  				fakeUAAClient.CreateUserReturns(
    50  					uaa.User{
    51  						ID: "new-user-uaa-id",
    52  					},
    53  					nil,
    54  				)
    55  				fakeCloudControllerClient.CreateUserReturns(
    56  					createdUser,
    57  					ccv3.Warnings{
    58  						"warning-1",
    59  						"warning-2",
    60  					},
    61  					nil,
    62  				)
    63  			})
    64  
    65  			It("creates a new user and returns all warnings", func() {
    66  				Expect(actualErr).NotTo(HaveOccurred())
    67  
    68  				Expect(actualUser).To(Equal(resources.User(createdUser)))
    69  				Expect(actualWarnings).To(ConsistOf("warning-1", "warning-2"))
    70  
    71  				Expect(fakeUAAClient.CreateUserCallCount()).To(Equal(1))
    72  				username, password, origin := fakeUAAClient.CreateUserArgsForCall(0)
    73  				Expect(username).To(Equal("some-new-user"))
    74  				Expect(password).To(Equal("some-password"))
    75  				Expect(origin).To(Equal("some-origin"))
    76  
    77  				Expect(fakeCloudControllerClient.CreateUserCallCount()).To(Equal(1))
    78  				uaaUserID := fakeCloudControllerClient.CreateUserArgsForCall(0)
    79  				Expect(uaaUserID).To(Equal("new-user-uaa-id"))
    80  			})
    81  		})
    82  
    83  		When("the UAA API returns an error", func() {
    84  			var returnedErr error
    85  
    86  			BeforeEach(func() {
    87  				returnedErr = errors.New("some UAA error")
    88  				fakeUAAClient.CreateUserReturns(
    89  					uaa.User{
    90  						ID: "new-user-uaa-id",
    91  					},
    92  					returnedErr,
    93  				)
    94  			})
    95  
    96  			It("returns the same error", func() {
    97  				Expect(actualErr).To(MatchError(returnedErr))
    98  			})
    99  		})
   100  
   101  		When("the CC API returns an error", func() {
   102  			var returnedErr error
   103  
   104  			BeforeEach(func() {
   105  				returnedErr = errors.New("CC error")
   106  				fakeUAAClient.CreateUserReturns(
   107  					uaa.User{
   108  						ID: "new-user-uaa-id",
   109  					},
   110  					nil,
   111  				)
   112  				fakeCloudControllerClient.CreateUserReturns(
   113  					resources.User{},
   114  					ccv3.Warnings{
   115  						"warning-1",
   116  						"warning-2",
   117  					},
   118  					returnedErr,
   119  				)
   120  			})
   121  
   122  			It("returns the same error and all warnings", func() {
   123  				Expect(actualErr).To(MatchError(returnedErr))
   124  				Expect(actualWarnings).To(ConsistOf("warning-1", "warning-2"))
   125  			})
   126  		})
   127  	})
   128  
   129  	Describe("GetUser", func() {
   130  		var (
   131  			actualUser resources.User
   132  			actualErr  error
   133  		)
   134  
   135  		JustBeforeEach(func() {
   136  			actualUser, actualErr = actor.GetUser("some-user", "some-origin")
   137  		})
   138  
   139  		When("when the API returns a success response", func() {
   140  			When("the API returns one user", func() {
   141  				BeforeEach(func() {
   142  
   143  					fakeUAAClient.ListUsersReturns(
   144  						[]uaa.User{
   145  							{ID: "user-id"},
   146  						},
   147  						nil,
   148  					)
   149  				})
   150  
   151  				It("returns the single user", func() {
   152  					Expect(actualErr).NotTo(HaveOccurred())
   153  					Expect(actualUser).To(Equal(resources.User{GUID: "user-id"}))
   154  
   155  					Expect(fakeUAAClient.ListUsersCallCount()).To(Equal(1))
   156  					username, origin := fakeUAAClient.ListUsersArgsForCall(0)
   157  					Expect(username).To(Equal("some-user"))
   158  					Expect(origin).To(Equal("some-origin"))
   159  				})
   160  			})
   161  
   162  			When("the API returns no user", func() {
   163  				BeforeEach(func() {
   164  					fakeUAAClient.ListUsersReturns(
   165  						[]uaa.User{},
   166  						nil,
   167  					)
   168  				})
   169  
   170  				It("returns an error indicating user was not found in UAA", func() {
   171  					Expect(actualUser).To(Equal(resources.User{}))
   172  					Expect(actualErr).To(Equal(actionerror.UserNotFoundError{
   173  						Username: "some-user",
   174  						Origin:   "some-origin",
   175  					}))
   176  					Expect(fakeUAAClient.ListUsersCallCount()).To(Equal(1))
   177  				})
   178  			})
   179  
   180  			When("the API returns multiple users", func() {
   181  				BeforeEach(func() {
   182  					fakeUAAClient.ListUsersReturns(
   183  						[]uaa.User{
   184  							{ID: "user-guid-1", Origin: "uaa"},
   185  							{ID: "user-guid-2", Origin: "ldap"},
   186  						},
   187  						nil,
   188  					)
   189  				})
   190  
   191  				It("returns an error indicating user was not found in UAA", func() {
   192  					Expect(actualUser).To(Equal(resources.User{}))
   193  					Expect(actualErr).To(Equal(actionerror.MultipleUAAUsersFoundError{
   194  						Username: "some-user",
   195  						Origins:  []string{"uaa", "ldap"},
   196  					}))
   197  					Expect(fakeUAAClient.ListUsersCallCount()).To(Equal(1))
   198  				})
   199  			})
   200  		})
   201  
   202  		When("the API returns an error", func() {
   203  			var apiError error
   204  
   205  			BeforeEach(func() {
   206  				apiError = errors.New("uaa-api-get-users-error")
   207  				fakeUAAClient.ListUsersReturns(
   208  					nil,
   209  					apiError,
   210  				)
   211  			})
   212  
   213  			It("returns error coming from the API", func() {
   214  				Expect(actualUser).To(Equal(resources.User{}))
   215  				Expect(actualErr).To(MatchError("uaa-api-get-users-error"))
   216  
   217  				Expect(fakeUAAClient.ListUsersCallCount()).To(Equal(1))
   218  			})
   219  		})
   220  	})
   221  
   222  	Describe("DeleteUser", func() {
   223  		var (
   224  			actualWarnings Warnings
   225  			actualErr      error
   226  		)
   227  
   228  		JustBeforeEach(func() {
   229  			actualWarnings, actualErr = actor.DeleteUser("some-user-guid")
   230  		})
   231  
   232  		When("the UAA API returns an error", func() {
   233  			var returnedErr error
   234  
   235  			BeforeEach(func() {
   236  				returnedErr = errors.New("some UAA error")
   237  				fakeUAAClient.DeleteUserReturns(
   238  					uaa.User{},
   239  					returnedErr,
   240  				)
   241  			})
   242  
   243  			It("returns the same error", func() {
   244  				Expect(actualErr).To(MatchError(returnedErr))
   245  			})
   246  		})
   247  
   248  		When("the CC API returns an error", func() {
   249  			var returnedErr error
   250  
   251  			BeforeEach(func() {
   252  				returnedErr = errors.New("some CC error")
   253  				fakeUAAClient.DeleteUserReturns(
   254  					uaa.User{},
   255  					nil,
   256  				)
   257  				fakeCloudControllerClient.DeleteUserReturns(
   258  					"",
   259  					ccv3.Warnings{},
   260  					returnedErr,
   261  				)
   262  			})
   263  
   264  			It("returns the same error", func() {
   265  				Expect(actualErr).To(MatchError(returnedErr))
   266  			})
   267  
   268  			When("the cloud controller found no user", func() {
   269  				BeforeEach(func() {
   270  					returnedErr = ccerror.ResourceNotFoundError{}
   271  					fakeUAAClient.DeleteUserReturns(
   272  						uaa.User{},
   273  						nil,
   274  					)
   275  					fakeCloudControllerClient.DeleteUserReturns(
   276  						"",
   277  						ccv3.Warnings{},
   278  						returnedErr,
   279  					)
   280  				})
   281  
   282  				It("does Not return the error", func() {
   283  					Expect(actualErr).To(BeNil())
   284  				})
   285  			})
   286  		})
   287  
   288  		When("the CC API returns a job", func() {
   289  			BeforeEach(func() {
   290  				fakeCloudControllerClient.DeleteUserReturns(
   291  					"some-url",
   292  					ccv3.Warnings{"warning-5", "warning-6"},
   293  					nil,
   294  				)
   295  			})
   296  
   297  			When("polling errors", func() {
   298  				var expectedErr error
   299  
   300  				BeforeEach(func() {
   301  					expectedErr = errors.New("Never expected, by anyone")
   302  					fakeCloudControllerClient.PollJobReturns(ccv3.Warnings{"warning-7", "warning-8"}, expectedErr)
   303  				})
   304  
   305  				It("returns the error", func() {
   306  					Expect(actualErr).To(Equal(expectedErr))
   307  					Expect(actualWarnings).To(ConsistOf("warning-5", "warning-6", "warning-7", "warning-8"))
   308  				})
   309  			})
   310  
   311  			When("the job is successful", func() {
   312  				BeforeEach(func() {
   313  					fakeCloudControllerClient.PollJobReturns(ccv3.Warnings{"warning-7", "warning-8"}, nil)
   314  				})
   315  
   316  				It("returns warnings and no error", func() {
   317  					Expect(actualErr).ToNot(HaveOccurred())
   318  					Expect(actualWarnings).To(ConsistOf("warning-5", "warning-6", "warning-7", "warning-8"))
   319  
   320  					Expect(fakeCloudControllerClient.DeleteUserCallCount()).To(Equal(1))
   321  					Expect(fakeCloudControllerClient.DeleteUserArgsForCall(0)).To(Equal("some-user-guid"))
   322  
   323  					Expect(fakeCloudControllerClient.PollJobCallCount()).To(Equal(1))
   324  					Expect(fakeCloudControllerClient.PollJobArgsForCall(0)).To(Equal(ccv3.JobURL("some-url")))
   325  				})
   326  			})
   327  		})
   328  
   329  	})
   330  
   331  	Describe("UpdateUserPassword", func() {
   332  		var (
   333  			userGUID    = "some-user"
   334  			oldPassword = "old1"
   335  			newPassword = "new1"
   336  			actualErr   error
   337  		)
   338  
   339  		JustBeforeEach(func() {
   340  			actualErr = actor.UpdateUserPassword(userGUID, oldPassword, newPassword)
   341  		})
   342  
   343  		When("no API errors occur", func() {
   344  			BeforeEach(func() {
   345  				fakeUAAClient.UpdatePasswordReturns(nil)
   346  			})
   347  
   348  			It("does not return an error", func() {
   349  				Expect(actualErr).NotTo(HaveOccurred())
   350  
   351  				Expect(fakeUAAClient.UpdatePasswordCallCount()).To(Equal(1))
   352  				givenUserGUID, givenOldPassword, givenNewPassword := fakeUAAClient.UpdatePasswordArgsForCall(0)
   353  				Expect(givenUserGUID).To(Equal(userGUID))
   354  				Expect(givenOldPassword).To(Equal(oldPassword))
   355  				Expect(givenNewPassword).To(Equal(newPassword))
   356  			})
   357  		})
   358  
   359  		When("the UAA API returns an error", func() {
   360  			var returnedErr error
   361  
   362  			BeforeEach(func() {
   363  				returnedErr = errors.New("some UAA error")
   364  				fakeUAAClient.UpdatePasswordReturns(returnedErr)
   365  			})
   366  
   367  			It("returns the same error", func() {
   368  				Expect(actualErr).To(MatchError(returnedErr))
   369  
   370  				Expect(fakeUAAClient.UpdatePasswordCallCount()).To(Equal(1))
   371  				givenUserGUID, givenOldPassword, givenNewPassword := fakeUAAClient.UpdatePasswordArgsForCall(0)
   372  				Expect(givenUserGUID).To(Equal(userGUID))
   373  				Expect(givenOldPassword).To(Equal(oldPassword))
   374  				Expect(givenNewPassword).To(Equal(newPassword))
   375  			})
   376  		})
   377  	})
   378  
   379  	Describe("SortUsers", func() {
   380  		var (
   381  			users []resources.User
   382  		)
   383  		When("The PresentationNames are different", func() {
   384  			BeforeEach(func() {
   385  				users = []resources.User{
   386  					{PresentationName: "c", Origin: "uaa"},
   387  					{PresentationName: "a", Origin: "uaa"},
   388  					{PresentationName: "b", Origin: "ldap"},
   389  				}
   390  			})
   391  			It("sorts by PresentationName", func() {
   392  				SortUsers(users)
   393  				Expect(users[0].PresentationName).To(Equal("a"))
   394  				Expect(users[1].PresentationName).To(Equal("b"))
   395  				Expect(users[2].PresentationName).To(Equal("c"))
   396  			})
   397  		})
   398  		When("The PresentationNames are identical", func() {
   399  			BeforeEach(func() {
   400  				users = []resources.User{
   401  					{PresentationName: "a", Origin: "cc"},
   402  					{PresentationName: "a", Origin: "aa"},
   403  					{PresentationName: "a", Origin: "bb"},
   404  					{PresentationName: "a", Origin: "uaa"},
   405  					{PresentationName: "a", Origin: "zz"},
   406  					{PresentationName: "a", Origin: ""},
   407  				}
   408  			})
   409  			It("sorts by PresentationName, uaa first, clients (origin == '') last and alphabetically otherwise", func() {
   410  				SortUsers(users)
   411  				Expect(users[0].Origin).To(Equal("uaa"))
   412  				Expect(users[1].Origin).To(Equal("aa"))
   413  				Expect(users[2].Origin).To(Equal("bb"))
   414  				Expect(users[3].Origin).To(Equal("cc"))
   415  				Expect(users[4].Origin).To(Equal("zz"))
   416  				Expect(users[5].Origin).To(Equal(""))
   417  			})
   418  		})
   419  	})
   420  
   421  	Describe("GetHumanReadableOrigin", func() {
   422  		var user resources.User
   423  		When("The user has an origin", func() {
   424  			BeforeEach(func() {
   425  				user = resources.User{Origin: "some-origin"}
   426  			})
   427  			It("displays the origin", func() {
   428  				Expect(GetHumanReadableOrigin(user)).To(Equal("some-origin"))
   429  			})
   430  		})
   431  		When("The user has an empty origin", func() {
   432  			BeforeEach(func() {
   433  				user = resources.User{Origin: ""}
   434  			})
   435  			It("displays 'client'", func() {
   436  				Expect(GetHumanReadableOrigin(user)).To(Equal("client"))
   437  			})
   438  		})
   439  	})
   440  })