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

     1  package v6_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	"code.cloudfoundry.org/cli/actor/actionerror"
     7  	"code.cloudfoundry.org/cli/actor/v2action"
     8  	"code.cloudfoundry.org/cli/actor/v3action"
     9  	"code.cloudfoundry.org/cli/command/commandfakes"
    10  	. "code.cloudfoundry.org/cli/command/v6"
    11  	"code.cloudfoundry.org/cli/command/v6/v6fakes"
    12  	"code.cloudfoundry.org/cli/util/configv3"
    13  	"code.cloudfoundry.org/cli/util/ui"
    14  	. "github.com/onsi/ginkgo"
    15  	. "github.com/onsi/gomega"
    16  	. "github.com/onsi/gomega/gbytes"
    17  )
    18  
    19  var _ = Describe("space Command", func() {
    20  	var (
    21  		cmd             SpaceCommand
    22  		testUI          *ui.UI
    23  		fakeConfig      *commandfakes.FakeConfig
    24  		fakeSharedActor *commandfakes.FakeSharedActor
    25  		fakeActor       *v6fakes.FakeSpaceActor
    26  		fakeActorV3     *v6fakes.FakeSpaceActorV3
    27  		binaryName      string
    28  		executeErr      error
    29  	)
    30  
    31  	BeforeEach(func() {
    32  		testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
    33  		fakeConfig = new(commandfakes.FakeConfig)
    34  		fakeSharedActor = new(commandfakes.FakeSharedActor)
    35  		fakeActor = new(v6fakes.FakeSpaceActor)
    36  		fakeActorV3 = new(v6fakes.FakeSpaceActorV3)
    37  
    38  		cmd = SpaceCommand{
    39  			UI:          testUI,
    40  			Config:      fakeConfig,
    41  			SharedActor: fakeSharedActor,
    42  			Actor:       fakeActor,
    43  			ActorV3:     fakeActorV3,
    44  		}
    45  
    46  		binaryName = "faceman"
    47  		fakeConfig.BinaryNameReturns(binaryName)
    48  	})
    49  
    50  	JustBeforeEach(func() {
    51  		executeErr = cmd.Execute(nil)
    52  	})
    53  
    54  	When("checking the target fails", func() {
    55  		BeforeEach(func() {
    56  			fakeSharedActor.CheckTargetReturns(
    57  				actionerror.NotLoggedInError{BinaryName: binaryName})
    58  		})
    59  
    60  		It("returns an error", func() {
    61  			Expect(executeErr).To(MatchError(actionerror.NotLoggedInError{BinaryName: binaryName}))
    62  
    63  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
    64  			targetedOrganizationRequired, targetedSpaceRequired := fakeSharedActor.CheckTargetArgsForCall(0)
    65  			Expect(targetedOrganizationRequired).To(Equal(true))
    66  			Expect(targetedSpaceRequired).To(Equal(false))
    67  		})
    68  	})
    69  
    70  	When("the --guid flag is provided", func() {
    71  		BeforeEach(func() {
    72  			cmd.RequiredArgs.Space = "some-space"
    73  			cmd.GUID = true
    74  		})
    75  
    76  		When("no errors occur", func() {
    77  			BeforeEach(func() {
    78  				fakeConfig.TargetedOrganizationReturns(
    79  					configv3.Organization{GUID: "some-org-guid"},
    80  				)
    81  				fakeActor.GetSpaceByOrganizationAndNameReturns(
    82  					v2action.Space{GUID: "some-space-guid"},
    83  					v2action.Warnings{"warning-1", "warning-2"},
    84  					nil)
    85  			})
    86  
    87  			It("displays the space guid and outputs all warnings", func() {
    88  				Expect(executeErr).ToNot(HaveOccurred())
    89  
    90  				Expect(testUI.Out).To(Say("some-space-guid"))
    91  				Expect(testUI.Err).To(Say("warning-1"))
    92  				Expect(testUI.Err).To(Say("warning-2"))
    93  
    94  				Expect(fakeActor.GetSpaceByOrganizationAndNameCallCount()).To(Equal(1))
    95  				orgGUID, spaceName := fakeActor.GetSpaceByOrganizationAndNameArgsForCall(0)
    96  				Expect(orgGUID).To(Equal("some-org-guid"))
    97  				Expect(spaceName).To(Equal("some-space"))
    98  			})
    99  		})
   100  
   101  		When("getting the space returns an error", func() {
   102  			When("the error is translatable", func() {
   103  				BeforeEach(func() {
   104  					fakeActor.GetSpaceByOrganizationAndNameReturns(
   105  						v2action.Space{},
   106  						v2action.Warnings{"warning-1", "warning-2"},
   107  						actionerror.SpaceNotFoundError{Name: "some-space"})
   108  				})
   109  
   110  				It("returns a translatable error and outputs all warnings", func() {
   111  					Expect(executeErr).To(MatchError(actionerror.SpaceNotFoundError{Name: "some-space"}))
   112  
   113  					Expect(testUI.Err).To(Say("warning-1"))
   114  					Expect(testUI.Err).To(Say("warning-2"))
   115  				})
   116  			})
   117  
   118  			When("the error is not translatable", func() {
   119  				var expectedErr error
   120  
   121  				BeforeEach(func() {
   122  					expectedErr = errors.New("get space error")
   123  					fakeActor.GetSpaceByOrganizationAndNameReturns(
   124  						v2action.Space{},
   125  						v2action.Warnings{"warning-1", "warning-2"},
   126  						expectedErr)
   127  				})
   128  
   129  				It("returns the error and all warnings", func() {
   130  					Expect(executeErr).To(MatchError(expectedErr))
   131  
   132  					Expect(testUI.Err).To(Say("warning-1"))
   133  					Expect(testUI.Err).To(Say("warning-2"))
   134  				})
   135  			})
   136  		})
   137  	})
   138  
   139  	When("the --guid flag is not provided", func() {
   140  		When("no errors occur", func() {
   141  			BeforeEach(func() {
   142  				fakeConfig.CurrentUserReturns(
   143  					configv3.User{
   144  						Name: "some-user",
   145  					},
   146  					nil)
   147  
   148  				cmd.RequiredArgs.Space = "some-space"
   149  
   150  				fakeConfig.TargetedOrganizationReturns(
   151  					configv3.Organization{
   152  						GUID: "some-org-guid",
   153  						Name: "some-org",
   154  					},
   155  				)
   156  
   157  				fakeActor.GetSpaceSummaryByOrganizationAndNameReturns(
   158  					v2action.SpaceSummary{
   159  						Space: v2action.Space{
   160  							Name: "some-space",
   161  							GUID: "some-space-guid",
   162  						},
   163  						OrgName:                        "some-org",
   164  						OrgDefaultIsolationSegmentGUID: "some-org-default-isolation-segment-guid",
   165  						AppNames:                       []string{"app1", "app2", "app3"},
   166  						ServiceInstanceNames:           []string{"service1", "service2", "service3"},
   167  						SpaceQuotaName:                 "some-space-quota",
   168  						RunningSecurityGroupNames:      []string{"public_networks", "dns", "load_balancer"},
   169  						StagingSecurityGroupNames:      []string{"staging-sec-1", "staging-sec-2"},
   170  					},
   171  					v2action.Warnings{"warning-1", "warning-2"},
   172  					nil,
   173  				)
   174  			})
   175  
   176  			When("there is no v3 API", func() {
   177  				BeforeEach(func() {
   178  					cmd.ActorV3 = nil
   179  				})
   180  
   181  				It("displays the space summary with no isolation segment row", func() {
   182  					Expect(executeErr).To(BeNil())
   183  					Expect(testUI.Out).ToNot(Say("isolation segment:"))
   184  				})
   185  			})
   186  
   187  			When("there is a v3 API", func() {
   188  				When("retrieving the data is successful", func() {
   189  					BeforeEach(func() {
   190  						fakeActorV3.GetEffectiveIsolationSegmentBySpaceReturns(
   191  							v3action.IsolationSegment{
   192  								Name: "some-isolation-segment",
   193  							},
   194  							v3action.Warnings{"v3-warning-1", "v3-warning-2"},
   195  							nil,
   196  						)
   197  					})
   198  
   199  					It("displays warnings and a table with space name, org, apps, services, isolation segment, space quota and security groups", func() {
   200  						Expect(executeErr).To(BeNil())
   201  
   202  						Expect(testUI.Out).To(Say(`Getting info for space some-space in org some-org as some-user\.\.\.`))
   203  						Expect(testUI.Out).To(Say(`name:\s+some-space`))
   204  						Expect(testUI.Out).To(Say(`org:\s+some-org`))
   205  						Expect(testUI.Out).To(Say(`apps:\s+app1, app2, app3`))
   206  						Expect(testUI.Out).To(Say(`services:\s+service1, service2, service3`))
   207  						Expect(testUI.Out).To(Say(`isolation segment:\s+some-isolation-segment`))
   208  						Expect(testUI.Out).To(Say(`space quota:\s+some-space-quota`))
   209  						Expect(testUI.Out).To(Say(`running security groups:\s+public_networks, dns, load_balancer`))
   210  						Expect(testUI.Out).To(Say(`staging security groups:\s+staging-sec-1, staging-sec-2`))
   211  
   212  						Expect(testUI.Err).To(Say("warning-1"))
   213  						Expect(testUI.Err).To(Say("warning-2"))
   214  						Expect(testUI.Err).To(Say("v3-warning-1"))
   215  						Expect(testUI.Err).To(Say("v3-warning-2"))
   216  
   217  						Expect(fakeConfig.CurrentUserCallCount()).To(Equal(1))
   218  						Expect(fakeActor.GetSpaceSummaryByOrganizationAndNameCallCount()).To(Equal(1))
   219  						orgGUID, spaceName := fakeActor.GetSpaceSummaryByOrganizationAndNameArgsForCall(0)
   220  						Expect(orgGUID).To(Equal("some-org-guid"))
   221  						Expect(spaceName).To(Equal("some-space"))
   222  						Expect(fakeActorV3.GetEffectiveIsolationSegmentBySpaceCallCount()).To(Equal(1))
   223  						spaceGUID, orgDefaultIsolationSegmentGUID := fakeActorV3.GetEffectiveIsolationSegmentBySpaceArgsForCall(0)
   224  						Expect(spaceGUID).To(Equal("some-space-guid"))
   225  						Expect(orgDefaultIsolationSegmentGUID).To(Equal("some-org-default-isolation-segment-guid"))
   226  					})
   227  				})
   228  
   229  				When("getting the isolation segment returns an error", func() {
   230  					Context("a generic error", func() {
   231  						var expectedErr error
   232  
   233  						BeforeEach(func() {
   234  							expectedErr = errors.New("get isolation segment error")
   235  							fakeActorV3.GetEffectiveIsolationSegmentBySpaceReturns(
   236  								v3action.IsolationSegment{},
   237  								v3action.Warnings{"v3-warning-1", "v3-warning-2"},
   238  								expectedErr)
   239  						})
   240  
   241  						It("returns the error and all warnings", func() {
   242  							Expect(executeErr).To(MatchError(expectedErr))
   243  
   244  							Expect(testUI.Err).To(Say("v3-warning-1"))
   245  							Expect(testUI.Err).To(Say("v3-warning-2"))
   246  						})
   247  					})
   248  
   249  					Context("a NoRelationshipError", func() {
   250  						BeforeEach(func() {
   251  							fakeActorV3.GetEffectiveIsolationSegmentBySpaceReturns(
   252  								v3action.IsolationSegment{},
   253  								v3action.Warnings{"v3-warning-1", "v3-warning-2"},
   254  								actionerror.NoRelationshipError{})
   255  						})
   256  
   257  						It("does not fill in the isolation segment", func() {
   258  							Expect(executeErr).ToNot(HaveOccurred())
   259  							Expect(testUI.Out).To(Say(`(?m)isolation segment:\s*$`))
   260  						})
   261  					})
   262  				})
   263  			})
   264  		})
   265  	})
   266  
   267  	When("getting the current user returns an error", func() {
   268  		var expectedErr error
   269  
   270  		BeforeEach(func() {
   271  			expectedErr = errors.New("getting current user error")
   272  			fakeConfig.CurrentUserReturns(
   273  				configv3.User{},
   274  				expectedErr)
   275  		})
   276  
   277  		It("returns the error", func() {
   278  			Expect(executeErr).To(MatchError(expectedErr))
   279  		})
   280  	})
   281  
   282  	When("getting the space summary returns an error", func() {
   283  		When("the error is translatable", func() {
   284  			BeforeEach(func() {
   285  				fakeActor.GetSpaceSummaryByOrganizationAndNameReturns(
   286  					v2action.SpaceSummary{},
   287  					v2action.Warnings{"warning-1", "warning-2"},
   288  					actionerror.SpaceNotFoundError{Name: "some-space"})
   289  			})
   290  
   291  			It("returns a translatable error and outputs all warnings", func() {
   292  				Expect(executeErr).To(MatchError(actionerror.SpaceNotFoundError{Name: "some-space"}))
   293  
   294  				Expect(testUI.Err).To(Say("warning-1"))
   295  				Expect(testUI.Err).To(Say("warning-2"))
   296  			})
   297  		})
   298  
   299  		When("the error is not translatable", func() {
   300  			var expectedErr error
   301  
   302  			BeforeEach(func() {
   303  				expectedErr = errors.New("get space summary error")
   304  				fakeActor.GetSpaceSummaryByOrganizationAndNameReturns(
   305  					v2action.SpaceSummary{},
   306  					v2action.Warnings{"warning-1", "warning-2"},
   307  					expectedErr)
   308  			})
   309  
   310  			It("returns the error and all warnings", func() {
   311  				Expect(executeErr).To(MatchError(expectedErr))
   312  
   313  				Expect(testUI.Err).To(Say("warning-1"))
   314  				Expect(testUI.Err).To(Say("warning-2"))
   315  			})
   316  		})
   317  	})
   318  
   319  	When("the --security-group-rules flag is provided", func() {
   320  		BeforeEach(func() {
   321  			fakeConfig.CurrentUserReturns(
   322  				configv3.User{
   323  					Name: "some-user",
   324  				},
   325  				nil)
   326  
   327  			cmd.RequiredArgs.Space = "some-space"
   328  			cmd.SecurityGroupRules = true
   329  
   330  			fakeConfig.TargetedOrganizationReturns(
   331  				configv3.Organization{
   332  					GUID: "some-org-guid",
   333  					Name: "some-org",
   334  				},
   335  			)
   336  
   337  			fakeActor.GetSpaceSummaryByOrganizationAndNameReturns(
   338  				v2action.SpaceSummary{
   339  					Space: v2action.Space{
   340  						Name: "some-space",
   341  					},
   342  					OrgName:                   "some-org",
   343  					AppNames:                  []string{"app1", "app2", "app3"},
   344  					ServiceInstanceNames:      []string{"service1", "service2", "service3"},
   345  					SpaceQuotaName:            "some-space-quota",
   346  					RunningSecurityGroupNames: []string{"public_networks", "dns", "load_balancer"},
   347  					StagingSecurityGroupNames: []string{"staging-sec-1", "staging-sec-2"},
   348  					SecurityGroupRules: []v2action.SecurityGroupRule{
   349  						{
   350  							Description: "Public networks",
   351  							Destination: "0.0.0.0-9.255.255.255",
   352  							Lifecycle:   "staging",
   353  							Name:        "public_networks",
   354  							Ports:       "12345",
   355  							Protocol:    "tcp",
   356  						},
   357  						{
   358  							Description: "Public networks",
   359  							Destination: "0.0.0.0-9.255.255.255",
   360  							Lifecycle:   "running",
   361  							Name:        "public_networks",
   362  							Ports:       "12345",
   363  							Protocol:    "tcp",
   364  						},
   365  						{
   366  							Description: "More public networks",
   367  							Destination: "11.0.0.0-169.253.255.255",
   368  							Lifecycle:   "staging",
   369  							Name:        "more_public_networks",
   370  							Ports:       "54321",
   371  							Protocol:    "udp",
   372  						},
   373  						{
   374  							Description: "More public networks",
   375  							Destination: "11.0.0.0-169.253.255.255",
   376  							Lifecycle:   "running",
   377  							Name:        "more_public_networks",
   378  							Ports:       "54321",
   379  							Protocol:    "udp",
   380  						},
   381  					},
   382  				},
   383  				v2action.Warnings{"warning-1", "warning-2"},
   384  				nil,
   385  			)
   386  		})
   387  
   388  		It("displays warnings and security group rules", func() {
   389  			Expect(executeErr).To(BeNil())
   390  
   391  			orgGUID, spaceName := fakeActor.GetSpaceSummaryByOrganizationAndNameArgsForCall(0)
   392  			Expect(orgGUID).To(Equal("some-org-guid"))
   393  			Expect(spaceName).To(Equal("some-space"))
   394  
   395  			Expect(testUI.Out).To(Say(`name:\s+some-space`))
   396  			Expect(testUI.Out).To(Say(`running security groups:\s+public_networks, dns, load_balancer`))
   397  			Expect(testUI.Out).To(Say(`staging security groups:\s+staging-sec-1, staging-sec-2`))
   398  			Expect(testUI.Out).To(Say(`(?m)^\n^\s+security group\s+destination\s+ports\s+protocol\s+lifecycle\s+description$`))
   399  			Expect(testUI.Out).To(Say(`#0\s+public_networks\s+0.0.0.0-9.255.255.255\s+12345\s+tcp\s+staging\s+Public networks`))
   400  			Expect(testUI.Out).To(Say(`(?m)^\s+public_networks\s+0.0.0.0-9.255.255.255\s+12345\s+tcp\s+running\s+Public networks`))
   401  			Expect(testUI.Out).To(Say(`#1\s+more_public_networks\s+11.0.0.0-169.253.255.255\s+54321\s+udp\s+staging\s+More public networks`))
   402  			Expect(testUI.Out).To(Say(`(?m)\s+more_public_networks\s+11.0.0.0-169.253.255.255\s+54321\s+udp\s+running\s+More public networks`))
   403  		})
   404  	})
   405  })