github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/integration/v6/isolated/create_route_command_test.go (about)

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