github.com/ablease/cli@v6.37.1-0.20180613014814-3adbb7d7fb19+incompatible/cf/commands/service/update_user_provided_service_test.go (about)

     1  package service_test
     2  
     3  import (
     4  	"errors"
     5  	"io/ioutil"
     6  	"os"
     7  
     8  	"code.cloudfoundry.org/cli/cf/commandregistry"
     9  	"code.cloudfoundry.org/cli/cf/commands/service"
    10  	"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
    11  	"code.cloudfoundry.org/cli/cf/flags"
    12  	"code.cloudfoundry.org/cli/cf/models"
    13  	"code.cloudfoundry.org/cli/cf/requirements"
    14  	"code.cloudfoundry.org/cli/cf/requirements/requirementsfakes"
    15  	"github.com/blang/semver"
    16  
    17  	"code.cloudfoundry.org/cli/cf/api/apifakes"
    18  	testconfig "code.cloudfoundry.org/cli/cf/util/testhelpers/configuration"
    19  	testterm "code.cloudfoundry.org/cli/cf/util/testhelpers/terminal"
    20  
    21  	. "code.cloudfoundry.org/cli/cf/util/testhelpers/matchers"
    22  	. "github.com/onsi/ginkgo"
    23  	. "github.com/onsi/gomega"
    24  )
    25  
    26  var _ = Describe("UpdateUserProvidedService", func() {
    27  	var (
    28  		ui                  *testterm.FakeUI
    29  		configRepo          coreconfig.Repository
    30  		serviceInstanceRepo *apifakes.FakeUserProvidedServiceInstanceRepository
    31  
    32  		cmd         commandregistry.Command
    33  		deps        commandregistry.Dependency
    34  		factory     *requirementsfakes.FakeFactory
    35  		flagContext flags.FlagContext
    36  
    37  		loginRequirement           requirements.Requirement
    38  		minAPIVersionRequirement   requirements.Requirement
    39  		serviceInstanceRequirement *requirementsfakes.FakeServiceInstanceRequirement
    40  	)
    41  
    42  	BeforeEach(func() {
    43  		ui = &testterm.FakeUI{}
    44  		configRepo = testconfig.NewRepositoryWithDefaults()
    45  		serviceInstanceRepo = new(apifakes.FakeUserProvidedServiceInstanceRepository)
    46  		repoLocator := deps.RepoLocator.SetUserProvidedServiceInstanceRepository(serviceInstanceRepo)
    47  
    48  		deps = commandregistry.Dependency{
    49  			UI:          ui,
    50  			Config:      configRepo,
    51  			RepoLocator: repoLocator,
    52  		}
    53  
    54  		cmd = &service.UpdateUserProvidedService{}
    55  		cmd.SetDependency(deps, false)
    56  
    57  		flagContext = flags.NewFlagContext(cmd.MetaData().Flags)
    58  		factory = new(requirementsfakes.FakeFactory)
    59  
    60  		loginRequirement = &passingRequirement{Name: "login-requirement"}
    61  		factory.NewLoginRequirementReturns(loginRequirement)
    62  
    63  		minAPIVersionRequirement = &passingRequirement{Name: "min-api-version-requirement"}
    64  		factory.NewMinAPIVersionRequirementReturns(minAPIVersionRequirement)
    65  
    66  		serviceInstanceRequirement = new(requirementsfakes.FakeServiceInstanceRequirement)
    67  		factory.NewServiceInstanceRequirementReturns(serviceInstanceRequirement)
    68  	})
    69  
    70  	Describe("Requirements", func() {
    71  		Context("when not provided exactly one arg", func() {
    72  			BeforeEach(func() {
    73  				flagContext.Parse("service-instance", "extra-arg")
    74  			})
    75  
    76  			It("fails with usage", func() {
    77  				_, err := cmd.Requirements(factory, flagContext)
    78  				Expect(err).To(HaveOccurred())
    79  				Expect(ui.Outputs()).To(ContainSubstrings(
    80  					[]string{"FAILED"},
    81  					[]string{"Incorrect Usage. Requires an argument"},
    82  				))
    83  			})
    84  		})
    85  
    86  		Context("when provided exactly one arg", func() {
    87  			BeforeEach(func() {
    88  				flagContext.Parse("service-instance")
    89  			})
    90  
    91  			It("returns a LoginRequirement", func() {
    92  				actualRequirements, err := cmd.Requirements(factory, flagContext)
    93  				Expect(err).NotTo(HaveOccurred())
    94  				Expect(factory.NewLoginRequirementCallCount()).To(Equal(1))
    95  				Expect(actualRequirements).To(ContainElement(loginRequirement))
    96  			})
    97  		})
    98  
    99  		Context("when provided the -r flag", func() {
   100  			BeforeEach(func() {
   101  				flagContext.Parse("service-instance", "-r", "route-service-url")
   102  			})
   103  
   104  			It("returns a MinAPIVersionRequirement", func() {
   105  				actualRequirements, err := cmd.Requirements(factory, flagContext)
   106  				Expect(err).NotTo(HaveOccurred())
   107  				Expect(factory.NewMinAPIVersionRequirementCallCount()).To(Equal(1))
   108  				Expect(actualRequirements).To(ContainElement(minAPIVersionRequirement))
   109  
   110  				feature, requiredVersion := factory.NewMinAPIVersionRequirementArgsForCall(0)
   111  				Expect(feature).To(Equal("Option '-r'"))
   112  				expectedRequiredVersion, err := semver.Make("2.51.0")
   113  				Expect(err).NotTo(HaveOccurred())
   114  				Expect(requiredVersion).To(Equal(expectedRequiredVersion))
   115  			})
   116  		})
   117  
   118  		Context("when provided the -t flag", func() {
   119  			BeforeEach(func() {
   120  				flagContext.Parse("service-instance", "-t", "tag,a,service")
   121  			})
   122  
   123  			It("returns a MinAPIVersionRequirement", func() {
   124  				actualRequirements, err := cmd.Requirements(factory, flagContext)
   125  				Expect(err).NotTo(HaveOccurred())
   126  				Expect(factory.NewMinAPIVersionRequirementCallCount()).To(Equal(1))
   127  				Expect(actualRequirements).To(ContainElement(minAPIVersionRequirement))
   128  
   129  				feature, requiredVersion := factory.NewMinAPIVersionRequirementArgsForCall(0)
   130  				Expect(feature).To(Equal("Option '-t'"))
   131  				expectedRequiredVersion, err := semver.Make("2.104.0")
   132  				Expect(err).NotTo(HaveOccurred())
   133  				Expect(requiredVersion).To(Equal(expectedRequiredVersion))
   134  			})
   135  		})
   136  	})
   137  
   138  	Describe("Execute", func() {
   139  		var runCLIErr error
   140  
   141  		BeforeEach(func() {
   142  			err := flagContext.Parse("service-instance")
   143  			Expect(err).NotTo(HaveOccurred())
   144  			cmd.Requirements(factory, flagContext)
   145  		})
   146  
   147  		JustBeforeEach(func() {
   148  			runCLIErr = cmd.Execute(flagContext)
   149  		})
   150  
   151  		Context("when the service instance is not user-provided", func() {
   152  			BeforeEach(func() {
   153  				serviceInstanceRequirement.GetServiceInstanceReturns(models.ServiceInstance{
   154  					ServicePlan: models.ServicePlanFields{
   155  						GUID: "service-plan-guid",
   156  					},
   157  				})
   158  			})
   159  
   160  			It("fails with error", func() {
   161  				Expect(runCLIErr).To(HaveOccurred())
   162  			})
   163  		})
   164  
   165  		Context("when the service instance is user-provided", func() {
   166  			var serviceInstance models.ServiceInstance
   167  
   168  			BeforeEach(func() {
   169  				serviceInstance = models.ServiceInstance{
   170  					ServiceInstanceFields: models.ServiceInstanceFields{
   171  						Name:   "service-instance",
   172  						Params: map[string]interface{}{},
   173  					},
   174  					ServicePlan: models.ServicePlanFields{
   175  						GUID:        "",
   176  						Description: "service-plan-description",
   177  					},
   178  				}
   179  				serviceInstanceRequirement.GetServiceInstanceReturns(serviceInstance)
   180  			})
   181  
   182  			It("tells the user it is updating the user provided service", func() {
   183  				Expect(runCLIErr).NotTo(HaveOccurred())
   184  				Expect(ui.Outputs()).To(ContainSubstrings(
   185  					[]string{"Updating user provided service service-instance in org"},
   186  				))
   187  			})
   188  
   189  			It("tries to update the service instance", func() {
   190  				Expect(runCLIErr).NotTo(HaveOccurred())
   191  				Expect(serviceInstanceRepo.UpdateCallCount()).To(Equal(1))
   192  				expectedFields := serviceInstance.ServiceInstanceFields
   193  				expectedFields.Tags = []string{}
   194  				Expect(serviceInstanceRepo.UpdateArgsForCall(0)).To(Equal(expectedFields))
   195  			})
   196  
   197  			It("tells the user no changes were made", func() {
   198  				Expect(runCLIErr).NotTo(HaveOccurred())
   199  				Expect(ui.Outputs()).To(ContainSubstrings(
   200  					[]string{"No flags specified. No changes were made."},
   201  				))
   202  			})
   203  
   204  			Context("when the -p flag is passed with inline JSON", func() {
   205  				BeforeEach(func() {
   206  					flagContext.Parse("service-instance", "-p", `"{"some":"json"}"`)
   207  				})
   208  
   209  				It("tries to update the user provided service instance with the credentials", func() {
   210  					Expect(runCLIErr).NotTo(HaveOccurred())
   211  					Expect(serviceInstanceRepo.UpdateCallCount()).To(Equal(1))
   212  					serviceInstanceFields := serviceInstanceRepo.UpdateArgsForCall(0)
   213  					Expect(serviceInstanceFields.Params).To(Equal(map[string]interface{}{
   214  						"some": "json",
   215  					}))
   216  				})
   217  
   218  				It("does not tell the user that no changes were made", func() {
   219  					Expect(ui.Outputs()).NotTo(ContainSubstrings(
   220  						[]string{"No flags specified. No changes were made."},
   221  					))
   222  				})
   223  			})
   224  
   225  			Context("when the -p flag is passed with a file containing JSON", func() {
   226  				var filename string
   227  
   228  				BeforeEach(func() {
   229  					tempfile, err := ioutil.TempFile("", "update-user-provided-service-test")
   230  					Expect(err).NotTo(HaveOccurred())
   231  					Expect(tempfile.Close()).NotTo(HaveOccurred())
   232  					filename = tempfile.Name()
   233  
   234  					jsonData := `{"some":"json"}`
   235  					ioutil.WriteFile(filename, []byte(jsonData), os.ModePerm)
   236  					flagContext.Parse("service-instance", "-p", filename)
   237  				})
   238  
   239  				AfterEach(func() {
   240  					Expect(os.RemoveAll(filename)).NotTo(HaveOccurred())
   241  				})
   242  
   243  				It("tries to update the user provided service instance with the credentials", func() {
   244  					Expect(runCLIErr).NotTo(HaveOccurred())
   245  					Expect(serviceInstanceRepo.UpdateCallCount()).To(Equal(1))
   246  					serviceInstanceFields := serviceInstanceRepo.UpdateArgsForCall(0)
   247  					Expect(serviceInstanceFields.Params).To(Equal(map[string]interface{}{
   248  						"some": "json",
   249  					}))
   250  				})
   251  
   252  				It("does not tell the user that no changes were made", func() {
   253  					Expect(ui.Outputs()).NotTo(ContainSubstrings(
   254  						[]string{"No flags specified. No changes were made."},
   255  					))
   256  				})
   257  			})
   258  
   259  			Context("when the -p flag is passed with inline JSON", func() {
   260  				BeforeEach(func() {
   261  					flagContext.Parse("service-instance", "-p", `key1,key2`)
   262  					ui.Inputs = []string{"value1", "value2"}
   263  				})
   264  
   265  				It("prompts the user for the values", func() {
   266  					Expect(runCLIErr).NotTo(HaveOccurred())
   267  					Expect(ui.Prompts).To(ContainSubstrings(
   268  						[]string{"key1"},
   269  						[]string{"key2"},
   270  					))
   271  				})
   272  
   273  				It("tries to update the user provided service instance with the credentials", func() {
   274  					Expect(runCLIErr).NotTo(HaveOccurred())
   275  
   276  					Expect(serviceInstanceRepo.UpdateCallCount()).To(Equal(1))
   277  					serviceInstanceFields := serviceInstanceRepo.UpdateArgsForCall(0)
   278  					Expect(serviceInstanceFields.Params).To(Equal(map[string]interface{}{
   279  						"key1": "value1",
   280  						"key2": "value2",
   281  					}))
   282  				})
   283  
   284  				It("does not tell the user that no changes were made", func() {
   285  					Expect(ui.Outputs()).NotTo(ContainSubstrings(
   286  						[]string{"No flags specified. No changes were made."},
   287  					))
   288  				})
   289  			})
   290  
   291  			Context("when passing in tags", func() {
   292  				BeforeEach(func() {
   293  					flagContext.Parse("service-instance", "-t", "tag1, tag2, tag3, tag4")
   294  				})
   295  
   296  				It("sucessfully updates the service instance and passes the tags as json", func() {
   297  					Expect(runCLIErr).NotTo(HaveOccurred())
   298  					Expect(serviceInstanceRepo.UpdateCallCount()).To(Equal(1))
   299  					serviceInstanceFields := serviceInstanceRepo.UpdateArgsForCall(0)
   300  					Expect(serviceInstanceFields.Tags).To(ConsistOf("tag1", "tag2", "tag3", "tag4"))
   301  				})
   302  
   303  				It("does not tell the user that no changes were made", func() {
   304  					Expect(ui.Outputs()).NotTo(ContainSubstrings(
   305  						[]string{"No flags specified. No changes were made."},
   306  					))
   307  				})
   308  			})
   309  
   310  			Context("when updating succeeds", func() {
   311  				BeforeEach(func() {
   312  					serviceInstanceRepo.UpdateReturns(nil)
   313  				})
   314  
   315  				It("tells the user OK", func() {
   316  					Expect(runCLIErr).NotTo(HaveOccurred())
   317  					Expect(ui.Outputs()).To(ContainSubstrings(
   318  						[]string{"OK"},
   319  					))
   320  				})
   321  
   322  				It("prints a tip", func() {
   323  					Expect(runCLIErr).NotTo(HaveOccurred())
   324  					Expect(ui.Outputs()).To(ContainSubstrings(
   325  						[]string{"TIP"},
   326  					))
   327  				})
   328  			})
   329  
   330  			Context("when updating fails", func() {
   331  				BeforeEach(func() {
   332  					serviceInstanceRepo.UpdateReturns(errors.New("update-err"))
   333  				})
   334  
   335  				It("fails with error", func() {
   336  					Expect(runCLIErr).To(HaveOccurred())
   337  					Expect(runCLIErr.Error()).To(Equal("update-err"))
   338  				})
   339  			})
   340  		})
   341  	})
   342  })