github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v7/enable_ssh_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"
     9  	"code.cloudfoundry.org/cli/command/commandfakes"
    10  	. "code.cloudfoundry.org/cli/command/v7"
    11  	"code.cloudfoundry.org/cli/command/v7/v7fakes"
    12  	"code.cloudfoundry.org/cli/util/ui"
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  	. "github.com/onsi/gomega/gbytes"
    16  )
    17  
    18  var _ = Describe("enable-ssh Command", func() {
    19  	var (
    20  		cmd                EnableSSHCommand
    21  		testUI             *ui.UI
    22  		fakeConfig         *commandfakes.FakeConfig
    23  		fakeSharedActor    *commandfakes.FakeSharedActor
    24  		fakeEnableSSHActor *v7fakes.FakeEnableSSHActor
    25  
    26  		binaryName      string
    27  		currentUserName string
    28  		executeErr      error
    29  	)
    30  
    31  	BeforeEach(func() {
    32  		testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
    33  		fakeConfig = new(commandfakes.FakeConfig)
    34  		fakeSharedActor = new(commandfakes.FakeSharedActor)
    35  		fakeEnableSSHActor = new(v7fakes.FakeEnableSSHActor)
    36  
    37  		cmd = EnableSSHCommand{
    38  			UI:          testUI,
    39  			Config:      fakeConfig,
    40  			SharedActor: fakeSharedActor,
    41  			Actor:       fakeEnableSSHActor,
    42  		}
    43  
    44  		cmd.RequiredArgs.AppName = "some-app"
    45  
    46  		binaryName = "faceman"
    47  		fakeConfig.BinaryNameReturns(binaryName)
    48  		currentUserName = "some-user"
    49  		fakeConfig.CurrentUserNameReturns(currentUserName, nil)
    50  	})
    51  
    52  	JustBeforeEach(func() {
    53  		executeErr = cmd.Execute(nil)
    54  	})
    55  
    56  	When("checking target fails", func() {
    57  		BeforeEach(func() {
    58  			fakeSharedActor.CheckTargetReturns(actionerror.NotLoggedInError{BinaryName: binaryName})
    59  		})
    60  
    61  		It("returns an error", func() {
    62  			Expect(executeErr).To(MatchError(actionerror.NotLoggedInError{BinaryName: "faceman"}))
    63  
    64  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
    65  			checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0)
    66  			Expect(checkTargetedOrg).To(BeTrue())
    67  			Expect(checkTargetedSpace).To(BeTrue())
    68  		})
    69  	})
    70  
    71  	When("the user is logged in", func() {
    72  		When("no errors occur", func() {
    73  			BeforeEach(func() {
    74  				fakeEnableSSHActor.GetApplicationByNameAndSpaceReturns(
    75  					v7action.Application{Name: "some-app", GUID: "some-app-guid"},
    76  					v7action.Warnings{"some-get-app-warnings"},
    77  					nil,
    78  				)
    79  				fakeEnableSSHActor.GetAppFeatureReturns(
    80  					ccv3.ApplicationFeature{Enabled: false, Name: "ssh"},
    81  					v7action.Warnings{"some-feature-warnings"},
    82  					nil,
    83  				)
    84  				fakeEnableSSHActor.UpdateAppFeatureReturns(
    85  					v7action.Warnings{"some-update-ssh-warnings"},
    86  					nil,
    87  				)
    88  				fakeEnableSSHActor.GetSSHEnabledReturns(
    89  					ccv3.SSHEnabled{Enabled: true, Reason: ""},
    90  					v7action.Warnings{"some-get-ssh-enabled-warnings"},
    91  					nil,
    92  				)
    93  			})
    94  
    95  			It("enables ssh on the app", func() {
    96  				Expect(executeErr).ToNot(HaveOccurred())
    97  
    98  				Expect(fakeEnableSSHActor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1))
    99  
   100  				appName, spaceGUID := fakeEnableSSHActor.GetApplicationByNameAndSpaceArgsForCall(0)
   101  				Expect(appName).To(Equal(cmd.RequiredArgs.AppName))
   102  				Expect(spaceGUID).To(Equal(cmd.Config.TargetedSpace().GUID))
   103  
   104  				Expect(fakeEnableSSHActor.GetAppFeatureCallCount()).To(Equal(1))
   105  
   106  				appGUID, featureName := fakeEnableSSHActor.GetAppFeatureArgsForCall(0)
   107  				Expect(appGUID).To(Equal("some-app-guid"))
   108  				Expect(featureName).To(Equal("ssh"))
   109  
   110  				Expect(fakeEnableSSHActor.UpdateAppFeatureCallCount()).To(Equal(1))
   111  				app, enabled, featureName := fakeEnableSSHActor.UpdateAppFeatureArgsForCall(0)
   112  				Expect(app.Name).To(Equal("some-app"))
   113  				Expect(enabled).To(Equal(true))
   114  				Expect(featureName).To(Equal("ssh"))
   115  
   116  				Expect(fakeEnableSSHActor.GetSSHEnabledCallCount()).To(Equal(1))
   117  
   118  				Expect(testUI.Err).To(Say("some-get-app-warnings"))
   119  				Expect(testUI.Err).To(Say("some-feature-warnings"))
   120  				Expect(testUI.Err).To(Say("some-update-ssh-warnings"))
   121  				Expect(testUI.Err).To(Say("some-get-ssh-enabled-warnings"))
   122  				Expect(testUI.Out).To(Say(`Enabling ssh support for app %s as %s\.\.\.`, appName, currentUserName))
   123  				Expect(testUI.Out).To(Say("OK"))
   124  			})
   125  
   126  			When("SSH is disabled at a level above the app level", func() {
   127  				BeforeEach(func() {
   128  					fakeEnableSSHActor.GetSSHEnabledReturns(
   129  						ccv3.SSHEnabled{Enabled: false, Reason: "get-ssh-reason"},
   130  						v7action.Warnings{"some-get-ssh-enabled-warnings"},
   131  						nil,
   132  					)
   133  				})
   134  
   135  				It("indicates that the feature was not enabled", func() {
   136  					Expect(fakeEnableSSHActor.GetSSHEnabledCallCount()).To(Equal(1))
   137  					Expect(testUI.Out).To(Say("TIP: Ensure ssh is also enabled on the space and global level."))
   138  					Expect(executeErr).ToNot(HaveOccurred())
   139  				})
   140  			})
   141  		})
   142  
   143  		When("app ssh is already enabled", func() {
   144  			BeforeEach(func() {
   145  				fakeEnableSSHActor.UpdateAppFeatureReturns(
   146  					v7action.Warnings{"ssh support for app 'some-app' is already enabled.", "some-other-warnings"},
   147  					nil,
   148  				)
   149  				fakeEnableSSHActor.GetAppFeatureReturns(
   150  					ccv3.ApplicationFeature{Enabled: true, Name: "ssh"},
   151  					v7action.Warnings{},
   152  					nil,
   153  				)
   154  			})
   155  
   156  			It("shows the app ssh is already enabled", func() {
   157  				Expect(testUI.Out).To(Say("ssh support for app 'some-app' is already enabled."))
   158  				Expect(testUI.Out).To(Say("OK"))
   159  			})
   160  		})
   161  
   162  		When("an error occurs", func() {
   163  			When("GetApp action errors", func() {
   164  				When("no user is found", func() {
   165  					var returnedErr error
   166  
   167  					BeforeEach(func() {
   168  						returnedErr = actionerror.ApplicationNotFoundError{Name: "some-app"}
   169  						fakeEnableSSHActor.GetApplicationByNameAndSpaceReturns(
   170  							v7action.Application{},
   171  							nil,
   172  							returnedErr)
   173  					})
   174  
   175  					It("returns the same error", func() {
   176  						Expect(executeErr).To(HaveOccurred())
   177  						Expect(executeErr).To(MatchError(returnedErr))
   178  					})
   179  				})
   180  			})
   181  
   182  			When("GetAppFeature action errors", func() {
   183  				returnedErr := errors.New("some-error")
   184  				BeforeEach(func() {
   185  
   186  					fakeEnableSSHActor.GetAppFeatureReturns(
   187  						ccv3.ApplicationFeature{},
   188  						nil,
   189  						returnedErr,
   190  					)
   191  				})
   192  
   193  				It("returns the same error", func() {
   194  					Expect(executeErr).To(HaveOccurred())
   195  					Expect(executeErr).To(MatchError(returnedErr))
   196  				})
   197  			})
   198  
   199  			When("Enable ssh action errors", func() {
   200  				var returnedErr error
   201  
   202  				BeforeEach(func() {
   203  					returnedErr = errors.New("some-error")
   204  					fakeEnableSSHActor.GetApplicationByNameAndSpaceReturns(
   205  						v7action.Application{Name: "some-app"},
   206  						v7action.Warnings{"some-warning"},
   207  						nil,
   208  					)
   209  					fakeEnableSSHActor.UpdateAppFeatureReturns(nil, returnedErr)
   210  				})
   211  
   212  				It("returns the same error", func() {
   213  					Expect(executeErr).To(MatchError(returnedErr))
   214  				})
   215  			})
   216  		})
   217  	})
   218  })