github.com/cloudfoundry/cli@v7.1.0+incompatible/cf/commands/service/purge_service_instance_test.go (about)

     1  package service_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	"code.cloudfoundry.org/cli/cf/commandregistry"
     7  	"code.cloudfoundry.org/cli/cf/commands/service"
     8  	"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
     9  	cferrors "code.cloudfoundry.org/cli/cf/errors"
    10  	"code.cloudfoundry.org/cli/cf/flags"
    11  	"code.cloudfoundry.org/cli/cf/models"
    12  	"code.cloudfoundry.org/cli/cf/requirements"
    13  	"code.cloudfoundry.org/cli/cf/requirements/requirementsfakes"
    14  
    15  	"code.cloudfoundry.org/cli/cf/api/apifakes"
    16  
    17  	testconfig "code.cloudfoundry.org/cli/cf/util/testhelpers/configuration"
    18  	testterm "code.cloudfoundry.org/cli/cf/util/testhelpers/terminal"
    19  
    20  	. "code.cloudfoundry.org/cli/cf/util/testhelpers/matchers"
    21  
    22  	. "github.com/onsi/ginkgo"
    23  	. "github.com/onsi/gomega"
    24  )
    25  
    26  var _ = Describe("PurgeServiceInstance", func() {
    27  	var (
    28  		ui          *testterm.FakeUI
    29  		configRepo  coreconfig.Repository
    30  		serviceRepo *apifakes.FakeServiceRepository
    31  
    32  		cmd         commandregistry.Command
    33  		deps        commandregistry.Dependency
    34  		factory     *requirementsfakes.FakeFactory
    35  		flagContext flags.FlagContext
    36  
    37  		loginRequirement requirements.Requirement
    38  	)
    39  
    40  	BeforeEach(func() {
    41  		ui = &testterm.FakeUI{}
    42  		configRepo = testconfig.NewRepositoryWithDefaults()
    43  		serviceRepo = new(apifakes.FakeServiceRepository)
    44  		repoLocator := deps.RepoLocator.SetServiceRepository(serviceRepo)
    45  
    46  		deps = commandregistry.Dependency{
    47  			UI:          ui,
    48  			Config:      configRepo,
    49  			RepoLocator: repoLocator,
    50  		}
    51  
    52  		cmd = &service.PurgeServiceInstance{}
    53  		cmd.SetDependency(deps, false)
    54  
    55  		flagContext = flags.NewFlagContext(cmd.MetaData().Flags)
    56  
    57  		factory = new(requirementsfakes.FakeFactory)
    58  
    59  		loginRequirement = &passingRequirement{}
    60  		factory.NewLoginRequirementReturns(loginRequirement)
    61  	})
    62  
    63  	Describe("Requirements", func() {
    64  		Context("when not provided exactly one arg", func() {
    65  			BeforeEach(func() {
    66  				flagContext.Parse("service-instance", "extra-arg")
    67  			})
    68  
    69  			It("fails with usage", func() {
    70  				_, err := cmd.Requirements(factory, flagContext)
    71  				Expect(err).To(HaveOccurred())
    72  				Expect(ui.Outputs()).To(ContainSubstrings(
    73  					[]string{"Incorrect Usage. Requires an argument"},
    74  					[]string{"NAME"},
    75  					[]string{"USAGE"},
    76  				))
    77  			})
    78  		})
    79  
    80  		Context("when provided exactly one arg", func() {
    81  			BeforeEach(func() {
    82  				flagContext.Parse("service-instance")
    83  			})
    84  
    85  			It("returns a LoginRequirement", func() {
    86  				actualRequirements, err := cmd.Requirements(factory, flagContext)
    87  				Expect(err).NotTo(HaveOccurred())
    88  				Expect(factory.NewLoginRequirementCallCount()).To(Equal(1))
    89  
    90  				Expect(actualRequirements).To(ContainElement(loginRequirement))
    91  			})
    92  		})
    93  	})
    94  
    95  	Describe("Execute", func() {
    96  		BeforeEach(func() {
    97  			err := flagContext.Parse("service-instance-name")
    98  			Expect(err).NotTo(HaveOccurred())
    99  			cmd.Requirements(factory, flagContext)
   100  		})
   101  
   102  		It("finds the instance by name in the service repo", func() {
   103  			err := flagContext.Parse("service-instance-name", "-f")
   104  			Expect(err).NotTo(HaveOccurred())
   105  			cmd.Execute(flagContext)
   106  			Expect(serviceRepo.FindInstanceByNameCallCount()).To(Equal(1))
   107  		})
   108  
   109  		Context("when the instance can be found", func() {
   110  			var serviceInstance models.ServiceInstance
   111  
   112  			BeforeEach(func() {
   113  				serviceInstance = models.ServiceInstance{}
   114  				serviceInstance.Name = "service-instance-name"
   115  				serviceRepo.FindInstanceByNameReturns(serviceInstance, nil)
   116  			})
   117  
   118  			It("warns the user", func() {
   119  				ui.Inputs = []string{"n"}
   120  				cmd.Execute(flagContext)
   121  				Eventually(func() []string {
   122  					return ui.Outputs()
   123  				}).Should(ContainSubstrings(
   124  					[]string{"WARNING"},
   125  				))
   126  			})
   127  
   128  			It("asks the user if they would like to proceed", func() {
   129  				ui.Inputs = []string{"n"}
   130  				cmd.Execute(flagContext)
   131  				Eventually(func() []string { return ui.Prompts }).Should(ContainSubstrings(
   132  					[]string{"Really purge service instance service-instance-name from Cloud Foundry?"},
   133  				))
   134  			})
   135  
   136  			It("purges the service instance when the response is to proceed", func() {
   137  				ui.Inputs = []string{"y"}
   138  				cmd.Execute(flagContext)
   139  
   140  				Eventually(serviceRepo.PurgeServiceInstanceCallCount).Should(Equal(1))
   141  				Expect(serviceRepo.PurgeServiceInstanceArgsForCall(0)).To(Equal(serviceInstance))
   142  			})
   143  
   144  			It("does not purge the service instance when the response is not to proceed", func() {
   145  				ui.Inputs = []string{"n"}
   146  				cmd.Execute(flagContext)
   147  				Consistently(serviceRepo.PurgeServiceInstanceCallCount).Should(BeZero())
   148  			})
   149  
   150  			Context("when force is set", func() {
   151  				BeforeEach(func() {
   152  					err := flagContext.Parse("service-instance-name", "-f")
   153  					Expect(err).NotTo(HaveOccurred())
   154  				})
   155  
   156  				It("does not ask the user if they would like to proceed", func() {
   157  					Expect(ui.Prompts).NotTo(ContainSubstrings(
   158  						[]string{"Really purge service instance service-instance-name from Cloud Foundry?"},
   159  					))
   160  				})
   161  
   162  				It("purges the service instance", func() {
   163  					cmd.Execute(flagContext)
   164  					Expect(serviceRepo.PurgeServiceInstanceCallCount()).To(Equal(1))
   165  					Expect(serviceRepo.PurgeServiceInstanceArgsForCall(0)).To(Equal(serviceInstance))
   166  				})
   167  			})
   168  		})
   169  
   170  		Context("when the instance can not be found", func() {
   171  			BeforeEach(func() {
   172  				serviceRepo.FindInstanceByNameReturns(models.ServiceInstance{}, cferrors.NewModelNotFoundError("model-type", "model-name"))
   173  			})
   174  
   175  			It("prints a warning", func() {
   176  				cmd.Execute(flagContext)
   177  				Expect(ui.Outputs()).To(ContainSubstrings(
   178  					[]string{"Service instance service-instance-name not found"},
   179  				))
   180  			})
   181  		})
   182  
   183  		Context("when an error occurs fetching the instance", func() {
   184  			var runCLIErr error
   185  
   186  			BeforeEach(func() {
   187  				serviceRepo.FindInstanceByNameReturns(models.ServiceInstance{}, errors.New("an-error"))
   188  			})
   189  
   190  			JustBeforeEach(func() {
   191  				runCLIErr = cmd.Execute(flagContext)
   192  			})
   193  
   194  			It("prints a message with the error", func() {
   195  				Expect(runCLIErr).To(HaveOccurred())
   196  			})
   197  		})
   198  	})
   199  })