github.com/DaAlbrecht/cf-cli@v0.0.0-20231128151943-1fe19bb400b9/integration/v7/isolated/create_user_provided_service_command_test.go (about)

     1  package isolated
     2  
     3  import (
     4  	"os"
     5  
     6  	"code.cloudfoundry.org/cli/integration/helpers"
     7  	. "github.com/onsi/ginkgo"
     8  	. "github.com/onsi/gomega"
     9  	. "github.com/onsi/gomega/gbytes"
    10  	. "github.com/onsi/gomega/gexec"
    11  )
    12  
    13  var _ = Describe("create-user-provided-service command", func() {
    14  	Describe("help", func() {
    15  		expectHelpMessage := func(session *Session) {
    16  			Expect(session).To(SatisfyAll(
    17  				Say(`NAME:`),
    18  				Say(`create-user-provided-service - Make a user-provided service instance available to CF apps`),
    19  				Say(`USAGE:`),
    20  				Say(`cf create-user-provided-service SERVICE_INSTANCE \[-p CREDENTIALS\] \[-l SYSLOG_DRAIN_URL\] \[-r ROUTE_SERVICE_URL\] \[-t TAGS\]`),
    21  				Say(`Pass comma separated credential parameter names to enable interactive mode:`),
    22  				Say(`cf create-user-provided-service SERVICE_INSTANCE -p "comma, separated, parameter, names"`),
    23  				Say(`Pass credential parameters as JSON to create a service non-interactively:`),
    24  				Say(`cf create-user-provided-service SERVICE_INSTANCE -p '\{"key1":"value1","key2":"value2"\}'`),
    25  				Say(`Specify a path to a file containing JSON:`),
    26  				Say(`cf create-user-provided-service SERVICE_INSTANCE -p PATH_TO_FILE`),
    27  				Say(`EXAMPLES:`),
    28  				Say(`cf create-user-provided-service my-db-mine -p "username, password"`),
    29  				Say(`cf create-user-provided-service my-db-mine -p /path/to/credentials.json`),
    30  				Say(`cf create-user-provided-service my-db-mine -t "list, of, tags"`),
    31  				Say(`cf create-user-provided-service my-drain-service -l syslog://example.com`),
    32  				Say(`cf create-user-provided-service my-route-service -r https://example.com`),
    33  				Say(`Linux/Mac:`),
    34  				Say(`cf create-user-provided-service my-db-mine -p '\{"username":"admin","password":"pa55woRD"\}'`),
    35  				Say(`Windows Command Line:`),
    36  				Say(`cf create-user-provided-service my-db-mine -p "\{\\"username\\":\\"admin\\",\\"password\\":\\"pa55woRD\\"\}"`),
    37  				Say(`Windows PowerShell:`),
    38  				Say(`cf create-user-provided-service my-db-mine -p '\{\\"username\\":\\"admin\\",\\"password\\":\\"pa55woRD\\"\}'`),
    39  				Say(`ALIAS:`),
    40  				Say(`cups`),
    41  				Say(`OPTIONS:`),
    42  				Say(`-l      URL to which logs for bound applications will be streamed`),
    43  				Say(`-p      Credentials, provided inline or in a file, to be exposed in the VCAP_SERVICES environment variable for bound applications`),
    44  				Say(`-r      URL to which requests for bound routes will be forwarded. Scheme for this URL must be https`),
    45  				Say(`-t      User provided tags`),
    46  				Say(`SEE ALSO:`),
    47  				Say(`bind-service, services`),
    48  			))
    49  		}
    50  
    51  		When("--help flag is set", func() {
    52  			It("displays command usage to output", func() {
    53  				session := helpers.CF("create-user-provided-service", "--help")
    54  				Eventually(session).Should(Exit(0))
    55  
    56  				expectHelpMessage(session)
    57  			})
    58  		})
    59  
    60  		When("no arguments provided", func() {
    61  			It("fails and displays command usage", func() {
    62  				session := helpers.CF("create-user-provided-service")
    63  				Eventually(session).Should(Exit(1))
    64  
    65  				Expect(session.Err).To(Say("Incorrect Usage: the required argument `SERVICE_INSTANCE` was not provided"))
    66  				expectHelpMessage(session)
    67  			})
    68  		})
    69  
    70  		When("an superfluous argument is provided", func() {
    71  			It("fails and displays command usage", func() {
    72  				session := helpers.CF("create-user-provided-service", "name", "extraparam")
    73  				Eventually(session).Should(Exit(1))
    74  
    75  				Expect(session.Err).To(Say(`Incorrect Usage: unexpected argument "extraparam"`))
    76  				expectHelpMessage(session)
    77  			})
    78  		})
    79  
    80  		When("an unsupported flag is provided", func() {
    81  			It("fails and displays command usage", func() {
    82  				session := helpers.CF("create-user-provided-service", "name", "--do-magic")
    83  				Eventually(session).Should(Exit(1))
    84  
    85  				Expect(session.Err).To(Say("Incorrect Usage: unknown flag `do-magic"))
    86  				expectHelpMessage(session)
    87  			})
    88  		})
    89  	})
    90  
    91  	When("the environment is not setup correctly", func() {
    92  		It("fails with the appropriate errors", func() {
    93  			helpers.CheckEnvironmentTargetedCorrectly(true, true, ReadOnlyOrg, "create-user-provided-service", "foo")
    94  		})
    95  	})
    96  
    97  	When("targeting a space", func() {
    98  		var (
    99  			userName    string
   100  			orgName     string
   101  			spaceName   string
   102  			serviceName string
   103  		)
   104  
   105  		expectOKMessage := func(session *Session, serviceName, orgName, spaceName, userName string) {
   106  			Expect(session.Out).To(SatisfyAll(
   107  				Say("Creating user provided service %s in org %s / space %s as %s...", serviceName, orgName, spaceName, userName),
   108  				Say("OK"),
   109  			))
   110  		}
   111  
   112  		BeforeEach(func() {
   113  			orgName = helpers.NewOrgName()
   114  			spaceName = helpers.NewSpaceName()
   115  			helpers.SetupCF(orgName, spaceName)
   116  			userName, _ = helpers.GetCredentials()
   117  			serviceName = helpers.PrefixedRandomName("ups")
   118  		})
   119  
   120  		AfterEach(func() {
   121  			helpers.QuickDeleteOrg(orgName)
   122  		})
   123  
   124  		When("a name is provided", func() {
   125  			It("displays success message, exits 0, and creates the service", func() {
   126  				session := helpers.CF(`create-user-provided-service`, serviceName)
   127  
   128  				Eventually(session).Should(Exit(0))
   129  				expectOKMessage(session, serviceName, orgName, spaceName, userName)
   130  
   131  				session = helpers.CF("service", serviceName)
   132  				Eventually(session).Should(Exit(0))
   133  				Expect(session).To(Say(`name:\s+%s`, serviceName))
   134  			})
   135  		})
   136  
   137  		When("all parameters are provided", func() {
   138  			It("displays success message, exits 0, and creates the service", func() {
   139  				session := helpers.CF(
   140  					`create-user-provided-service`, serviceName,
   141  					`-p`, `'{"username":"password"}'`,
   142  					`-t`, `"list, of, tags"`,
   143  					`-l`, `syslog://example-syslog.com`,
   144  					`-r`, `https://example-route.com`,
   145  				)
   146  
   147  				Eventually(session).Should(Exit(0))
   148  				expectOKMessage(session, serviceName, orgName, spaceName, userName)
   149  
   150  				session = helpers.CF("service", serviceName)
   151  				Eventually(session).Should(Exit(0))
   152  				Expect(session).To(SatisfyAll(
   153  					Say(`name:\s+%s`, serviceName),
   154  					Say(`tags:\s+list,\s*of,\s*tags`),
   155  					Say(`route service url:\s+https://example-route.com`),
   156  				))
   157  			})
   158  		})
   159  
   160  		When("requesting interactive credentials", func() {
   161  			var buffer *Buffer
   162  
   163  			BeforeEach(func() {
   164  				buffer = NewBuffer()
   165  				_, err := buffer.Write([]byte("fake-username\nfake-password\n"))
   166  				Expect(err).ToNot(HaveOccurred())
   167  			})
   168  
   169  			It("requests the credentials at a prompt", func() {
   170  				session := helpers.CFWithStdin(buffer, "create-user-provided-service", serviceName, "-p", `"username,password"`)
   171  
   172  				Eventually(session).Should(Say("username: "))
   173  				Eventually(session).Should(Say("password: "))
   174  				Consistently(session).ShouldNot(Say("fake-username"), "credentials should not be echoed to the user")
   175  				Consistently(session).ShouldNot(Say("fake-password"), "credentials should not be echoed to the user")
   176  				Eventually(session).Should(Exit(0))
   177  
   178  				expectOKMessage(session, serviceName, orgName, spaceName, userName)
   179  			})
   180  		})
   181  
   182  		When("reading JSON credentials from a file", func() {
   183  			var path string
   184  
   185  			BeforeEach(func() {
   186  				path = helpers.TempFileWithContent(`{"some": "credentials"}`)
   187  			})
   188  
   189  			AfterEach(func() {
   190  				Expect(os.Remove(path)).To(Succeed())
   191  			})
   192  
   193  			It("accepts a file path", func() {
   194  				session := helpers.CF("create-user-provided-service", serviceName, "-p", path)
   195  
   196  				By("checking that it does not interpret the file name as request for an interactive credential prompt")
   197  				Consistently(session.Out.Contents()).ShouldNot(ContainSubstring(path))
   198  
   199  				By("succeeding")
   200  				Eventually(session).Should(Exit(0))
   201  				expectOKMessage(session, serviceName, orgName, spaceName, userName)
   202  			})
   203  		})
   204  	})
   205  })