github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/cf/commands/service/purge_service_instance_test.go (about)

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