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