github.com/loafoe/cli@v7.1.0+incompatible/integration/v6/push/http_routes_in_manifest_test.go (about) 1 package push 2 3 import ( 4 "path/filepath" 5 "regexp" 6 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("HTTP routes in manifest", func() { 15 var ( 16 app string 17 domain helpers.Domain 18 subdomain helpers.Domain 19 route1 helpers.Route 20 route2 helpers.Route 21 routeWithPath helpers.Route 22 routeStar helpers.Route 23 ) 24 25 BeforeEach(func() { 26 app = helpers.NewAppName() 27 domain = helpers.NewDomain(organization, helpers.NewDomainName()) 28 subdomain = helpers.NewDomain(organization, "sub."+domain.Name) 29 route1 = helpers.NewRoute(space, domain.Name, helpers.PrefixedRandomName("r1"), "") 30 route2 = helpers.NewRoute(space, subdomain.Name, helpers.PrefixedRandomName("r2"), "") 31 routeWithPath = helpers.NewRoute(space, domain.Name, helpers.PrefixedRandomName("r3"), helpers.PrefixedRandomName("p1")) 32 routeStar = helpers.NewRoute(space, subdomain.Name, "*", "") 33 }) 34 35 When("the domain exist", func() { 36 BeforeEach(func() { 37 domain.Create() 38 subdomain.Create() 39 }) 40 41 When("the routes don't have a path", func() { 42 When("the routes are new", func() { 43 It("creates and maps the routes", func() { 44 helpers.WithHelloWorldApp(func(dir string) { 45 helpers.WriteManifest(filepath.Join(dir, "manifest.yml"), map[string]interface{}{ 46 "applications": []map[string]interface{}{ 47 { 48 "name": app, 49 "routes": []map[string]string{ 50 {"route": route1.String()}, 51 {"route": route2.String()}, 52 {"route": routeStar.String()}, 53 }, 54 }, 55 }, 56 }) 57 58 session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "--no-start") 59 Eventually(session).Should(Say(`Getting app info\.\.\.`)) 60 61 Eventually(session).Should(Say(`Creating app with these attributes\.\.\.`)) 62 Eventually(session).Should(Say(`\+\s+name:\s+%s`, app)) 63 Eventually(session).Should(Say(`\s+routes:`)) 64 Eventually(session).Should(Say(`(?i)\+\s+%s`, regexp.QuoteMeta(routeStar.String()))) 65 Eventually(session).Should(Say(`(?i)\+\s+%s`, route1)) 66 Eventually(session).Should(Say(`(?i)\+\s+%s`, route2)) 67 Eventually(session).Should(Exit(0)) 68 }) 69 70 session := helpers.CF("app", app) 71 Eventually(session).Should(Say(`name:\s+%s`, app)) 72 Eventually(session).Should(Say(`routes:\s+(%s, %s)|(%s, %s)`, route1, route2, route2, route1)) 73 Eventually(session).Should(Exit(0)) 74 }) 75 76 When("--random-route is also specified", func() { 77 It("creates and maps the routes", func() { 78 helpers.WithHelloWorldApp(func(dir string) { 79 helpers.WriteManifest(filepath.Join(dir, "manifest.yml"), map[string]interface{}{ 80 "applications": []map[string]interface{}{ 81 { 82 "name": app, 83 "random-route": true, 84 "routes": []map[string]string{ 85 {"route": route1.String()}, 86 {"route": route2.String()}, 87 }, 88 }, 89 }, 90 }) 91 92 session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "--no-start") 93 Eventually(session).Should(Say(`Getting app info\.\.\.`)) 94 95 Eventually(session).Should(Say(`Creating app with these attributes\.\.\.`)) 96 Eventually(session).Should(Say(`\+\s+name:\s+%s`, app)) 97 Eventually(session).Should(Say(`\s+routes:`)) 98 Eventually(session).Should(Say(`(?i)\+\s+%s`, route1)) 99 Eventually(session).Should(Say(`(?i)\+\s+%s`, route2)) 100 Eventually(session).Should(Exit(0)) 101 }) 102 103 session := helpers.CF("app", app) 104 Eventually(session).Should(Say(`name:\s+%s`, app)) 105 Eventually(session).Should(Say(`routes:\s+(%s, %s)|(%s, %s)`, route1, route2, route2, route1)) 106 Eventually(session).Should(Exit(0)) 107 }) 108 }) 109 }) 110 111 When("one of the routes exists", func() { 112 When("the route is in the current space", func() { 113 BeforeEach(func() { 114 route2.Create() 115 }) 116 117 It("creates and maps the new route; maps the old route", func() { 118 helpers.WithHelloWorldApp(func(dir string) { 119 helpers.WriteManifest(filepath.Join(dir, "manifest.yml"), map[string]interface{}{ 120 "applications": []map[string]interface{}{ 121 { 122 "name": app, 123 "routes": []map[string]string{ 124 {"route": route1.String()}, 125 {"route": route2.String()}, 126 }, 127 }, 128 }, 129 }) 130 131 session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "--no-start") 132 Eventually(session).Should(Say(`Getting app info\.\.\.`)) 133 134 Eventually(session).Should(Say(`Creating app with these attributes\.\.\.`)) 135 Eventually(session).Should(Say(`\+\s+name:\s+%s`, app)) 136 Eventually(session).Should(Say(`\s+routes:`)) 137 Eventually(session).Should(Say(`(?i)\+\s+%s`, route1)) 138 Eventually(session).Should(Say(`(?i)\+\s+%s`, route2)) 139 Eventually(session).Should(Exit(0)) 140 }) 141 142 session := helpers.CF("app", app) 143 Eventually(session).Should(Say(`name:\s+%s`, app)) 144 Eventually(session).Should(Say(`routes:\s+(%s, %s)|(%s, %s)`, route1, route2, route2, route1)) 145 Eventually(session).Should(Exit(0)) 146 }) 147 }) 148 149 When("the route is in a different space", func() { 150 BeforeEach(func() { 151 otherSpace := helpers.NewSpaceName() 152 helpers.CreateSpace(otherSpace) 153 route2.Space = otherSpace 154 route2.Create() 155 }) 156 157 It("returns an error", func() { 158 helpers.WithHelloWorldApp(func(dir string) { 159 helpers.WriteManifest(filepath.Join(dir, "manifest.yml"), map[string]interface{}{ 160 "applications": []map[string]interface{}{ 161 { 162 "name": app, 163 "routes": []map[string]string{ 164 {"route": route1.String()}, 165 {"route": route2.String()}, 166 }, 167 }, 168 }, 169 }) 170 171 session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "--no-start") 172 Eventually(session).Should(Say(`Getting app info\.\.\.`)) 173 Eventually(session.Err).Should(Say("The app cannot be mapped to route %s because the route exists in a different space.", route2)) 174 Eventually(session).Should(Exit(1)) 175 }) 176 }) 177 }) 178 }) 179 180 When("the route contains a port", func() { 181 BeforeEach(func() { 182 route1.Port = 1234 183 }) 184 185 It("returns an error", func() { 186 helpers.WithHelloWorldApp(func(dir string) { 187 helpers.WriteManifest(filepath.Join(dir, "manifest.yml"), map[string]interface{}{ 188 "applications": []map[string]interface{}{ 189 { 190 "name": app, 191 "routes": []map[string]string{ 192 {"route": route1.String()}, 193 {"route": route2.String()}, 194 }, 195 }, 196 }, 197 }) 198 199 session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "--no-start") 200 Eventually(session).Should(Say(`Getting app info\.\.\.`)) 201 Eventually(session.Err).Should(Say("Port not allowed in HTTP domain %s", domain.Name)) 202 Eventually(session).Should(Exit(1)) 203 }) 204 }) 205 }) 206 }) 207 208 When("the route has a path", func() { 209 210 When("the route is new", func() { 211 It("creates and maps the route", func() { 212 helpers.WithHelloWorldApp(func(dir string) { 213 helpers.WriteManifest(filepath.Join(dir, "manifest.yml"), map[string]interface{}{ 214 "applications": []map[string]interface{}{ 215 { 216 "name": app, 217 "routes": []map[string]string{ 218 {"route": routeWithPath.String()}, 219 }, 220 }, 221 }, 222 }) 223 session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "--no-start") 224 Eventually(session).Should(Say(`Getting app info\.\.\.`)) 225 226 Eventually(session).Should(Say(`Creating app with these attributes\.\.\.`)) 227 Eventually(session).Should(Say(`\+\s+name:\s+%s`, app)) 228 Eventually(session).Should(Say(`\s+routes:`)) 229 Eventually(session).Should(Say(`(?i)\+\s+%s`, routeWithPath)) 230 Eventually(session).Should(Exit(0)) 231 }) 232 233 session := helpers.CF("app", app) 234 Eventually(session).Should(Say(`name:\s+%s`, app)) 235 Eventually(session).Should(Say(`routes:\s+%s`, routeWithPath)) 236 Eventually(session).Should(Exit(0)) 237 }) 238 239 // This test refers to this dev consideration [https://www.pivotaltracker.com/story/show/126256733/comments/181122853] 240 When("a route with the same hostname and domain exists", func() { 241 var routeWithoutPath helpers.Route 242 243 BeforeEach(func() { 244 routeWithoutPath = routeWithPath 245 routeWithoutPath.Path = "" 246 247 routeWithoutPath.Create() 248 }) 249 250 It("creates and maps the route", func() { 251 helpers.WithHelloWorldApp(func(dir string) { 252 helpers.WriteManifest(filepath.Join(dir, "manifest.yml"), map[string]interface{}{ 253 "applications": []map[string]interface{}{ 254 { 255 "name": app, 256 "routes": []map[string]string{ 257 {"route": routeWithPath.String()}, 258 }, 259 }, 260 }, 261 }) 262 session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "--no-start") 263 Eventually(session).Should(Say(`Getting app info\.\.\.`)) 264 265 Eventually(session).Should(Say(`Creating app with these attributes\.\.\.`)) 266 Eventually(session).Should(Say(`\+\s+name:\s+%s`, app)) 267 Eventually(session).Should(Say(`\s+routes:`)) 268 Eventually(session).Should(Say(`(?i)\+\s+%s`, routeWithPath)) 269 Eventually(session).Should(Exit(0)) 270 }) 271 272 session := helpers.CF("app", app) 273 Eventually(session).Should(Say(`name:\s+%s`, app)) 274 Eventually(session).Should(Say(`routes:\s+%s`, routeWithPath)) 275 Eventually(session).Should(Exit(0)) 276 }) 277 }) 278 }) 279 280 When("the route exists", func() { 281 When("the route exists in the same space", func() { 282 BeforeEach(func() { 283 routeWithPath.Create() 284 }) 285 286 It("creates and maps the new route; maps the old route", func() { 287 helpers.WithHelloWorldApp(func(dir string) { 288 helpers.WriteManifest(filepath.Join(dir, "manifest.yml"), map[string]interface{}{ 289 "applications": []map[string]interface{}{ 290 { 291 "name": app, 292 "routes": []map[string]string{ 293 {"route": routeWithPath.String()}, 294 }, 295 }, 296 }, 297 }) 298 299 session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "--no-start") 300 Eventually(session).Should(Say(`Getting app info\.\.\.`)) 301 302 Eventually(session).Should(Say(`Creating app with these attributes\.\.\.`)) 303 Eventually(session).Should(Say(`\+\s+name:\s+%s`, app)) 304 Eventually(session).Should(Say(`\s+routes:`)) 305 Eventually(session).Should(Say(`(?i)\+\s+%s`, routeWithPath)) 306 Eventually(session).Should(Exit(0)) 307 }) 308 309 session := helpers.CF("app", app) 310 Eventually(session).Should(Say(`name:\s+%s`, app)) 311 Eventually(session).Should(Say(`routes:\s+%s`, routeWithPath)) 312 Eventually(session).Should(Exit(0)) 313 }) 314 }) 315 316 When("the route exists in another space", func() { 317 BeforeEach(func() { 318 otherSpace := helpers.NewSpaceName() 319 helpers.CreateSpace(otherSpace) 320 routeWithPath.Space = otherSpace 321 routeWithPath.Create() 322 }) 323 324 It("returns an error", func() { 325 helpers.WithHelloWorldApp(func(dir string) { 326 helpers.WriteManifest(filepath.Join(dir, "manifest.yml"), map[string]interface{}{ 327 "applications": []map[string]interface{}{ 328 { 329 "name": app, 330 "routes": []map[string]string{ 331 {"route": routeWithPath.String()}, 332 }, 333 }, 334 }, 335 }) 336 337 session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "--no-start") 338 Eventually(session).Should(Say(`Getting app info\.\.\.`)) 339 Eventually(session.Err).Should(Say("The app cannot be mapped to route %s because the route exists in a different space.", routeWithPath)) 340 Eventually(session).Should(Exit(1)) 341 }) 342 }) 343 }) 344 }) 345 }) 346 }) 347 348 When("the domain does not exist", func() { 349 It("returns an error", func() { 350 helpers.WithHelloWorldApp(func(dir string) { 351 helpers.WriteManifest(filepath.Join(dir, "manifest.yml"), map[string]interface{}{ 352 "applications": []map[string]interface{}{ 353 { 354 "name": app, 355 "routes": []map[string]string{ 356 {"route": route1.String()}, 357 {"route": route2.String()}, 358 }, 359 }, 360 }, 361 }) 362 363 session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "--no-start") 364 Eventually(session).Should(Say(`Getting app info\.\.\.`)) 365 Eventually(session.Err).Should(Say("The route %s did not match any existing domains.", route1)) 366 Eventually(session).Should(Exit(1)) 367 }) 368 }) 369 }) 370 })