github.com/sleungcy/cli@v7.1.0+incompatible/command/v7/create_user_command_test.go (about)

     1  package v7_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/api/cloudcontroller/ccv3/constant"
     9  	"code.cloudfoundry.org/cli/api/uaa"
    10  	"code.cloudfoundry.org/cli/command/commandfakes"
    11  	"code.cloudfoundry.org/cli/command/translatableerror"
    12  	. "code.cloudfoundry.org/cli/command/v7"
    13  	"code.cloudfoundry.org/cli/command/v7/v7fakes"
    14  	"code.cloudfoundry.org/cli/resources"
    15  	"code.cloudfoundry.org/cli/util/ui"
    16  	. "github.com/onsi/ginkgo"
    17  	. "github.com/onsi/gomega"
    18  	. "github.com/onsi/gomega/gbytes"
    19  )
    20  
    21  var _ = Describe("create-user Command", func() {
    22  	var (
    23  		cmd             CreateUserCommand
    24  		testUI          *ui.UI
    25  		fakeConfig      *commandfakes.FakeConfig
    26  		fakeSharedActor *commandfakes.FakeSharedActor
    27  		fakeActor       *v7fakes.FakeActor
    28  		binaryName      string
    29  		executeErr      error
    30  		input           *Buffer
    31  	)
    32  
    33  	BeforeEach(func() {
    34  		input = NewBuffer()
    35  		testUI = ui.NewTestUI(input, NewBuffer(), NewBuffer())
    36  		fakeConfig = new(commandfakes.FakeConfig)
    37  		fakeSharedActor = new(commandfakes.FakeSharedActor)
    38  		fakeActor = new(v7fakes.FakeActor)
    39  
    40  		cmd = CreateUserCommand{
    41  			BaseCommand: BaseCommand{
    42  				UI:          testUI,
    43  				Config:      fakeConfig,
    44  				SharedActor: fakeSharedActor,
    45  				Actor:       fakeActor,
    46  			},
    47  		}
    48  
    49  		cmd.Args.Username = "some-user"
    50  		password := "some-password"
    51  		cmd.Args.Password = &password
    52  
    53  		binaryName = "faceman"
    54  		fakeConfig.BinaryNameReturns(binaryName)
    55  	})
    56  
    57  	JustBeforeEach(func() {
    58  		executeErr = cmd.Execute(nil)
    59  	})
    60  
    61  	When("checking target fails", func() {
    62  		BeforeEach(func() {
    63  			fakeSharedActor.CheckTargetReturns(actionerror.NotLoggedInError{BinaryName: binaryName})
    64  		})
    65  
    66  		It("returns an error", func() {
    67  			Expect(executeErr).To(MatchError(actionerror.NotLoggedInError{BinaryName: "faceman"}))
    68  
    69  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
    70  			checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0)
    71  			Expect(checkTargetedOrg).To(BeFalse())
    72  			Expect(checkTargetedSpace).To(BeFalse())
    73  		})
    74  	})
    75  
    76  	When("the user is logged in", func() {
    77  		When("password is not provided", func() {
    78  			BeforeEach(func() {
    79  				cmd.Args.Password = nil
    80  			})
    81  
    82  			When("origin is empty string", func() {
    83  				BeforeEach(func() {
    84  					cmd.Origin = ""
    85  				})
    86  
    87  				It("returns the RequiredArgumentError", func() {
    88  					Expect(executeErr).To(MatchError(translatableerror.RequiredArgumentError{ArgumentName: "PASSWORD"}))
    89  				})
    90  			})
    91  
    92  			When("origin is UAA", func() {
    93  				BeforeEach(func() {
    94  					cmd.Origin = "UAA"
    95  				})
    96  
    97  				It("returns the RequiredArgumentError", func() {
    98  					Expect(executeErr).To(MatchError(translatableerror.RequiredArgumentError{ArgumentName: "PASSWORD"}))
    99  				})
   100  			})
   101  
   102  			When("origin is not UAA or the empty string", func() {
   103  				BeforeEach(func() {
   104  					fakeActor.CreateUserReturns(
   105  						resources.User{GUID: "new-user-cc-guid"},
   106  						v7action.Warnings{"warning"},
   107  						nil)
   108  					cmd.Origin = "some-origin"
   109  					fakeActor.GetUserReturns(
   110  						resources.User{},
   111  						actionerror.UserNotFoundError{})
   112  				})
   113  
   114  				It("creates the user and displays all warnings", func() {
   115  					Expect(executeErr).ToNot(HaveOccurred())
   116  					Expect(fakeActor.GetUserCallCount()).To(Equal(1))
   117  
   118  					username, origin := fakeActor.GetUserArgsForCall(0)
   119  					Expect(username).To(Equal("some-user"))
   120  					Expect(origin).To(Equal("some-origin"))
   121  					Expect(fakeActor.CreateUserCallCount()).To(Equal(1))
   122  					username, password, origin := fakeActor.CreateUserArgsForCall(0)
   123  					Expect(username).To(Equal("some-user"))
   124  					Expect(password).To(Equal(""))
   125  					Expect(origin).To(Equal("some-origin"))
   126  
   127  					Expect(testUI.Out).To(Say("Creating user some-user..."))
   128  					Expect(testUI.Out).To(Say("OK"))
   129  					Expect(testUI.Out).To(Say("TIP: Assign roles with 'faceman set-org-role' and 'faceman set-space-role'."))
   130  					Expect(testUI.Err).To(Say("warning"))
   131  				})
   132  			})
   133  
   134  			When("password-prompt flag is set", func() {
   135  				BeforeEach(func() {
   136  					cmd.PasswordPrompt = true
   137  					_, err := input.Write([]byte("some-password\n"))
   138  					Expect(err).ToNot(HaveOccurred())
   139  
   140  				})
   141  
   142  				When("the user already exists in UAA", func() {
   143  					BeforeEach(func() {
   144  						fakeActor.GetUserReturns(
   145  							resources.User{GUID: "user-guid"},
   146  							nil)
   147  					})
   148  
   149  					It("does not prompt for a password or attempt to create a user", func() {
   150  						Expect(executeErr).ToNot(HaveOccurred())
   151  						Expect(testUI.Out).To(Not(Say("Password:")))
   152  
   153  						Expect(testUI.Out).To(Say("Creating user some-user..."))
   154  						Expect(fakeActor.CreateUserCallCount()).To(Equal(0))
   155  						Expect(testUI.Err).To(Say("User 'some-user' already exists."))
   156  						Expect(testUI.Out).To(Say("OK"))
   157  					})
   158  				})
   159  
   160  				When("the user does not yet exist in UAA", func() {
   161  					BeforeEach(func() {
   162  						fakeActor.CreateUserReturns(
   163  							resources.User{GUID: "new-user-cc-guid"},
   164  							v7action.Warnings{"warning"},
   165  							nil)
   166  						fakeActor.GetUserReturns(
   167  							resources.User{},
   168  							actionerror.UserNotFoundError{})
   169  					})
   170  
   171  					It("prompts for a password", func() {
   172  						Expect(executeErr).ToNot(HaveOccurred())
   173  						Expect(testUI.Out).To(Say("Password:"))
   174  
   175  						Expect(testUI.Out).To(Say("Creating user some-user..."))
   176  
   177  						Expect(fakeActor.CreateUserCallCount()).To(Equal(1))
   178  						_, password, _ := fakeActor.CreateUserArgsForCall(0)
   179  						Expect(password).To(Equal("some-password"))
   180  
   181  						Expect(testUI.Out).To(Say("OK"))
   182  						Expect(testUI.Out).To(Say("TIP: Assign roles with 'faceman set-org-role' and 'faceman set-space-role'."))
   183  						Expect(testUI.Err).To(Say("warning"))
   184  					})
   185  				})
   186  			})
   187  		})
   188  
   189  		When("password is provided", func() {
   190  			BeforeEach(func() {
   191  				cmd.Args.Username = "some-user"
   192  				password := "password"
   193  				cmd.Args.Password = &password
   194  				cmd.Origin = ""
   195  			})
   196  
   197  			When("origin is empty string", func() {
   198  				It("defaults origin to 'uaa'", func() {
   199  					Expect(executeErr).ToNot(HaveOccurred())
   200  					Expect(fakeActor.GetUserCallCount()).To(Equal(1))
   201  
   202  					username, origin := fakeActor.GetUserArgsForCall(0)
   203  					Expect(username).To(Equal("some-user"))
   204  					Expect(origin).To(Equal(constant.DefaultOriginUaa))
   205  				})
   206  			})
   207  		})
   208  
   209  		When("an error occurs", func() {
   210  			When("the error is not translatable", func() {
   211  				var returnedErr error
   212  
   213  				BeforeEach(func() {
   214  					returnedErr = errors.New("non-translatable error")
   215  					fakeActor.CreateUserReturns(
   216  						resources.User{},
   217  						v7action.Warnings{"warning-1", "warning-2"},
   218  						returnedErr)
   219  					fakeActor.GetUserReturns(
   220  						resources.User{},
   221  						actionerror.UserNotFoundError{})
   222  				})
   223  
   224  				It("returns the same error and all warnings", func() {
   225  					Expect(executeErr).To(MatchError(returnedErr))
   226  					Expect(testUI.Err).To(Say("warning-1"))
   227  					Expect(testUI.Err).To(Say("warning-2"))
   228  				})
   229  			})
   230  
   231  			When("the error is a uaa.ConflictError", func() {
   232  				var returnedErr error
   233  
   234  				BeforeEach(func() {
   235  					returnedErr = uaa.ConflictError{}
   236  					fakeActor.CreateUserReturns(
   237  						resources.User{},
   238  						v7action.Warnings{"warning-1", "warning-2"},
   239  						returnedErr)
   240  					fakeActor.GetUserReturns(
   241  						resources.User{},
   242  						actionerror.UserNotFoundError{})
   243  				})
   244  
   245  				It("displays the error and all warnings", func() {
   246  					Expect(executeErr).To(BeNil())
   247  					Expect(testUI.Err).To(Say("warning-1"))
   248  					Expect(testUI.Err).To(Say("warning-2"))
   249  					Expect(testUI.Err).To(Say("User 'some-user' already exists."))
   250  				})
   251  			})
   252  		})
   253  	})
   254  })