github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/command/v7/start_command_test.go (about)

     1  package v7_test
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"time"
     7  
     8  	"code.cloudfoundry.org/cli/actor/actionerror"
     9  	"code.cloudfoundry.org/cli/actor/sharedaction"
    10  	"code.cloudfoundry.org/cli/actor/sharedaction/sharedactionfakes"
    11  	"code.cloudfoundry.org/cli/actor/v7action"
    12  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
    13  	"code.cloudfoundry.org/cli/command/commandfakes"
    14  	"code.cloudfoundry.org/cli/command/flag"
    15  	v7 "code.cloudfoundry.org/cli/command/v7"
    16  	"code.cloudfoundry.org/cli/command/v7/v7fakes"
    17  	"code.cloudfoundry.org/cli/types"
    18  	"code.cloudfoundry.org/cli/util/configv3"
    19  	"code.cloudfoundry.org/cli/util/ui"
    20  	. "github.com/onsi/ginkgo"
    21  	. "github.com/onsi/gomega"
    22  	. "github.com/onsi/gomega/gbytes"
    23  )
    24  
    25  var _ = Describe("start Command", func() {
    26  	var (
    27  		cmd                v7.StartCommand
    28  		testUI             *ui.UI
    29  		fakeConfig         *commandfakes.FakeConfig
    30  		fakeSharedActor    *commandfakes.FakeSharedActor
    31  		fakeActor          *v7fakes.FakeStartActor
    32  		fakeLogCacheClient *sharedactionfakes.FakeLogCacheClient
    33  
    34  		binaryName  string
    35  		executeErr  error
    36  		app         string
    37  		packageGUID string
    38  	)
    39  
    40  	BeforeEach(func() {
    41  		testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
    42  		fakeConfig = new(commandfakes.FakeConfig)
    43  		fakeSharedActor = new(commandfakes.FakeSharedActor)
    44  		fakeActor = new(v7fakes.FakeStartActor)
    45  		fakeLogCacheClient = new(sharedactionfakes.FakeLogCacheClient)
    46  
    47  		binaryName = "faceman"
    48  		fakeConfig.BinaryNameReturns(binaryName)
    49  		app = "some-app"
    50  		packageGUID = "some-package-guid"
    51  
    52  		cmd = v7.StartCommand{
    53  			RequiredArgs: flag.AppName{AppName: app},
    54  
    55  			UI:             testUI,
    56  			Config:         fakeConfig,
    57  			SharedActor:    fakeSharedActor,
    58  			Actor:          fakeActor,
    59  			LogCacheClient: fakeLogCacheClient,
    60  		}
    61  	})
    62  
    63  	JustBeforeEach(func() {
    64  		executeErr = cmd.Execute(nil)
    65  	})
    66  
    67  	It("displays the experimental warning", func() {
    68  		Expect(testUI.Err).NotTo(Say("This command is in EXPERIMENTAL stage and may change without notice"))
    69  	})
    70  
    71  	When("checking target fails", func() {
    72  		BeforeEach(func() {
    73  			fakeSharedActor.CheckTargetReturns(actionerror.NoOrganizationTargetedError{BinaryName: binaryName})
    74  		})
    75  
    76  		It("returns an error", func() {
    77  			Expect(executeErr).To(MatchError(actionerror.NoOrganizationTargetedError{BinaryName: binaryName}))
    78  
    79  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
    80  			checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0)
    81  			Expect(checkTargetedOrg).To(BeTrue())
    82  			Expect(checkTargetedSpace).To(BeTrue())
    83  		})
    84  	})
    85  
    86  	When("the user is not logged in", func() {
    87  		var expectedErr error
    88  
    89  		BeforeEach(func() {
    90  			expectedErr = errors.New("some current user error")
    91  			fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr)
    92  		})
    93  
    94  		It("return an error", func() {
    95  			Expect(executeErr).To(Equal(expectedErr))
    96  		})
    97  	})
    98  
    99  	When("the actor does not return an error", func() {
   100  		BeforeEach(func() {
   101  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{
   102  				Name: "some-org",
   103  			})
   104  			fakeConfig.TargetedSpaceReturns(configv3.Space{
   105  				Name: "some-space",
   106  				GUID: "some-space-guid",
   107  			})
   108  			fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil)
   109  			fakeActor.GetApplicationByNameAndSpaceReturns(v7action.Application{GUID: "some-app-guid", State: constant.ApplicationStopped}, v7action.Warnings{"get-warning-1", "get-warning-2"}, nil)
   110  			fakeActor.StartApplicationReturns(v7action.Warnings{"start-warning-1", "start-warning-2"}, nil)
   111  			fakeActor.PollStartReturns(v7action.Warnings{"poll-warning-1", "poll-warning-2"}, nil)
   112  		})
   113  
   114  		It("says that the app was started and outputs warnings", func() {
   115  			Expect(executeErr).ToNot(HaveOccurred())
   116  
   117  			Expect(testUI.Out).To(Say(`Starting app some-app in org some-org / space some-space as steve\.\.\.`))
   118  			Expect(testUI.Out).To(Say(`Waiting for app to start\.\.\.`))
   119  
   120  			Expect(testUI.Err).To(Say("get-warning-1"))
   121  			Expect(testUI.Err).To(Say("get-warning-2"))
   122  			Expect(testUI.Err).To(Say("start-warning-1"))
   123  			Expect(testUI.Err).To(Say("start-warning-2"))
   124  			Expect(testUI.Err).To(Say("poll-warning-1"))
   125  			Expect(testUI.Err).To(Say("poll-warning-2"))
   126  
   127  			Expect(fakeActor.StartApplicationCallCount()).To(Equal(1))
   128  			appGUID := fakeActor.StartApplicationArgsForCall(0)
   129  			Expect(appGUID).To(Equal("some-app-guid"))
   130  
   131  			Expect(fakeActor.PollStartCallCount()).To(Equal(1))
   132  			appGUID, noWait := fakeActor.PollStartArgsForCall(0)
   133  			Expect(appGUID).To(Equal("some-app-guid"))
   134  			Expect(noWait).To(Equal(false))
   135  		})
   136  	})
   137  
   138  	When("the get app call returns a ApplicationNotFoundError", func() {
   139  		var expectedErr error
   140  
   141  		BeforeEach(func() {
   142  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{
   143  				Name: "some-org",
   144  			})
   145  			fakeConfig.TargetedSpaceReturns(configv3.Space{
   146  				Name: "some-space",
   147  			})
   148  			fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil)
   149  			expectedErr = actionerror.ApplicationNotFoundError{Name: app}
   150  			fakeActor.GetApplicationByNameAndSpaceReturns(v7action.Application{State: constant.ApplicationStopped}, v7action.Warnings{"get-warning-1", "get-warning-2"}, expectedErr)
   151  		})
   152  
   153  		It("says that the app failed to start", func() {
   154  			Expect(executeErr).To(Equal(actionerror.ApplicationNotFoundError{Name: app}))
   155  			Expect(testUI.Out).ToNot(Say("Starting"))
   156  
   157  			Expect(testUI.Err).To(Say("get-warning-1"))
   158  			Expect(testUI.Err).To(Say("get-warning-2"))
   159  		})
   160  	})
   161  
   162  	When("the start app call returns a ApplicationNotFoundError (someone else deleted app after we fetched summary)", func() {
   163  		var expectedErr error
   164  
   165  		BeforeEach(func() {
   166  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{
   167  				Name: "some-org",
   168  			})
   169  			fakeConfig.TargetedSpaceReturns(configv3.Space{
   170  				Name: "some-space",
   171  			})
   172  			fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil)
   173  			fakeActor.GetApplicationByNameAndSpaceReturns(v7action.Application{State: constant.ApplicationStopped}, v7action.Warnings{"get-warning-1", "get-warning-2"}, nil)
   174  			expectedErr = actionerror.ApplicationNotFoundError{Name: app}
   175  			fakeActor.StartApplicationReturns(v7action.Warnings{"start-warning-1", "start-warning-2"}, expectedErr)
   176  		})
   177  
   178  		It("says that the app failed to start", func() {
   179  			Expect(executeErr).To(Equal(actionerror.ApplicationNotFoundError{Name: app}))
   180  			Expect(testUI.Out).To(Say(`Starting app some-app in org some-org / space some-space as steve\.\.\.`))
   181  			Expect(testUI.Out).To(Say(`Waiting for app to start\.\.\.`))
   182  
   183  			Expect(testUI.Err).To(Say("get-warning-1"))
   184  			Expect(testUI.Err).To(Say("get-warning-2"))
   185  			Expect(testUI.Err).To(Say("start-warning-1"))
   186  			Expect(testUI.Err).To(Say("start-warning-2"))
   187  		})
   188  	})
   189  
   190  	When("there is an error when polling the app", func() {
   191  		var expectedErr error
   192  
   193  		BeforeEach(func() {
   194  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{
   195  				Name: "some-org",
   196  			})
   197  			fakeConfig.TargetedSpaceReturns(configv3.Space{
   198  				Name: "some-space",
   199  			})
   200  			fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil)
   201  			fakeActor.GetApplicationByNameAndSpaceReturns(v7action.Application{State: constant.ApplicationStopped}, v7action.Warnings{"get-warning-1", "get-warning-2"}, nil)
   202  			expectedErr = actionerror.ApplicationNotStartedError{Name: app}
   203  			fakeActor.StartApplicationReturns(v7action.Warnings{"start-warning-1", "start-warning-2"}, nil)
   204  			fakeActor.PollStartReturns(v7action.Warnings{"poll-warning"}, expectedErr)
   205  		})
   206  
   207  		It("says that the app failed to start", func() {
   208  			Expect(executeErr).To(Equal(actionerror.ApplicationNotStartedError{Name: app}))
   209  			Expect(testUI.Out).To(Say(`Starting app some-app in org some-org / space some-space as steve\.\.\.`))
   210  			Expect(testUI.Out).To(Say(`Waiting for app to start\.\.\.`))
   211  
   212  			Expect(testUI.Err).To(Say("get-warning-1"))
   213  			Expect(testUI.Err).To(Say("get-warning-2"))
   214  			Expect(testUI.Err).To(Say("start-warning-1"))
   215  			Expect(testUI.Err).To(Say("start-warning-2"))
   216  			Expect(testUI.Err).To(Say("poll-warning"))
   217  		})
   218  	})
   219  
   220  	When("the app is already started", func() {
   221  		BeforeEach(func() {
   222  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{
   223  				Name: "some-org",
   224  			})
   225  			fakeConfig.TargetedSpaceReturns(configv3.Space{
   226  				Name: "some-space",
   227  			})
   228  			fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil)
   229  			fakeActor.GetApplicationByNameAndSpaceReturns(v7action.Application{State: constant.ApplicationStarted, Name: app}, v7action.Warnings{"get-warning-1", "get-warning-2"}, nil)
   230  		})
   231  
   232  		It("says that the app failed to start", func() {
   233  			Expect(executeErr).ToNot(HaveOccurred())
   234  			Expect(testUI.Out).ToNot(Say("Starting"))
   235  			Expect(testUI.Out).To(Say(`App 'some-app' is already started\.`))
   236  			Expect(testUI.Out).To(Say("OK"))
   237  
   238  			Expect(testUI.Err).To(Say("get-warning-1"))
   239  			Expect(testUI.Err).To(Say("get-warning-2"))
   240  
   241  			Expect(fakeActor.StartApplicationCallCount()).To(BeZero(), "Expected StartApplication to not be called")
   242  		})
   243  	})
   244  
   245  	When("getting attempting to get the unstaged package returns an error", func() {
   246  		var expectedErr error
   247  		BeforeEach(func() {
   248  			expectedErr = errors.New("error getting package")
   249  			app = "some-app"
   250  			fakeActor.GetUnstagedNewestPackageGUIDReturns("", v7action.Warnings{"needs-stage-warnings"}, expectedErr)
   251  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{
   252  				Name: "some-org",
   253  			})
   254  			fakeConfig.TargetedSpaceReturns(configv3.Space{
   255  				Name: "some-space",
   256  				GUID: "some-space-guid",
   257  			})
   258  			fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil)
   259  			fakeActor.GetApplicationByNameAndSpaceReturns(v7action.Application{State: constant.ApplicationStopped, LifecycleType: constant.AppLifecycleTypeBuildpack, GUID: "some-app-guid"}, v7action.Warnings{"get-warning-1", "get-warning-2"}, nil)
   260  		})
   261  		It("errors", func() {
   262  			Expect(testUI.Err).To(Say("needs-stage-warnings"))
   263  			Expect(executeErr).To(MatchError(expectedErr))
   264  			Expect(fakeActor.GetUnstagedNewestPackageGUIDCallCount()).To(Equal(1))
   265  			appGUID := fakeActor.GetUnstagedNewestPackageGUIDArgsForCall(0)
   266  			Expect(appGUID).To(Equal("some-app-guid"))
   267  		})
   268  	})
   269  
   270  	When("the app needs staging", func() {
   271  		BeforeEach(func() {
   272  			app = "some-app"
   273  			fakeActor.GetUnstagedNewestPackageGUIDReturns(packageGUID, v7action.Warnings{"needs-stage-warnings"}, nil)
   274  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{
   275  				Name: "some-org",
   276  			})
   277  			fakeConfig.TargetedSpaceReturns(configv3.Space{
   278  				Name: "some-space",
   279  				GUID: "some-space-guid",
   280  			})
   281  			fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil)
   282  			fakeActor.GetApplicationByNameAndSpaceReturns(v7action.Application{State: constant.ApplicationStopped, LifecycleType: constant.AppLifecycleTypeBuildpack, GUID: "some-app-guid"}, v7action.Warnings{"get-warning-1", "get-warning-2"}, nil)
   283  		})
   284  
   285  		When("the logging does not error", func() {
   286  			var allLogsWritten chan bool
   287  			var closedTheStreams bool
   288  
   289  			BeforeEach(func() {
   290  				allLogsWritten = make(chan bool)
   291  				fakeActor.GetStreamingLogsForApplicationByNameAndSpaceStub = func(appName string, spaceGUID string, client sharedaction.LogCacheClient) (<-chan sharedaction.LogMessage, <-chan error, context.CancelFunc, v7action.Warnings, error) {
   292  					logStream := make(chan sharedaction.LogMessage)
   293  					errorStream := make(chan error)
   294  					closedTheStreams = false
   295  
   296  					cancelFunc := func() {
   297  						if closedTheStreams {
   298  							return
   299  						}
   300  						closedTheStreams = true
   301  						close(logStream)
   302  						close(errorStream)
   303  					}
   304  					go func() {
   305  						logStream <- *sharedaction.NewLogMessage("Here are some staging logs!", "OUT", time.Now(), sharedaction.StagingLog, "sourceInstance")
   306  						logStream <- *sharedaction.NewLogMessage("Here are some other staging logs!", "OUT", time.Now(), sharedaction.StagingLog, "sourceInstance")
   307  						allLogsWritten <- true
   308  					}()
   309  
   310  					return logStream, errorStream, cancelFunc, v7action.Warnings{"steve for all I care"}, nil
   311  				}
   312  			})
   313  
   314  			JustAfterEach(func() {
   315  				Expect(closedTheStreams).To(BeTrue())
   316  			})
   317  
   318  			When("the staging is successful", func() {
   319  				const dropletCreateTime = "2017-08-14T21:16:42Z"
   320  				BeforeEach(func() {
   321  					fakeActor.StagePackageStub = func(packageGUID, appName, spaceGUID string) (<-chan v7action.Droplet, <-chan v7action.Warnings, <-chan error) {
   322  						dropletStream := make(chan v7action.Droplet)
   323  						warningsStream := make(chan v7action.Warnings)
   324  						errorStream := make(chan error)
   325  
   326  						go func() {
   327  							<-allLogsWritten
   328  							defer close(dropletStream)
   329  							defer close(warningsStream)
   330  							defer close(errorStream)
   331  							warningsStream <- v7action.Warnings{"some-warning", "some-other-warning"}
   332  							dropletStream <- v7action.Droplet{
   333  								GUID:      "some-droplet-guid",
   334  								CreatedAt: dropletCreateTime,
   335  								State:     constant.DropletStaged,
   336  							}
   337  						}()
   338  
   339  						return dropletStream, warningsStream, errorStream
   340  					}
   341  					fakeActor.SetApplicationDropletReturns(v7action.Warnings{"some-set-droplet-warning"}, nil)
   342  				})
   343  
   344  				It("stages the package", func() {
   345  					Expect(executeErr).ToNot(HaveOccurred())
   346  					Expect(fakeActor.StagePackageCallCount()).To(Equal(1))
   347  					guidArg, appNameArg, spaceGUIDArg := fakeActor.StagePackageArgsForCall(0)
   348  					Expect(guidArg).To(Equal(packageGUID))
   349  					Expect(appNameArg).To(Equal(app))
   350  					Expect(spaceGUIDArg).To(Equal("some-space-guid"))
   351  				})
   352  
   353  				It("displays staging logs and their warnings", func() {
   354  					Expect(testUI.Out).To(Say("Here are some staging logs!"))
   355  					Expect(testUI.Out).To(Say("Here are some other staging logs!"))
   356  
   357  					Expect(testUI.Err).To(Say("steve for all I care"))
   358  
   359  					Expect(fakeActor.GetStreamingLogsForApplicationByNameAndSpaceCallCount()).To(Equal(1))
   360  					appNameArg, spaceGUID, logCacheClient := fakeActor.GetStreamingLogsForApplicationByNameAndSpaceArgsForCall(0)
   361  					Expect(appNameArg).To(Equal(app))
   362  					Expect(spaceGUID).To(Equal("some-space-guid"))
   363  					Expect(logCacheClient).To(Equal(fakeLogCacheClient))
   364  
   365  					Expect(fakeActor.StagePackageCallCount()).To(Equal(1))
   366  					guidArg, appNameArg, spaceGUIDArg := fakeActor.StagePackageArgsForCall(0)
   367  					Expect(guidArg).To(Equal(packageGUID))
   368  					Expect(appNameArg).To(Equal(app))
   369  					Expect(spaceGUIDArg).To(Equal(spaceGUID))
   370  				})
   371  
   372  				When("Assigning the droplet is successful", func() {
   373  					BeforeEach(func() {
   374  						fakeActor.SetApplicationDropletReturns(v7action.Warnings{"some-set-droplet-warning"}, nil)
   375  					})
   376  					It("displays that the droplet was assigned", func() {
   377  						Expect(executeErr).ToNot(HaveOccurred())
   378  						Expect(testUI.Err).To(Say("warning-1"))
   379  						Expect(testUI.Err).To(Say("warning-2"))
   380  
   381  						Expect(fakeActor.SetApplicationDropletCallCount()).To(Equal(1))
   382  						appGuid, dropletGUID := fakeActor.SetApplicationDropletArgsForCall(0)
   383  						Expect(appGuid).To(Equal("some-app-guid"))
   384  						Expect(dropletGUID).To(Equal("some-droplet-guid"))
   385  
   386  					})
   387  				})
   388  
   389  				When("Assigning the droplet is not successful", func() {
   390  					var expectedErr error
   391  					BeforeEach(func() {
   392  						expectedErr = errors.New("some-error")
   393  						fakeActor.SetApplicationDropletReturns(v7action.Warnings{"some-set-droplet-warning"}, expectedErr)
   394  					})
   395  					It("errors and displays warnings", func() {
   396  						Expect(executeErr).To(HaveOccurred())
   397  						Expect(testUI.Err).To(Say("some-set-droplet-warning"))
   398  					})
   399  				})
   400  			})
   401  
   402  			When("the staging returns an error", func() {
   403  				var expectedErr error
   404  
   405  				BeforeEach(func() {
   406  					expectedErr = errors.New("any gibberish")
   407  					fakeActor.StagePackageStub = func(packageGUID, _, _ string) (<-chan v7action.Droplet, <-chan v7action.Warnings, <-chan error) {
   408  						dropletStream := make(chan v7action.Droplet)
   409  						warningsStream := make(chan v7action.Warnings)
   410  						errorStream := make(chan error)
   411  
   412  						go func() {
   413  							<-allLogsWritten
   414  							defer close(dropletStream)
   415  							defer close(warningsStream)
   416  							defer close(errorStream)
   417  							warningsStream <- v7action.Warnings{"some-warning", "some-other-warning"}
   418  							errorStream <- expectedErr
   419  						}()
   420  
   421  						return dropletStream, warningsStream, errorStream
   422  					}
   423  				})
   424  
   425  				It("returns the error and displays warnings", func() {
   426  					Expect(executeErr).To(Equal(expectedErr))
   427  
   428  					Expect(testUI.Err).To(Say("some-warning"))
   429  					Expect(testUI.Err).To(Say("some-other-warning"))
   430  				})
   431  			})
   432  		})
   433  
   434  		When("the logging stream has errors", func() {
   435  			var (
   436  				expectedErr      error
   437  				allLogsWritten   chan bool
   438  				closedTheStreams bool
   439  			)
   440  
   441  			BeforeEach(func() {
   442  				allLogsWritten = make(chan bool)
   443  				expectedErr = errors.New("banana")
   444  
   445  				fakeActor.GetStreamingLogsForApplicationByNameAndSpaceStub = func(appName string, spaceGUID string, client sharedaction.LogCacheClient) (<-chan sharedaction.LogMessage, <-chan error, context.CancelFunc, v7action.Warnings, error) {
   446  					logStream := make(chan sharedaction.LogMessage)
   447  					errorStream := make(chan error)
   448  					closedTheStreams = false
   449  
   450  					cancelFunc := func() {
   451  						if closedTheStreams {
   452  							return
   453  						}
   454  						closedTheStreams = true
   455  						close(logStream)
   456  						close(errorStream)
   457  					}
   458  					go func() {
   459  						logStream <- *sharedaction.NewLogMessage("Here are some staging logs!", "OUT", time.Now(), sharedaction.StagingLog, "sourceInstance")
   460  						errorStream <- expectedErr
   461  						allLogsWritten <- true
   462  					}()
   463  
   464  					return logStream, errorStream, cancelFunc, v7action.Warnings{"steve for all I care"}, nil
   465  				}
   466  
   467  				fakeActor.StagePackageStub = func(packageGUID, _, _ string) (<-chan v7action.Droplet, <-chan v7action.Warnings, <-chan error) {
   468  					dropletStream := make(chan v7action.Droplet)
   469  					warningsStream := make(chan v7action.Warnings)
   470  					errorStream := make(chan error)
   471  
   472  					go func() {
   473  						<-allLogsWritten
   474  						defer close(dropletStream)
   475  						defer close(warningsStream)
   476  						defer close(errorStream)
   477  						warningsStream <- v7action.Warnings{"some-warning", "some-other-warning"}
   478  						dropletStream <- v7action.Droplet{
   479  							GUID:      "some-droplet-guid",
   480  							CreatedAt: "2017-08-14T21:16:42Z",
   481  							State:     constant.DropletStaged,
   482  						}
   483  					}()
   484  
   485  					return dropletStream, warningsStream, errorStream
   486  				}
   487  			})
   488  
   489  			JustAfterEach(func() {
   490  				Expect(closedTheStreams).To(BeTrue())
   491  			})
   492  
   493  			It("displays the errors and continues staging", func() {
   494  				Expect(executeErr).ToNot(HaveOccurred())
   495  
   496  				Expect(testUI.Err).To(Say("banana"))
   497  				Expect(testUI.Err).To(Say("some-warning"))
   498  				Expect(testUI.Err).To(Say("some-other-warning"))
   499  			})
   500  		})
   501  	})
   502  
   503  	When("the get application returns an unknown error", func() {
   504  		var expectedErr error
   505  
   506  		BeforeEach(func() {
   507  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{
   508  				Name: "some-org",
   509  			})
   510  			fakeConfig.TargetedSpaceReturns(configv3.Space{
   511  				Name: "some-space",
   512  			})
   513  			fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil)
   514  			expectedErr = errors.New("some-error")
   515  			fakeActor.GetApplicationByNameAndSpaceReturns(v7action.Application{State: constant.ApplicationStopped}, v7action.Warnings{"get-warning-1", "get-warning-2"}, expectedErr)
   516  		})
   517  
   518  		It("says that the app failed to start", func() {
   519  			Expect(executeErr).To(Equal(expectedErr))
   520  			Expect(testUI.Out).ToNot(Say("Starting"))
   521  
   522  			Expect(testUI.Err).To(Say("get-warning-1"))
   523  			Expect(testUI.Err).To(Say("get-warning-2"))
   524  
   525  			Expect(fakeActor.StartApplicationCallCount()).To(BeZero(), "Expected StartApplication to not be called")
   526  		})
   527  	})
   528  
   529  	When("the start application returns an unknown error", func() {
   530  		var expectedErr error
   531  
   532  		BeforeEach(func() {
   533  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{
   534  				Name: "some-org",
   535  			})
   536  			fakeConfig.TargetedSpaceReturns(configv3.Space{
   537  				Name: "some-space",
   538  			})
   539  			fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil)
   540  			fakeActor.GetApplicationByNameAndSpaceReturns(v7action.Application{State: constant.ApplicationStopped}, v7action.Warnings{"get-warning-1", "get-warning-2"}, nil)
   541  			expectedErr = errors.New("some-error")
   542  			fakeActor.StartApplicationReturns(v7action.Warnings{"start-warning-1", "start-warning-2"}, expectedErr)
   543  		})
   544  
   545  		It("says that the app failed to start", func() {
   546  			Expect(executeErr).To(Equal(expectedErr))
   547  			Expect(testUI.Out).To(Say(`Starting app some-app in org some-org / space some-space as steve\.\.\.`))
   548  
   549  			Expect(testUI.Err).To(Say("get-warning-1"))
   550  			Expect(testUI.Err).To(Say("get-warning-2"))
   551  			Expect(testUI.Err).To(Say("start-warning-1"))
   552  			Expect(testUI.Err).To(Say("start-warning-2"))
   553  		})
   554  	})
   555  
   556  	When("getting the application summary returns an error", func() {
   557  		var expectedErr error
   558  
   559  		BeforeEach(func() {
   560  			expectedErr = actionerror.ApplicationNotFoundError{Name: app}
   561  			fakeActor.GetDetailedAppSummaryReturns(v7action.DetailedApplicationSummary{}, v7action.Warnings{"warning-1", "warning-2"}, expectedErr)
   562  		})
   563  
   564  		It("returns the error and prints warnings", func() {
   565  			Expect(executeErr).To(Equal(actionerror.ApplicationNotFoundError{Name: app}))
   566  
   567  			Expect(testUI.Out).To(Say(`Waiting for app to start\.\.\.`))
   568  
   569  			Expect(testUI.Err).To(Say("warning-1"))
   570  			Expect(testUI.Err).To(Say("warning-2"))
   571  		})
   572  	})
   573  
   574  	When("getting the application summary is successful", func() {
   575  		BeforeEach(func() {
   576  			fakeConfig.TargetedSpaceReturns(configv3.Space{
   577  				Name: "some-space",
   578  				GUID: "some-space-guid",
   579  			})
   580  			summary := v7action.DetailedApplicationSummary{
   581  				ApplicationSummary: v7action.ApplicationSummary{
   582  					Application: v7action.Application{
   583  						Name:  "some-app",
   584  						State: constant.ApplicationStarted,
   585  					},
   586  					ProcessSummaries: v7action.ProcessSummaries{
   587  						{
   588  							Process: v7action.Process{
   589  								Type:    constant.ProcessTypeWeb,
   590  								Command: *types.NewFilteredString("some-command-1"),
   591  							},
   592  						},
   593  						{
   594  							Process: v7action.Process{
   595  								Type:    "console",
   596  								Command: *types.NewFilteredString("some-command-2"),
   597  							},
   598  						},
   599  					},
   600  				},
   601  				CurrentDroplet: v7action.Droplet{
   602  					Stack: "cflinuxfs2",
   603  					Buildpacks: []v7action.DropletBuildpack{
   604  						{
   605  							Name:         "ruby_buildpack",
   606  							DetectOutput: "some-detect-output",
   607  						},
   608  						{
   609  							Name:         "some-buildpack",
   610  							DetectOutput: "",
   611  						},
   612  					},
   613  				},
   614  			}
   615  			fakeActor.GetDetailedAppSummaryReturns(summary, v7action.Warnings{"warning-1", "warning-2"}, nil)
   616  		})
   617  
   618  		It("prints the application summary and outputs warnings", func() {
   619  			Expect(executeErr).ToNot(HaveOccurred())
   620  
   621  			Expect(testUI.Out).To(Say(`Waiting for app to start\.\.\.`))
   622  			Expect(testUI.Out).To(Say(`name:\s+some-app`))
   623  			Expect(testUI.Out).To(Say(`requested state:\s+started`))
   624  			Expect(testUI.Out).ToNot(Say("start command:"))
   625  
   626  			Expect(testUI.Err).To(Say("warning-1"))
   627  			Expect(testUI.Err).To(Say("warning-2"))
   628  
   629  			Expect(fakeActor.GetDetailedAppSummaryCallCount()).To(Equal(1))
   630  			appName, spaceGUID, withObfuscatedValues := fakeActor.GetDetailedAppSummaryArgsForCall(0)
   631  			Expect(appName).To(Equal("some-app"))
   632  			Expect(spaceGUID).To(Equal("some-space-guid"))
   633  			Expect(withObfuscatedValues).To(BeFalse())
   634  		})
   635  	})
   636  })