github.com/randomtask1155/cli@v6.41.1-0.20181227003417-a98eed78cbde+incompatible/command/v7/delete_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/ccversion"
     9  	"code.cloudfoundry.org/cli/command/commandfakes"
    10  	"code.cloudfoundry.org/cli/command/flag"
    11  	. "code.cloudfoundry.org/cli/command/v7"
    12  	"code.cloudfoundry.org/cli/command/v7/v7fakes"
    13  	"code.cloudfoundry.org/cli/util/configv3"
    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("delete Command", func() {
    21  	var (
    22  		cmd             DeleteCommand
    23  		testUI          *ui.UI
    24  		fakeConfig      *commandfakes.FakeConfig
    25  		fakeSharedActor *commandfakes.FakeSharedActor
    26  		fakeActor       *v7fakes.FakeDeleteActor
    27  		input           *Buffer
    28  		binaryName      string
    29  		executeErr      error
    30  		app             string
    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.FakeDeleteActor)
    39  
    40  		binaryName = "faceman"
    41  		fakeConfig.BinaryNameReturns(binaryName)
    42  		app = "some-app"
    43  
    44  		cmd = DeleteCommand{
    45  			RequiredArgs: flag.AppName{AppName: app},
    46  
    47  			UI:          testUI,
    48  			Config:      fakeConfig,
    49  			SharedActor: fakeSharedActor,
    50  			Actor:       fakeActor,
    51  		}
    52  
    53  		fakeConfig.TargetedOrganizationReturns(configv3.Organization{
    54  			Name: "some-org",
    55  			GUID: "some-org-guid",
    56  		})
    57  
    58  		fakeConfig.TargetedSpaceReturns(configv3.Space{
    59  			Name: "some-space",
    60  			GUID: "some-space-guid",
    61  		})
    62  
    63  		fakeConfig.CurrentUserReturns(configv3.User{Name: "steve"}, nil)
    64  	})
    65  
    66  	JustBeforeEach(func() {
    67  		executeErr = cmd.Execute(nil)
    68  	})
    69  
    70  	When("the -r flag is provided", func() {
    71  		BeforeEach(func() {
    72  			cmd.DeleteMappedRoutes = true
    73  			cmd.Force = true
    74  		})
    75  
    76  		It("prints a warning", func() {
    77  			Expect(testUI.Err).To(Say("-r flag not implemented - the mapped routes will not be deleted"))
    78  		})
    79  	})
    80  
    81  	When("checking target fails", func() {
    82  		BeforeEach(func() {
    83  			fakeActor.CloudControllerAPIVersionReturns(ccversion.MinVersionApplicationFlowV3)
    84  			fakeSharedActor.CheckTargetReturns(actionerror.NoOrganizationTargetedError{BinaryName: binaryName})
    85  		})
    86  
    87  		It("returns an error", func() {
    88  			Expect(executeErr).To(MatchError(actionerror.NoOrganizationTargetedError{BinaryName: binaryName}))
    89  
    90  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
    91  			checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0)
    92  			Expect(checkTargetedOrg).To(BeTrue())
    93  			Expect(checkTargetedSpace).To(BeTrue())
    94  		})
    95  	})
    96  
    97  	When("the user is not logged in", func() {
    98  		var expectedErr error
    99  
   100  		BeforeEach(func() {
   101  			fakeActor.CloudControllerAPIVersionReturns(ccversion.MinVersionApplicationFlowV3)
   102  			expectedErr = errors.New("some current user error")
   103  			fakeConfig.CurrentUserReturns(configv3.User{}, expectedErr)
   104  		})
   105  
   106  		It("return an error", func() {
   107  			Expect(executeErr).To(Equal(expectedErr))
   108  		})
   109  	})
   110  
   111  	When("the -f flag is NOT provided", func() {
   112  		BeforeEach(func() {
   113  			fakeActor.CloudControllerAPIVersionReturns(ccversion.MinVersionApplicationFlowV3)
   114  			cmd.Force = false
   115  		})
   116  
   117  		When("the user inputs yes", func() {
   118  			BeforeEach(func() {
   119  				_, err := input.Write([]byte("y\n"))
   120  				Expect(err).ToNot(HaveOccurred())
   121  
   122  				fakeActor.DeleteApplicationByNameAndSpaceReturns(v7action.Warnings{"some-warning"}, nil)
   123  			})
   124  
   125  			It("delegates to the Actor", func() {
   126  				actualName, actualSpace := fakeActor.DeleteApplicationByNameAndSpaceArgsForCall(0)
   127  				Expect(actualName).To(Equal(app))
   128  				Expect(actualSpace).To(Equal(fakeConfig.TargetedSpace().GUID))
   129  			})
   130  
   131  			It("deletes the app", func() {
   132  				Expect(executeErr).ToNot(HaveOccurred())
   133  
   134  				Expect(testUI.Err).To(Say("some-warning"))
   135  				Expect(testUI.Out).To(Say(`Deleting app some-app in org some-org / space some-space as steve\.\.\.`))
   136  				Expect(testUI.Out).To(Say("OK"))
   137  				Expect(testUI.Out).NotTo(Say("App some-app does not exist"))
   138  			})
   139  		})
   140  
   141  		When("the user inputs no", func() {
   142  			BeforeEach(func() {
   143  				_, err := input.Write([]byte("n\n"))
   144  				Expect(err).ToNot(HaveOccurred())
   145  			})
   146  
   147  			It("cancels the delete", func() {
   148  				Expect(executeErr).ToNot(HaveOccurred())
   149  
   150  				Expect(testUI.Out).To(Say("Delete cancelled"))
   151  				Expect(fakeActor.DeleteApplicationByNameAndSpaceCallCount()).To(Equal(0))
   152  			})
   153  		})
   154  
   155  		When("the user chooses the default", func() {
   156  			BeforeEach(func() {
   157  				_, err := input.Write([]byte("\n"))
   158  				Expect(err).ToNot(HaveOccurred())
   159  			})
   160  
   161  			It("cancels the delete", func() {
   162  				Expect(executeErr).ToNot(HaveOccurred())
   163  
   164  				Expect(testUI.Out).To(Say("Delete cancelled"))
   165  				Expect(fakeActor.DeleteApplicationByNameAndSpaceCallCount()).To(Equal(0))
   166  			})
   167  		})
   168  
   169  		When("the user input is invalid", func() {
   170  			BeforeEach(func() {
   171  				_, err := input.Write([]byte("e\n\n"))
   172  				Expect(err).ToNot(HaveOccurred())
   173  			})
   174  
   175  			It("asks the user again", func() {
   176  				Expect(executeErr).NotTo(HaveOccurred())
   177  
   178  				Expect(testUI.Out).To(Say(`Really delete the app some-app\? \[yN\]`))
   179  				Expect(testUI.Out).To(Say(`invalid input \(not y, n, yes, or no\)`))
   180  				Expect(testUI.Out).To(Say(`Really delete the app some-app\? \[yN\]`))
   181  
   182  				Expect(fakeActor.DeleteApplicationByNameAndSpaceCallCount()).To(Equal(0))
   183  			})
   184  		})
   185  	})
   186  
   187  	When("the -f flag is provided", func() {
   188  		BeforeEach(func() {
   189  			fakeActor.CloudControllerAPIVersionReturns(ccversion.MinVersionApplicationFlowV3)
   190  			cmd.Force = true
   191  		})
   192  
   193  		When("deleting the app errors", func() {
   194  			Context("generic error", func() {
   195  				BeforeEach(func() {
   196  					fakeActor.DeleteApplicationByNameAndSpaceReturns(v7action.Warnings{"some-warning"}, errors.New("some-error"))
   197  				})
   198  
   199  				It("displays all warnings, and returns the erorr", func() {
   200  					Expect(testUI.Err).To(Say("some-warning"))
   201  					Expect(testUI.Out).To(Say(`Deleting app some-app in org some-org / space some-space as steve\.\.\.`))
   202  					Expect(testUI.Out).ToNot(Say("OK"))
   203  					Expect(executeErr).To(MatchError("some-error"))
   204  				})
   205  			})
   206  		})
   207  
   208  		When("the app doesn't exist", func() {
   209  			BeforeEach(func() {
   210  				fakeActor.DeleteApplicationByNameAndSpaceReturns(v7action.Warnings{"some-warning"}, actionerror.ApplicationNotFoundError{Name: "some-app"})
   211  			})
   212  
   213  			It("displays all warnings, that the app wasn't found, and does not error", func() {
   214  				Expect(executeErr).ToNot(HaveOccurred())
   215  
   216  				Expect(testUI.Err).To(Say("some-warning"))
   217  				Expect(testUI.Out).To(Say(`Deleting app some-app in org some-org / space some-space as steve\.\.\.`))
   218  				Expect(testUI.Out).To(Say("App some-app does not exist"))
   219  				Expect(testUI.Out).To(Say("OK"))
   220  			})
   221  		})
   222  
   223  		When("the app exists", func() {
   224  			BeforeEach(func() {
   225  				fakeActor.DeleteApplicationByNameAndSpaceReturns(v7action.Warnings{"some-warning"}, nil)
   226  			})
   227  
   228  			It("displays all warnings, and does not error", func() {
   229  				Expect(executeErr).ToNot(HaveOccurred())
   230  
   231  				Expect(testUI.Err).To(Say("some-warning"))
   232  				Expect(testUI.Out).To(Say(`Deleting app some-app in org some-org / space some-space as steve\.\.\.`))
   233  				Expect(testUI.Out).To(Say("OK"))
   234  				Expect(testUI.Out).NotTo(Say("App some-app does not exist"))
   235  			})
   236  		})
   237  	})
   238  })