github.com/randomtask1155/cli@v6.41.1-0.20181227003417-a98eed78cbde+incompatible/integration/shared/isolated/create_route_command_test.go (about)

     1  package isolated
     2  
     3  import (
     4  	"fmt"
     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("create-route command", func() {
    15  	Context("Help", func() {
    16  		It("displays the help information", func() {
    17  			session := helpers.CF("create-route", "--help")
    18  			Eventually(session).Should(Say(`NAME:`))
    19  			Eventually(session).Should(Say(`create-route - Create a url route in a space for later use\n`))
    20  			Eventually(session).Should(Say(`\n`))
    21  
    22  			Eventually(session).Should(Say(`USAGE:`))
    23  			Eventually(session).Should(Say(`Create an HTTP route:`))
    24  			Eventually(session).Should(Say(`cf create-route SPACE DOMAIN \[--hostname HOSTNAME\] \[--path PATH\]\n`))
    25  			Eventually(session).Should(Say(`\n`))
    26  
    27  			Eventually(session).Should(Say(`Create a TCP route:`))
    28  			Eventually(session).Should(Say(`cf create-route SPACE DOMAIN \(--port PORT \| --random-port\)\n`))
    29  			Eventually(session).Should(Say(`\n`))
    30  
    31  			Eventually(session).Should(Say(`EXAMPLES:`))
    32  			Eventually(session).Should(Say(`cf create-route my-space example.com\s+# example.com`))
    33  			Eventually(session).Should(Say(`cf create-route my-space example.com --hostname myapp\s+# myapp.example.com`))
    34  			Eventually(session).Should(Say(`cf create-route my-space example.com --hostname myapp --path foo\s+# myapp.example.com/foo`))
    35  			Eventually(session).Should(Say(`cf create-route my-space example.com --port 5000\s+# example.com:5000\n`))
    36  			Eventually(session).Should(Say(`\n`))
    37  
    38  			Eventually(session).Should(Say(`OPTIONS:`))
    39  			Eventually(session).Should(Say(`--hostname, -n\s+Hostname for the HTTP route \(required for shared domains\)`))
    40  			Eventually(session).Should(Say(`--path\s+Path for the HTTP route`))
    41  			Eventually(session).Should(Say(`--port\s+Port for the TCP route`))
    42  			Eventually(session).Should(Say(`--random-port\s+Create a random port for the TCP route\n`))
    43  			Eventually(session).Should(Say(`\n`))
    44  
    45  			Eventually(session).Should(Say(`SEE ALSO:`))
    46  			Eventually(session).Should(Say(`check-route, domains, map-route`))
    47  
    48  			Eventually(session).Should(Exit(0))
    49  		})
    50  	})
    51  
    52  	Context("Flag Errors", func() {
    53  		When("--hostname and --port are provided", func() {
    54  			It("fails with a message about being unable to mix --port with the HTTP route options", func() {
    55  				session := helpers.CF("create-route", "some-space", "some-domain", "--hostname", "some-host", "--port", "1122")
    56  				Eventually(session.Err).Should(Say(`Incorrect Usage: The following arguments cannot be used together: --hostname, --port`))
    57  				Eventually(session).Should(Exit(1))
    58  			})
    59  		})
    60  
    61  		When("--hostname and --random-port are provided", func() {
    62  			It("fails with a message about being unable to mix --random-port with any other options", func() {
    63  				session := helpers.CF("create-route", "some-space", "some-domain", "--hostname", "some-host", "--random-port")
    64  				Eventually(session.Err).Should(Say(`Incorrect Usage: The following arguments cannot be used together: --hostname, --random-port`))
    65  				Eventually(session).Should(Exit(1))
    66  			})
    67  		})
    68  
    69  		When("--path and --port are provided", func() {
    70  			It("fails with a message about being unable to mix --port with the HTTP route options", func() {
    71  				session := helpers.CF("create-route", "some-space", "some-domain", "--path", "/some-path", "--port", "1111")
    72  				Eventually(session.Err).Should(Say(`Incorrect Usage: The following arguments cannot be used together: --path, --port`))
    73  				Eventually(session).Should(Exit(1))
    74  			})
    75  		})
    76  
    77  		When("--path and --random-port are provided", func() {
    78  			It("fails with a message about being unable to mix --random-port with any other options", func() {
    79  				session := helpers.CF("create-route", "some-space", "some-domain", "--path", "/some-path", "--random-port")
    80  				Eventually(session.Err).Should(Say(`Incorrect Usage: The following arguments cannot be used together: --path, --random-port`))
    81  				Eventually(session).Should(Exit(1))
    82  			})
    83  		})
    84  
    85  		When("both --port and --random-port are provided", func() {
    86  			It("fails with a message about being unable to mix --random-port with any other options", func() {
    87  				session := helpers.CF("create-route", "some-space", "some-domain", "--port", "1121", "--random-port")
    88  				Eventually(session.Err).Should(Say(`Incorrect Usage: The following arguments cannot be used together: --port, --random-port`))
    89  				Eventually(session).Should(Exit(1))
    90  			})
    91  		})
    92  
    93  		When("the provided port is not valid / parseable", func() {
    94  			It("fails with an appropriate error", func() {
    95  				session := helpers.CF("create-route", "some-space", "some-domain", "--port", "ABC")
    96  				Eventually(session.Err).Should(Say(`Incorrect Usage: invalid argument for flag '--port' \(expected int > 0\)`))
    97  				Eventually(session).Should(Exit(1))
    98  			})
    99  		})
   100  	})
   101  
   102  	When("the environment is not setup correctly", func() {
   103  		When("no API endpoint is set", func() {
   104  			BeforeEach(func() {
   105  				helpers.UnsetAPI()
   106  			})
   107  
   108  			It("fails with no API endpoint set message", func() {
   109  				session := helpers.CF("create-route", "some-space", "some-domain")
   110  				Eventually(session).Should(Say(`FAILED`))
   111  				Eventually(session.Err).Should(Say(`No API endpoint set\. Use 'cf login' or 'cf api' to target an endpoint\.`))
   112  				Eventually(session).Should(Exit(1))
   113  			})
   114  		})
   115  
   116  		When("not logged in", func() {
   117  			BeforeEach(func() {
   118  				helpers.LogoutCF()
   119  			})
   120  
   121  			It("fails with not logged in message", func() {
   122  				session := helpers.CF("create-route", "some-space", "some-domain")
   123  				Eventually(session).Should(Say(`FAILED`))
   124  				Eventually(session.Err).Should(Say(`Not logged in\. Use 'cf login' to log in\.`))
   125  				Eventually(session).Should(Exit(1))
   126  			})
   127  		})
   128  
   129  		When("no organization is targeted", func() {
   130  			BeforeEach(func() {
   131  				helpers.ClearTarget()
   132  			})
   133  
   134  			It("fails with 'no organization targeted' message and exits 1", func() {
   135  				session := helpers.CF("create-route", "some-space", "some-domain")
   136  				Eventually(session).Should(Say(`FAILED`))
   137  				Eventually(session.Err).Should(Say(`No org targeted, use 'cf target -o ORG' to target an org\.`))
   138  				Eventually(session).Should(Exit(1))
   139  			})
   140  		})
   141  	})
   142  
   143  	When("the environment is set up correctly", func() {
   144  		var (
   145  			orgName   string
   146  			spaceName string
   147  		)
   148  
   149  		BeforeEach(func() {
   150  			orgName = helpers.NewOrgName()
   151  			spaceName = helpers.NewSpaceName()
   152  
   153  			helpers.SetupCF(orgName, spaceName)
   154  		})
   155  
   156  		AfterEach(func() {
   157  			helpers.QuickDeleteOrg(orgName)
   158  		})
   159  
   160  		When("the space does not exist", func() {
   161  			It("displays 'space not found' and exits 1", func() {
   162  				badSpaceName := fmt.Sprintf("%s-1", spaceName)
   163  				session := helpers.CF("create-route", badSpaceName, "some-domain")
   164  				Eventually(session).Should(Say(`FAILED`))
   165  				Eventually(session.Err).Should(Say(`Space '%s' not found\.`, badSpaceName))
   166  				Eventually(session).Should(Exit(1))
   167  			})
   168  		})
   169  
   170  		When("the space is not specified", func() {
   171  			It("displays error and exits 1", func() {
   172  				session := helpers.CF("create-route")
   173  				Eventually(session.Err).Should(Say("Incorrect Usage: the required arguments `SPACE` and `DOMAIN` were not provided\n"))
   174  				Eventually(session.Err).Should(Say("\n"))
   175  				Eventually(session).Should(Say("NAME:\n"))
   176  				Eventually(session).Should(Exit(1))
   177  			})
   178  		})
   179  
   180  		When("the domain does not exist", func() {
   181  			It("displays error and exits 1", func() {
   182  				session := helpers.CF("create-route", spaceName, "some-domain")
   183  				Eventually(session).Should(Say(`FAILED`))
   184  				Eventually(session.Err).Should(Say(`Domain some-domain not found`))
   185  				Eventually(session).Should(Exit(1))
   186  			})
   187  		})
   188  
   189  		When("the domain is not specified", func() {
   190  			It("displays error and exits 1", func() {
   191  				session := helpers.CF("create-route", spaceName)
   192  				Eventually(session.Err).Should(Say("Incorrect Usage: the required argument `DOMAIN` was not provided\n"))
   193  				Eventually(session.Err).Should(Say("\n"))
   194  				Eventually(session).Should(Say("NAME:\n"))
   195  				Eventually(session).Should(Exit(1))
   196  			})
   197  		})
   198  
   199  		When("the space and domain exist", func() {
   200  			var (
   201  				userName   string
   202  				domainName string
   203  			)
   204  
   205  			BeforeEach(func() {
   206  				domainName = helpers.NewDomainName()
   207  				userName, _ = helpers.GetCredentials()
   208  			})
   209  
   210  			When("the route already exists", func() {
   211  				var domain helpers.Domain
   212  
   213  				BeforeEach(func() {
   214  					domain = helpers.NewDomain(orgName, domainName)
   215  					domain.Create()
   216  					Eventually(helpers.CF("create-route", spaceName, domainName)).Should(Exit(0))
   217  				})
   218  
   219  				AfterEach(func() {
   220  					domain.Delete()
   221  				})
   222  
   223  				It("warns the user that it has already been created and runs to completion without failing", func() {
   224  					session := helpers.CF("create-route", spaceName, domainName)
   225  					Eventually(session).Should(Say(`Creating route %s for org %s / space %s as %s\.\.\.`, domainName, orgName, spaceName, userName))
   226  					Eventually(session.Err).Should(Say(`Route %s already exists\.`, domainName))
   227  					Eventually(session).Should(Say(`OK`))
   228  					Eventually(session).Should(Exit(0))
   229  				})
   230  			})
   231  
   232  			When("the route already exists in a different space", func() {
   233  				var domain helpers.Domain
   234  
   235  				BeforeEach(func() {
   236  					domain = helpers.NewDomain(orgName, domainName)
   237  					domain.Create()
   238  					differentSpaceName := helpers.NewSpaceName()
   239  					helpers.CreateSpace(differentSpaceName)
   240  					Eventually(helpers.CF("create-route", differentSpaceName, domainName)).Should(Exit(0))
   241  				})
   242  
   243  				AfterEach(func() {
   244  					domain.Delete()
   245  				})
   246  
   247  				It("warns the user that the route is already in use and then fails", func() {
   248  					session := helpers.CF("create-route", spaceName, domainName)
   249  					Eventually(session).Should(Say(`Creating route %s for org %s / space %s as %s\.\.\.`, domainName, orgName, spaceName, userName))
   250  					Eventually(session.Err).Should(Say("The app cannot be mapped to route %s because the route exists in a different space.", domainName))
   251  					Eventually(session).Should(Say(`FAILED`))
   252  					Eventually(session).Should(Exit(1))
   253  				})
   254  			})
   255  
   256  			When("the route does not already exist", func() {
   257  				When("the domain is private", func() {
   258  					var domain helpers.Domain
   259  
   260  					BeforeEach(func() {
   261  						domain = helpers.NewDomain(orgName, domainName)
   262  						domain.Create()
   263  						Eventually(helpers.CF("create-route", spaceName, domainName)).Should(Exit(0))
   264  					})
   265  
   266  					AfterEach(func() {
   267  						domain.Delete()
   268  					})
   269  
   270  					When("no flags are used", func() {
   271  						It("creates the route", func() {
   272  							session := helpers.CF("create-route", spaceName, domainName)
   273  							Eventually(session).Should(Say(`Creating route %s for org %s / space %s as %s\.\.\.`, domainName, orgName, spaceName, userName))
   274  							Eventually(session).Should(Exit(0))
   275  						})
   276  					})
   277  
   278  					When("the path is provided but the hostname is not", func() {
   279  						var path string
   280  
   281  						BeforeEach(func() {
   282  							path = helpers.PrefixedRandomName("path")
   283  						})
   284  
   285  						It("creates the route", func() {
   286  							session := helpers.CF("create-route", spaceName, domainName, "--path", path)
   287  							Eventually(session).Should(Say(`Creating route %s/%s for org %s / space %s as %s\.\.\.`, domainName, path, orgName, spaceName, userName))
   288  							Eventually(session).Should(Exit(0))
   289  						})
   290  					})
   291  				})
   292  
   293  				When("the domain is a shared HTTP domain", func() {
   294  					var domain helpers.Domain
   295  
   296  					BeforeEach(func() {
   297  						domain = helpers.NewDomain(orgName, domainName)
   298  						domain.CreateShared()
   299  					})
   300  
   301  					AfterEach(func() {
   302  						domain.DeleteShared()
   303  					})
   304  
   305  					When("no flags are used", func() {
   306  						When("the domain already has some routes", func() {
   307  							var hostName string
   308  
   309  							BeforeEach(func() {
   310  								hostName = helpers.PrefixedRandomName("my-host")
   311  								Eventually(helpers.CF("create-route", spaceName, domainName, "--hostname", hostName)).Should(Exit(0))
   312  							})
   313  
   314  							It("fails with error message informing users to provide a port or random-port", func() {
   315  								session := helpers.CF("create-route", spaceName, domainName)
   316  								Eventually(session).Should(Say(`Creating route %s for org %s / space %s as %s\.\.\.`, domainName, orgName, spaceName, userName))
   317  								Eventually(session).Should(Say(`FAILED`))
   318  								Eventually(session.Err).Should(Say(`The route is invalid: host is required for shared-domains`))
   319  								Eventually(session).Should(Exit(1))
   320  							})
   321  						})
   322  
   323  						It("fails with an error message and exits 1", func() {
   324  							session := helpers.CF("create-route", spaceName, domainName)
   325  							Eventually(session).Should(Say(`Creating route %s for org %s / space %s as %s\.\.\.`, domainName, orgName, spaceName, userName))
   326  							Eventually(session.Err).Should(Say(`The route is invalid: host is required for shared-domains`))
   327  							Eventually(session).Should(Exit(1))
   328  						})
   329  					})
   330  
   331  					When("TCP flag options are provided", func() {
   332  						It("fails with an error message and exits 1", func() {
   333  							port := "90230"
   334  							session := helpers.CF("create-route", spaceName, domainName, "--port", port)
   335  							Eventually(session).Should(Say(`Creating route %s:%s for org %s / space %s as %s\.\.\.`, domainName, port, orgName, spaceName, userName))
   336  							Eventually(session.Err).Should(Say(`Port not allowed in HTTP domain %s`, domainName))
   337  							Eventually(session).Should(Exit(1))
   338  						})
   339  
   340  						It("fails with an error message and exits 1", func() {
   341  							session := helpers.CF("create-route", spaceName, domainName, "--random-port")
   342  							Eventually(session).Should(Say(`Creating route %s for org %s / space %s as %s\.\.\.`, domainName, orgName, spaceName, userName))
   343  							Eventually(session.Err).Should(Say(`Port not allowed in HTTP domain %s`, domainName))
   344  							Eventually(session).Should(Exit(1))
   345  						})
   346  					})
   347  
   348  					When("the hostname is provided", func() {
   349  						var hostName string
   350  
   351  						BeforeEach(func() {
   352  							hostName = helpers.PrefixedRandomName("my-host")
   353  						})
   354  
   355  						When("no path is provided", func() {
   356  							It("creates the route", func() {
   357  								session := helpers.CF("create-route", spaceName, domainName, "--hostname", hostName)
   358  								Eventually(session).Should(Say(`Creating route %s.%s for org %s / space %s as %s\.\.\.`, hostName, domainName, orgName, spaceName, userName))
   359  								Eventually(session).Should(Exit(0))
   360  							})
   361  						})
   362  
   363  						When("a path is provided", func() {
   364  							It("creates the route", func() {
   365  								path := fmt.Sprintf("/%s", helpers.PrefixedRandomName("path"))
   366  								session := helpers.CF("create-route", spaceName, domainName, "--hostname", hostName, "--path", path)
   367  								Eventually(session).Should(Say(`Creating route %s.%s%s for org %s / space %s as %s\.\.\.`, hostName, domainName, path, orgName, spaceName, userName))
   368  								Eventually(session).Should(Exit(0))
   369  							})
   370  						})
   371  					})
   372  
   373  					When("the hostname is not provided", func() {
   374  						var path string
   375  
   376  						BeforeEach(func() {
   377  							path = helpers.PrefixedRandomName("path")
   378  						})
   379  
   380  						When("the path is provided", func() {
   381  							It("fails with an error message and exits 1", func() {
   382  								session := helpers.CF("create-route", spaceName, domainName, "--path", path)
   383  								Eventually(session).Should(Say(`Creating route %s/%s for org %s / space %s as %s\.\.\.`, domainName, path, orgName, spaceName, userName))
   384  								Eventually(session.Err).Should(Say(`The route is invalid: host is required for shared-domains`))
   385  								Eventually(session).Should(Exit(1))
   386  							})
   387  						})
   388  					})
   389  				})
   390  
   391  				When("the domain is a shared TCP domain", func() {
   392  					var domain helpers.Domain
   393  
   394  					BeforeEach(func() {
   395  						helpers.SkipIfVersionLessThan(ccversion.MinVersionRoutingV3)
   396  						domain = helpers.NewDomain(orgName, domainName)
   397  						domain.CreateWithRouterGroup(helpers.FindOrCreateTCPRouterGroup(GinkgoParallelNode()))
   398  					})
   399  
   400  					AfterEach(func() {
   401  						domain.DeleteShared()
   402  					})
   403  
   404  					When("HTTP flag options are provided", func() {
   405  						It("fails with an error message and exits 1", func() {
   406  							hostName := helpers.PrefixedRandomName("host-")
   407  							path := helpers.PrefixedRandomName("path-")
   408  							session := helpers.CF("create-route", spaceName, domainName, "--hostname", hostName, "--path", path)
   409  							Eventually(session).Should(Say(`Creating route %s.%s/%s for org %s / space %s as %s\.\.\.`, hostName, domainName, path, orgName, spaceName, userName))
   410  							Eventually(session.Err).Should(Say(`The route is invalid: For TCP routes you must specify a port or request a random one.`))
   411  							Eventually(session).Should(Exit(1))
   412  						})
   413  					})
   414  
   415  					When("a port is provided", func() {
   416  						It("creates the route", func() {
   417  							port := "1025"
   418  							session := helpers.CF("create-route", spaceName, domainName, "--port", port)
   419  							Eventually(session).Should(Say(`Creating route %s:%s for org %s / space %s as %s\.\.\.`, domainName, port, orgName, spaceName, userName))
   420  							Eventually(session).Should(Exit(0))
   421  						})
   422  					})
   423  
   424  					When("--random-port is provided", func() {
   425  						It("creates the route", func() {
   426  							session := helpers.CF("create-route", spaceName, domainName, "--random-port")
   427  							Eventually(session).Should(Say(`Creating route %s for org %s / space %s as %s\.\.\.`, domainName, orgName, spaceName, userName))
   428  							Eventually(session).Should(Say(`Route %s:\d+ has been created\.`, domainName))
   429  							Eventually(session).Should(Exit(0))
   430  						})
   431  
   432  						When("there are other routes in the domain we want to create the route with", func() {
   433  							BeforeEach(func() {
   434  								session := helpers.CF("create-route", spaceName, domainName, "--random-port")
   435  								Eventually(session).Should(Say(`Route %s:\d+ has been created\.`, domainName))
   436  								Eventually(session).Should(Exit(0))
   437  							})
   438  
   439  							It("should determine that the random route does not already exist, and create it", func() {
   440  								session := helpers.CF("create-route", spaceName, domainName, "--random-port")
   441  								Eventually(session).Should(Say(`Creating route %s for org %s / space %s as %s\.\.\.`, domainName, orgName, spaceName, userName))
   442  								Eventually(session).Should(Say(`Route %s:\d+ has been created\.`, domainName))
   443  								Eventually(session).Should(Exit(0))
   444  							})
   445  						})
   446  					})
   447  
   448  					When("no options are provided", func() {
   449  						It("fails with error message informing users to provide a port or random-port", func() {
   450  							session := helpers.CF("create-route", spaceName, domainName)
   451  							Eventually(session).Should(Say(`Creating route %s for org %s / space %s as %s\.\.\.`, domainName, orgName, spaceName, userName))
   452  							Eventually(session).Should(Say(`FAILED`))
   453  							Eventually(session.Err).Should(Say(`The route is invalid: For TCP routes you must specify a port or request a random one.`))
   454  							Eventually(session).Should(Exit(1))
   455  						})
   456  
   457  						When("the domain already has some routes", func() {
   458  							BeforeEach(func() {
   459  								Eventually(helpers.CF("create-route", spaceName, domainName, "--random-port")).Should(Exit(0))
   460  							})
   461  
   462  							It("fails with error message informing users to provide a port or random-port", func() {
   463  								session := helpers.CF("create-route", spaceName, domainName)
   464  								Eventually(session).Should(Say(`Creating route %s for org %s / space %s as %s\.\.\.`, domainName, orgName, spaceName, userName))
   465  								Eventually(session).Should(Say(`FAILED`))
   466  								Eventually(session.Err).Should(Say(`The route is invalid: For TCP routes you must specify a port or request a random one.`))
   467  								Eventually(session).Should(Exit(1))
   468  							})
   469  						})
   470  					})
   471  				})
   472  			})
   473  		})
   474  	})
   475  })