github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/integration/shared/isolated/update_user_provided_service_command_test.go (about)

     1  package isolated
     2  
     3  import (
     4  	"os"
     5  
     6  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccversion"
     7  	"code.cloudfoundry.org/cli/integration/helpers"
     8  	. "github.com/onsi/ginkgo"
     9  	. "github.com/onsi/gomega"
    10  	. "github.com/onsi/gomega/gbytes"
    11  	. "github.com/onsi/gomega/gexec"
    12  )
    13  
    14  var _ = Describe("update-user-provided-service command", func() {
    15  	BeforeEach(func() {
    16  		helpers.SkipIfVersionLessThan(ccversion.MinVersionTagsOnUserProvidedServices)
    17  	})
    18  
    19  	Describe("help", func() {
    20  		When("--help flag is set", func() {
    21  			It("displays command usage to output", func() {
    22  				session := helpers.CF("update-user-provided-service", "--help")
    23  				eventuallyExpectHelpMessage(session)
    24  				Eventually(session).Should(Exit(0))
    25  			})
    26  		})
    27  	})
    28  
    29  	When("the environment is not setup correctly", func() {
    30  		It("fails with the appropriate errors", func() {
    31  			helpers.CheckEnvironmentTargetedCorrectly(true, true, ReadOnlyOrg, "update-user-provided-service", "foo")
    32  		})
    33  	})
    34  
    35  	When("an api is targeted, the user is logged in, and an org and space are targeted", func() {
    36  		var (
    37  			userName  string
    38  			orgName   string
    39  			spaceName string
    40  		)
    41  
    42  		BeforeEach(func() {
    43  			orgName = helpers.NewOrgName()
    44  			spaceName = helpers.NewSpaceName()
    45  			helpers.SetupCF(orgName, spaceName)
    46  			userName, _ = helpers.GetCredentials()
    47  		})
    48  
    49  		AfterEach(func() {
    50  			helpers.QuickDeleteOrg(orgName)
    51  		})
    52  
    53  		When("the user-provided service instance name is not provided", func() {
    54  			It("displays the help message and exits 1", func() {
    55  				session := helpers.CF("update-user-provided-service")
    56  				eventuallyExpectHelpMessage(session)
    57  				Eventually(session).Should(Exit(1))
    58  			})
    59  		})
    60  
    61  		When("there are unknown additional arguments", func() {
    62  			It("displays the help message and exits 1", func() {
    63  				session := helpers.CF("update-user-provided-service", "service-name", "additional", "invalid", "arguments")
    64  				eventuallyExpectHelpMessage(session)
    65  				Eventually(session).Should(Exit(1))
    66  			})
    67  		})
    68  
    69  		When("the user-provided service instance does not exist", func() {
    70  			It("displays an informative error and exits 1", func() {
    71  				session := helpers.CF("update-user-provided-service", "non-existent-service")
    72  				Eventually(session.Err).Should(Say("Service instance non-existent-service not found"))
    73  				Eventually(session.Out).Should(Say("FAILED"))
    74  				Eventually(session).Should(Exit(1))
    75  			})
    76  		})
    77  
    78  		When("the user-provided service exists", func() {
    79  			var serviceName string
    80  
    81  			BeforeEach(func() {
    82  				serviceName = randomUserProvidedServiceName()
    83  				createUserProvidedService(serviceName)
    84  			})
    85  
    86  			AfterEach(func() {
    87  				deleteUserProvidedService(serviceName)
    88  			})
    89  
    90  			When("no flags are provided", func() {
    91  				It("displays an informative message and exits 0", func() {
    92  					session := helpers.CF("update-user-provided-service", serviceName)
    93  					Eventually(session.Out).Should(Say("No flags specified. No changes were made."))
    94  					Eventually(session).Should(Exit(0))
    95  				})
    96  			})
    97  
    98  			When("flags are provided", func() {
    99  				It("displays success message, exits 0, and updates the service", func() {
   100  					session := helpers.CF(
   101  						`update-user-provided-service`, serviceName,
   102  						`-l`, `syslog://example.com`,
   103  						`-p`, `{"some": "credentials"}`,
   104  						`-r`, `https://example.com`,
   105  						`-t`, `"tag1,tag2"`,
   106  					)
   107  
   108  					eventuallyExpectOKMessage(session, serviceName, orgName, spaceName, userName)
   109  					Eventually(session).Should(Exit(0))
   110  
   111  					session = helpers.CF("service", serviceName)
   112  					Eventually(session).Should(Say(`tags:\s+tag1,\s*tag2`))
   113  					Eventually(session).Should(Say(`route service url:\s+https://example.com`))
   114  				})
   115  			})
   116  
   117  			Context("when the user-provided service already has values", func() {
   118  				BeforeEach(func() {
   119  					session := helpers.CF(
   120  						`update-user-provided-service`, serviceName,
   121  						`-l`, `syslog://example.com`,
   122  						`-p`, `{"some": "credentials"}`,
   123  						`-r`, `https://example.com`,
   124  						`-t`, `"tag1,tag2"`,
   125  					)
   126  					Eventually(session).Should(Exit(0))
   127  
   128  					session = helpers.CF("service", serviceName)
   129  					Eventually(session).Should(Say(`tags:\s+tag1,\s*tag2`))
   130  					Eventually(session).Should(Say(`route service url:\s+https://example.com`))
   131  				})
   132  
   133  				It("can unset previous values provideding empty strings as flag values", func() {
   134  					session := helpers.CF(
   135  						`update-user-provided-service`, serviceName,
   136  						`-l`, `""`,
   137  						`-p`, `""`,
   138  						`-r`, `""`,
   139  						`-t`, `""`,
   140  					)
   141  					Eventually(session).Should(Exit(0))
   142  
   143  					session = helpers.CF("service", serviceName)
   144  					Consistently(session).ShouldNot(Say(`tags:\s+tag1,\s*tag2`))
   145  					Consistently(session).ShouldNot(Say(`route service url:\s+https://example.com`))
   146  				})
   147  
   148  				It("does not unset previous values for flags that are not provided", func() {
   149  					session := helpers.CF(
   150  						`update-user-provided-service`, serviceName,
   151  						`-l`, `""`,
   152  						`-p`, `""`,
   153  					)
   154  					Eventually(session).Should(Exit(0))
   155  
   156  					session = helpers.CF("service", serviceName)
   157  					Eventually(session).Should(Say(`tags:\s+tag1,\s*tag2`))
   158  					Eventually(session).Should(Say(`route service url:\s+https://example.com`))
   159  				})
   160  			})
   161  
   162  			When("requesting interactive credentials", func() {
   163  				var buffer *Buffer
   164  
   165  				BeforeEach(func() {
   166  					buffer = NewBuffer()
   167  					_, err := buffer.Write([]byte("fake-username\nfake-password\n"))
   168  					Expect(err).ToNot(HaveOccurred())
   169  				})
   170  
   171  				It("requests the credentials at a prompt", func() {
   172  					session := helpers.CFWithStdin(buffer, "update-user-provided-service", serviceName, "-p", `"username,password"`)
   173  
   174  					Eventually(session).Should(Say("username: "))
   175  					Eventually(session).Should(Say("password: "))
   176  					Consistently(session).ShouldNot(Say("fake-username"), "credentials should not be echoed to the user")
   177  					Consistently(session).ShouldNot(Say("fake-password"), "credentials should not be echoed to the user")
   178  					eventuallyExpectOKMessage(session, serviceName, orgName, spaceName, userName)
   179  					Eventually(session).Should(Exit(0))
   180  				})
   181  			})
   182  
   183  			When("reading JSON credentials from a file", func() {
   184  				var path string
   185  
   186  				BeforeEach(func() {
   187  					path = helpers.TempFileWithContent(`{"some": "credentials"}`)
   188  				})
   189  
   190  				AfterEach(func() {
   191  					Expect(os.Remove(path)).To(Succeed())
   192  				})
   193  
   194  				It("accepts a file path", func() {
   195  					session := helpers.CF("update-user-provided-service", serviceName, "-p", path)
   196  
   197  					By("checking that it does not interpret the file name as request for an interactive credential prompt")
   198  					Consistently(session.Out.Contents()).ShouldNot(ContainSubstring(path))
   199  
   200  					By("succeeding")
   201  					eventuallyExpectOKMessage(session, serviceName, orgName, spaceName, userName)
   202  					Eventually(session).Should(Exit(0))
   203  				})
   204  			})
   205  		})
   206  	})
   207  })
   208  
   209  func eventuallyExpectHelpMessage(session *Session) {
   210  	Eventually(session).Should(Say(`NAME:`))
   211  	Eventually(session).Should(Say(`\s+update-user-provided-service - Update user-provided service instance`))
   212  	Eventually(session).Should(Say(`USAGE:`))
   213  	Eventually(session).Should(Say(`\s+cf update-user-provided-service SERVICE_INSTANCE \[-p CREDENTIALS\] \[-l SYSLOG_DRAIN_URL\] \[-r ROUTE_SERVICE_URL\] \[-t TAGS\]`))
   214  	Eventually(session).Should(Say(`\s+Pass comma separated credential parameter names to enable interactive mode:`))
   215  	Eventually(session).Should(Say(`\s+cf update-user-provided-service SERVICE_INSTANCE -p "comma, separated, parameter, names"`))
   216  	Eventually(session).Should(Say(`\s+Pass credential parameters as JSON to create a service non-interactively:`))
   217  	Eventually(session).Should(Say(`\s+cf update-user-provided-service SERVICE_INSTANCE -p '{"key1":"value1","key2":"value2"}'`))
   218  	Eventually(session).Should(Say(`\s+Specify a path to a file containing JSON:`))
   219  	Eventually(session).Should(Say(`\s+cf update-user-provided-service SERVICE_INSTANCE -p PATH_TO_FILE`))
   220  	Eventually(session).Should(Say(`EXAMPLES:`))
   221  	Eventually(session).Should(Say(`\s+cf update-user-provided-service my-db-mine -p '{"username":"admin", "password":"pa55woRD"}'`))
   222  	Eventually(session).Should(Say(`\s+cf update-user-provided-service my-db-mine -p /path/to/credentials.json`))
   223  	Eventually(session).Should(Say(`\s+cf create-user-provided-service my-db-mine -t "list, of, tags"`))
   224  	Eventually(session).Should(Say(`\s+cf update-user-provided-service my-drain-service -l syslog://example.com`))
   225  	Eventually(session).Should(Say(`\s+cf update-user-provided-service my-route-service -r https://example.com`))
   226  	Eventually(session).Should(Say(`ALIAS:`))
   227  	Eventually(session).Should(Say(`\s+uups`))
   228  	Eventually(session).Should(Say(`OPTIONS:`))
   229  	Eventually(session).Should(Say(`\s+-l\s+URL to which logs for bound applications will be streamed`))
   230  	Eventually(session).Should(Say(`\s+-p\s+Credentials, provided inline or in a file, to be exposed in the VCAP_SERVICES environment variable for bound applications. Provided credentials will override existing credentials.`))
   231  	Eventually(session).Should(Say(`\s+-r\s+URL to which requests for bound routes will be forwarded. Scheme for this URL must be https`))
   232  	Eventually(session).Should(Say(`\s+-t\s+User provided tags`))
   233  	Eventually(session).Should(Say(`SEE ALSO:`))
   234  	Eventually(session).Should(Say(`\s+rename-service, services, update-service`))
   235  }
   236  
   237  func eventuallyExpectOKMessage(session *Session, serviceName, orgName, spaceName, userName string) {
   238  	Eventually(session.Out).Should(Say("Updating user provided service %s in org %s / space %s as %s...", serviceName, orgName, spaceName, userName))
   239  	Eventually(session.Out).Should(Say("OK"))
   240  	Eventually(session.Out).Should(Say("TIP: Use 'cf restage' for any bound apps to ensure your env variable changes take effect"))
   241  }
   242  
   243  func randomUserProvidedServiceName() string {
   244  	return helpers.PrefixedRandomName("ups")
   245  }
   246  
   247  func createUserProvidedService(name string) {
   248  	Eventually(helpers.CF("create-user-provided-service", name)).Should(Exit(0))
   249  }
   250  
   251  func deleteUserProvidedService(name string) {
   252  	Eventually(helpers.CF("delete-service", name)).Should(Exit(0))
   253  }