github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/cfnetworkingaction/policy_test.go (about) 1 package cfnetworkingaction_test 2 3 import ( 4 "errors" 5 6 "code.cloudfoundry.org/cfnetworking-cli-api/cfnetworking/cfnetv1" 7 "code.cloudfoundry.org/cli/actor/actionerror" 8 . "code.cloudfoundry.org/cli/actor/cfnetworkingaction" 9 "code.cloudfoundry.org/cli/actor/cfnetworkingaction/cfnetworkingactionfakes" 10 "code.cloudfoundry.org/cli/actor/v3action" 11 . "github.com/onsi/ginkgo" 12 . "github.com/onsi/gomega" 13 ) 14 15 var _ = Describe("Policy", func() { 16 var ( 17 actor *Actor 18 fakeV3Actor *cfnetworkingactionfakes.FakeV3Actor 19 fakeNetworkingClient *cfnetworkingactionfakes.FakeNetworkingClient 20 21 warnings Warnings 22 executeErr error 23 ) 24 25 BeforeEach(func() { 26 fakeV3Actor = new(cfnetworkingactionfakes.FakeV3Actor) 27 fakeNetworkingClient = new(cfnetworkingactionfakes.FakeNetworkingClient) 28 29 fakeV3Actor.GetApplicationByNameAndSpaceStub = func(appName string, spaceGUID string) (v3action.Application, v3action.Warnings, error) { 30 if appName == "appA" { 31 return v3action.Application{GUID: "appAGUID"}, []string{"v3ActorWarningA"}, nil 32 } else if appName == "appB" { 33 return v3action.Application{GUID: "appBGUID"}, []string{"v3ActorWarningB"}, nil 34 } 35 return v3action.Application{}, nil, nil 36 } 37 38 actor = NewActor(fakeNetworkingClient, fakeV3Actor) 39 }) 40 41 Describe("AddNetworkPolicy", func() { 42 JustBeforeEach(func() { 43 srcSpaceGuid := "src-space" 44 srcApp := "appA" 45 destSpaceGuid := "dst-space" 46 destApp := "appB" 47 protocol := "tcp" 48 startPort := 8080 49 endPort := 8090 50 warnings, executeErr = actor.AddNetworkPolicy(srcSpaceGuid, srcApp, destSpaceGuid, destApp, protocol, startPort, endPort) 51 }) 52 53 It("creates policies", func() { 54 Expect(warnings).To(ConsistOf("v3ActorWarningA", "v3ActorWarningB")) 55 Expect(executeErr).NotTo(HaveOccurred()) 56 57 Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(2)) 58 sourceAppName, srcSpaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(0) 59 Expect(sourceAppName).To(Equal("appA")) 60 Expect(srcSpaceGUID).To(Equal("src-space")) 61 62 destAppName, destSpaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(1) 63 Expect(destAppName).To(Equal("appB")) 64 Expect(destSpaceGUID).To(Equal("dst-space")) 65 66 Expect(fakeNetworkingClient.CreatePoliciesCallCount()).To(Equal(1)) 67 Expect(fakeNetworkingClient.CreatePoliciesArgsForCall(0)).To(Equal([]cfnetv1.Policy{ 68 { 69 Source: cfnetv1.PolicySource{ 70 ID: "appAGUID", 71 }, 72 Destination: cfnetv1.PolicyDestination{ 73 ID: "appBGUID", 74 Protocol: "tcp", 75 Ports: cfnetv1.Ports{ 76 Start: 8080, 77 End: 8090, 78 }, 79 }, 80 }, 81 })) 82 }) 83 84 When("getting the source app fails ", func() { 85 BeforeEach(func() { 86 fakeV3Actor.GetApplicationByNameAndSpaceReturns(v3action.Application{}, []string{"v3ActorWarningA"}, errors.New("banana")) 87 }) 88 It("returns a sensible error", func() { 89 Expect(warnings).To(ConsistOf("v3ActorWarningA")) 90 Expect(executeErr).To(MatchError("banana")) 91 }) 92 }) 93 94 When("getting the destination app fails ", func() { 95 BeforeEach(func() { 96 fakeV3Actor.GetApplicationByNameAndSpaceStub = func(appName string, spaceGUID string) (v3action.Application, v3action.Warnings, error) { 97 if appName == "appB" { 98 return v3action.Application{}, []string{"v3ActorWarningB"}, errors.New("banana") 99 } 100 return v3action.Application{}, []string{"v3ActorWarningA"}, nil 101 } 102 }) 103 It("returns a sensible error", func() { 104 Expect(warnings).To(ConsistOf("v3ActorWarningA", "v3ActorWarningB")) 105 Expect(executeErr).To(MatchError("banana")) 106 }) 107 }) 108 109 When("creating the policy fails", func() { 110 BeforeEach(func() { 111 fakeNetworkingClient.CreatePoliciesReturns(errors.New("apple")) 112 }) 113 It("returns a sensible error", func() { 114 Expect(executeErr).To(MatchError("apple")) 115 }) 116 }) 117 }) 118 119 Describe("NetworkPoliciesBySpaceAndAppName", func() { 120 var ( 121 policies []Policy 122 srcApp string 123 ) 124 125 BeforeEach(func() { 126 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{{ 127 Source: cfnetv1.PolicySource{ 128 ID: "appAGUID", 129 }, 130 Destination: cfnetv1.PolicyDestination{ 131 ID: "appBGUID", 132 Protocol: "tcp", 133 Ports: cfnetv1.Ports{ 134 Start: 8080, 135 End: 8080, 136 }, 137 }, 138 }, { 139 Source: cfnetv1.PolicySource{ 140 ID: "appAGUID", 141 }, 142 Destination: cfnetv1.PolicyDestination{ 143 ID: "appCGUID", 144 Protocol: "tcp", 145 Ports: cfnetv1.Ports{ 146 Start: 8080, 147 End: 8080, 148 }, 149 }, 150 }}, nil) 151 152 fakeV3Actor.GetApplicationByNameAndSpaceReturns(v3action.Application{ 153 Name: "appA", 154 GUID: "appAGUID", 155 SpaceGUID: "spaceAGUID", 156 }, []string{"GetApplicationByNameAndSpaceWarning"}, nil) 157 158 fakeV3Actor.GetApplicationsByGUIDsReturns([]v3action.Application{ 159 { 160 Name: "appB", 161 GUID: "appBGUID", 162 SpaceGUID: "spaceAGUID", 163 }, 164 { 165 Name: "appC", 166 GUID: "appCGUID", 167 SpaceGUID: "spaceCGUID", 168 }, 169 }, []string{"GetApplicationsByGUIDsWarning"}, nil) 170 171 fakeV3Actor.GetSpacesByGUIDsReturns([]v3action.Space{ 172 { 173 Name: "spaceA", 174 GUID: "spaceAGUID", 175 OrganizationGUID: "orgAGUID", 176 }, 177 { 178 Name: "spaceC", 179 GUID: "spaceCGUID", 180 OrganizationGUID: "orgCGUID", 181 }, 182 }, []string{"GetSpacesByGUIDsWarning"}, nil) 183 184 fakeV3Actor.GetOrganizationsByGUIDsReturns([]v3action.Organization{ 185 { 186 Name: "orgA", 187 GUID: "orgAGUID", 188 }, 189 { 190 Name: "orgC", 191 GUID: "orgCGUID", 192 }, 193 }, []string{"GetOrganizationsByGUIDsWarning"}, nil) 194 }) 195 196 JustBeforeEach(func() { 197 srcSpaceGuid := "space" 198 policies, warnings, executeErr = actor.NetworkPoliciesBySpaceAndAppName(srcSpaceGuid, srcApp) 199 }) 200 201 When("listing policies based on a source app", func() { 202 BeforeEach(func() { 203 srcApp = "appA" 204 }) 205 206 It("lists only policies for which the app is a source", func() { 207 Expect(policies).To(Equal([]Policy{ 208 { 209 SourceName: "appA", 210 DestinationName: "appB", 211 Protocol: "tcp", 212 StartPort: 8080, 213 EndPort: 8080, 214 DestinationSpaceName: "spaceA", 215 DestinationOrgName: "orgA", 216 }, 217 { 218 SourceName: "appA", 219 DestinationName: "appC", 220 Protocol: "tcp", 221 StartPort: 8080, 222 EndPort: 8080, 223 DestinationSpaceName: "spaceC", 224 DestinationOrgName: "orgC", 225 }, 226 }, 227 )) 228 }) 229 230 It("passes through the source app argument", func() { 231 Expect(warnings).To(ConsistOf( 232 "GetApplicationByNameAndSpaceWarning", 233 "GetApplicationsByGUIDsWarning", 234 "GetSpacesByGUIDsWarning", 235 "GetOrganizationsByGUIDsWarning", 236 )) 237 Expect(executeErr).NotTo(HaveOccurred()) 238 239 Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1)) 240 sourceAppName, spaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(0) 241 Expect(sourceAppName).To(Equal("appA")) 242 Expect(spaceGUID).To(Equal("space")) 243 244 Expect(fakeNetworkingClient.ListPoliciesCallCount()).To(Equal(1)) 245 Expect(fakeNetworkingClient.ListPoliciesArgsForCall(0)).To(Equal([]string{"appAGUID"})) 246 247 Expect(fakeV3Actor.GetApplicationsByGUIDsCallCount()).To(Equal(1)) 248 Expect(fakeV3Actor.GetApplicationsByGUIDsArgsForCall(0)).To(ConsistOf("appBGUID", "appCGUID")) 249 250 Expect(fakeV3Actor.GetSpacesByGUIDsCallCount()).To(Equal(1)) 251 Expect(fakeV3Actor.GetSpacesByGUIDsArgsForCall(0)).To(ConsistOf("spaceAGUID", "spaceCGUID")) 252 }) 253 }) 254 255 When("getting the applications by name and space fails", func() { 256 BeforeEach(func() { 257 fakeV3Actor.GetApplicationByNameAndSpaceReturns(v3action.Application{}, []string{"GetApplicationsBySpaceWarning"}, errors.New("banana")) 258 }) 259 260 It("returns a sensible error", func() { 261 Expect(policies).To(Equal([]Policy{})) 262 Expect(warnings).To(ContainElement("GetApplicationsBySpaceWarning")) 263 Expect(executeErr).To(MatchError("banana")) 264 }) 265 }) 266 267 When("listing the policy fails", func() { 268 BeforeEach(func() { 269 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{}, errors.New("apple")) 270 }) 271 It("returns a sensible error", func() { 272 Expect(executeErr).To(MatchError("apple")) 273 }) 274 }) 275 276 When("getting the applications by guids fails", func() { 277 BeforeEach(func() { 278 fakeV3Actor.GetApplicationsByGUIDsReturns([]v3action.Application{}, []string{"GetApplicationsByGUIDsWarning"}, errors.New("banana")) 279 }) 280 281 It("returns a sensible error", func() { 282 Expect(policies).To(Equal([]Policy{})) 283 Expect(warnings).To(ContainElement("GetApplicationsByGUIDsWarning")) 284 Expect(executeErr).To(MatchError("banana")) 285 }) 286 }) 287 288 When("getting the spaces by guids fails", func() { 289 BeforeEach(func() { 290 fakeV3Actor.GetSpacesByGUIDsReturns([]v3action.Space{}, []string{"GetSpacesByGUIDsWarning"}, errors.New("banana")) 291 }) 292 293 It("returns a sensible error", func() { 294 Expect(policies).To(Equal([]Policy{})) 295 Expect(warnings).To(ContainElement("GetSpacesByGUIDsWarning")) 296 Expect(executeErr).To(MatchError("banana")) 297 }) 298 }) 299 }) 300 301 Describe("NetworkPoliciesBySpace", func() { 302 var ( 303 policies []Policy 304 ) 305 306 BeforeEach(func() { 307 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{{ 308 Source: cfnetv1.PolicySource{ 309 ID: "appAGUID", 310 }, 311 Destination: cfnetv1.PolicyDestination{ 312 ID: "appBGUID", 313 Protocol: "tcp", 314 Ports: cfnetv1.Ports{ 315 Start: 8080, 316 End: 8080, 317 }, 318 }, 319 }, { 320 Source: cfnetv1.PolicySource{ 321 ID: "appBGUID", 322 }, 323 Destination: cfnetv1.PolicyDestination{ 324 ID: "appBGUID", 325 Protocol: "tcp", 326 Ports: cfnetv1.Ports{ 327 Start: 8080, 328 End: 8080, 329 }, 330 }, 331 }, { 332 Source: cfnetv1.PolicySource{ 333 ID: "appAGUID", 334 }, 335 Destination: cfnetv1.PolicyDestination{ 336 ID: "appCGUID", 337 Protocol: "tcp", 338 Ports: cfnetv1.Ports{ 339 Start: 8080, 340 End: 8080, 341 }, 342 }, 343 }}, nil) 344 345 fakeV3Actor.GetApplicationsBySpaceReturns([]v3action.Application{ 346 { 347 Name: "appA", 348 GUID: "appAGUID", 349 SpaceGUID: "spaceAGUID", 350 }, 351 { 352 Name: "appB", 353 GUID: "appBGUID", 354 SpaceGUID: "spaceAGUID", 355 }, 356 { 357 Name: "appC", 358 GUID: "appCGUID", 359 SpaceGUID: "spaceCGUID", 360 }, 361 }, []string{"GetApplicationsBySpaceWarning"}, nil) 362 363 fakeV3Actor.GetApplicationsByGUIDsReturns([]v3action.Application{ 364 { 365 GUID: "appBGUID", 366 Name: "appB", 367 SpaceGUID: "spaceAGUID", 368 }, 369 { 370 GUID: "appCGUID", 371 Name: "appC", 372 SpaceGUID: "spaceCGUID", 373 }, 374 }, []string{"GetApplicationsByGUIDsWarning"}, nil) 375 376 fakeV3Actor.GetSpacesByGUIDsReturns([]v3action.Space{ 377 { 378 GUID: "spaceAGUID", 379 Name: "spaceA", 380 OrganizationGUID: "orgAGUID", 381 }, 382 { 383 GUID: "spaceCGUID", 384 Name: "spaceC", 385 OrganizationGUID: "orgCGUID", 386 }, 387 }, []string{"GetSpaceByGUIDsWarning"}, nil) 388 389 fakeV3Actor.GetOrganizationsByGUIDsReturns([]v3action.Organization{ 390 { 391 GUID: "orgAGUID", 392 Name: "orgA", 393 }, 394 { 395 GUID: "orgCGUID", 396 Name: "orgC", 397 }, 398 }, []string{"GetOrganizationsByGUIDsWarning"}, nil) 399 }) 400 401 JustBeforeEach(func() { 402 spaceGuid := "space" 403 policies, warnings, executeErr = actor.NetworkPoliciesBySpace(spaceGuid) 404 }) 405 406 It("lists policies", func() { 407 Expect(policies).To(Equal( 408 []Policy{{ 409 SourceName: "appA", 410 DestinationName: "appB", 411 Protocol: "tcp", 412 StartPort: 8080, 413 EndPort: 8080, 414 DestinationSpaceName: "spaceA", 415 DestinationOrgName: "orgA", 416 }, { 417 SourceName: "appB", 418 DestinationName: "appB", 419 Protocol: "tcp", 420 StartPort: 8080, 421 EndPort: 8080, 422 DestinationSpaceName: "spaceA", 423 DestinationOrgName: "orgA", 424 }, { 425 SourceName: "appA", 426 DestinationName: "appC", 427 Protocol: "tcp", 428 StartPort: 8080, 429 EndPort: 8080, 430 DestinationSpaceName: "spaceC", 431 DestinationOrgName: "orgC", 432 }}, 433 )) 434 Expect(warnings).To(ConsistOf( 435 "GetApplicationsBySpaceWarning", 436 "GetApplicationsByGUIDsWarning", 437 "GetSpaceByGUIDsWarning", 438 "GetOrganizationsByGUIDsWarning", 439 )) 440 Expect(executeErr).NotTo(HaveOccurred()) 441 442 Expect(fakeV3Actor.GetApplicationsBySpaceCallCount()).To(Equal(1)) 443 Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(0)) 444 445 Expect(fakeNetworkingClient.ListPoliciesCallCount()).To(Equal(1)) 446 Expect(fakeNetworkingClient.ListPoliciesArgsForCall(0)).To(ConsistOf("appAGUID", "appBGUID", "appCGUID")) 447 448 Expect(fakeV3Actor.GetApplicationsByGUIDsCallCount()).To(Equal(1)) 449 Expect(fakeV3Actor.GetApplicationsByGUIDsArgsForCall(0)).To(ConsistOf("appBGUID", "appCGUID")) 450 451 Expect(fakeV3Actor.GetSpacesByGUIDsCallCount()).To(Equal(1)) 452 Expect(fakeV3Actor.GetSpacesByGUIDsArgsForCall(0)).To(ConsistOf("spaceAGUID", "spaceCGUID")) 453 454 Expect(fakeV3Actor.GetOrganizationsByGUIDsCallCount()).To(Equal(1)) 455 Expect(fakeV3Actor.GetOrganizationsByGUIDsArgsForCall(0)).To(ConsistOf("orgAGUID", "orgCGUID")) 456 }) 457 458 // policy server returns policies that match the give app guid in the source or destination 459 // we only care about the policies that match the source guid. 460 When("the policy server returns policies that have matching destination app guids", func() { 461 BeforeEach(func() { 462 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{{ 463 Source: cfnetv1.PolicySource{ 464 ID: "appDGUID", 465 }, 466 Destination: cfnetv1.PolicyDestination{ 467 ID: "appAGUID", 468 Protocol: "tcp", 469 Ports: cfnetv1.Ports{ 470 Start: 8080, 471 End: 8080, 472 }, 473 }, 474 }}, nil) 475 }) 476 477 It("filters them out ", func() { 478 Expect(policies).To(BeEmpty()) 479 }) 480 }) 481 482 When("getting the applications fails", func() { 483 BeforeEach(func() { 484 fakeV3Actor.GetApplicationsBySpaceReturns([]v3action.Application{}, []string{"GetApplicationsBySpaceWarning"}, errors.New("banana")) 485 }) 486 487 It("returns a sensible error", func() { 488 Expect(policies).To(Equal([]Policy{})) 489 Expect(warnings).To(ConsistOf("GetApplicationsBySpaceWarning")) 490 Expect(executeErr).To(MatchError("banana")) 491 }) 492 }) 493 494 When("listing the policy fails", func() { 495 BeforeEach(func() { 496 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{}, errors.New("apple")) 497 }) 498 It("returns a sensible error", func() { 499 Expect(executeErr).To(MatchError("apple")) 500 }) 501 }) 502 503 When("getting the applications by guids fails", func() { 504 BeforeEach(func() { 505 fakeV3Actor.GetApplicationsByGUIDsReturns([]v3action.Application{}, []string{"GetApplicationsByGUIDsWarning"}, errors.New("banana")) 506 }) 507 508 It("returns a sensible error", func() { 509 Expect(policies).To(Equal([]Policy{})) 510 Expect(warnings).To(ContainElement("GetApplicationsByGUIDsWarning")) 511 Expect(executeErr).To(MatchError("banana")) 512 }) 513 }) 514 515 When("getting the spaces by guids fails", func() { 516 BeforeEach(func() { 517 fakeV3Actor.GetSpacesByGUIDsReturns([]v3action.Space{}, []string{"GetSpacesByGUIDsWarning"}, errors.New("banana")) 518 }) 519 520 It("returns a sensible error", func() { 521 Expect(policies).To(Equal([]Policy{})) 522 Expect(warnings).To(ContainElement("GetSpacesByGUIDsWarning")) 523 Expect(executeErr).To(MatchError("banana")) 524 }) 525 }) 526 }) 527 528 Describe("RemoveNetworkPolicy", func() { 529 BeforeEach(func() { 530 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{ 531 { 532 Source: cfnetv1.PolicySource{ 533 ID: "appAGUID", 534 }, 535 Destination: cfnetv1.PolicyDestination{ 536 ID: "appBGUID", 537 Protocol: "udp", 538 Ports: cfnetv1.Ports{ 539 Start: 123, 540 End: 345, 541 }, 542 }, 543 }, 544 }, nil) 545 }) 546 547 JustBeforeEach(func() { 548 srcSpaceGuid := "spaceA" 549 srcApp := "appA" 550 destSpaceGuid := "spaceB" 551 destApp := "appB" 552 protocol := "udp" 553 startPort := 123 554 endPort := 345 555 warnings, executeErr = actor.RemoveNetworkPolicy(srcSpaceGuid, srcApp, destSpaceGuid, destApp, protocol, startPort, endPort) 556 }) 557 It("removes policies", func() { 558 Expect(warnings).To(ConsistOf("v3ActorWarningA", "v3ActorWarningB")) 559 Expect(executeErr).NotTo(HaveOccurred()) 560 561 Expect(fakeV3Actor.GetApplicationByNameAndSpaceCallCount()).To(Equal(2)) 562 sourceAppName, spaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(0) 563 Expect(sourceAppName).To(Equal("appA")) 564 Expect(spaceGUID).To(Equal("spaceA")) 565 566 destAppName, spaceGUID := fakeV3Actor.GetApplicationByNameAndSpaceArgsForCall(1) 567 Expect(destAppName).To(Equal("appB")) 568 Expect(spaceGUID).To(Equal("spaceB")) 569 570 Expect(fakeNetworkingClient.ListPoliciesCallCount()).To(Equal(1)) 571 572 Expect(fakeNetworkingClient.RemovePoliciesCallCount()).To(Equal(1)) 573 Expect(fakeNetworkingClient.RemovePoliciesArgsForCall(0)).To(Equal([]cfnetv1.Policy{ 574 { 575 Source: cfnetv1.PolicySource{ 576 ID: "appAGUID", 577 }, 578 Destination: cfnetv1.PolicyDestination{ 579 ID: "appBGUID", 580 Protocol: "udp", 581 Ports: cfnetv1.Ports{ 582 Start: 123, 583 End: 345, 584 }, 585 }, 586 }, 587 })) 588 }) 589 590 When("the policy does not exist", func() { 591 BeforeEach(func() { 592 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{}, nil) 593 }) 594 595 It("returns an error", func() { 596 Expect(warnings).To(ConsistOf("v3ActorWarningA", "v3ActorWarningB")) 597 Expect(executeErr).To(MatchError(actionerror.PolicyDoesNotExistError{})) 598 }) 599 }) 600 601 When("getting the source app fails ", func() { 602 BeforeEach(func() { 603 fakeV3Actor.GetApplicationByNameAndSpaceReturns(v3action.Application{}, []string{"v3ActorWarningA"}, errors.New("banana")) 604 }) 605 It("returns a sensible error", func() { 606 Expect(warnings).To(ConsistOf("v3ActorWarningA")) 607 Expect(executeErr).To(MatchError("banana")) 608 }) 609 }) 610 611 When("getting the destination app fails ", func() { 612 BeforeEach(func() { 613 fakeV3Actor.GetApplicationByNameAndSpaceReturnsOnCall(0, v3action.Application{}, []string{"v3ActorWarningA"}, nil) 614 fakeV3Actor.GetApplicationByNameAndSpaceReturnsOnCall(1, v3action.Application{}, []string{"v3ActorWarningB"}, errors.New("banana")) 615 }) 616 617 It("returns a sensible error", func() { 618 Expect(warnings).To(ConsistOf("v3ActorWarningA", "v3ActorWarningB")) 619 Expect(executeErr).To(MatchError("banana")) 620 }) 621 }) 622 623 When("listing policies fails", func() { 624 BeforeEach(func() { 625 fakeNetworkingClient.ListPoliciesReturns([]cfnetv1.Policy{}, errors.New("apple")) 626 }) 627 It("returns a sensible error", func() { 628 Expect(executeErr).To(MatchError("apple")) 629 }) 630 }) 631 632 When("removing the policy fails", func() { 633 BeforeEach(func() { 634 fakeNetworkingClient.RemovePoliciesReturns(errors.New("apple")) 635 }) 636 It("returns a sensible error", func() { 637 Expect(executeErr).To(MatchError("apple")) 638 }) 639 }) 640 }) 641 })