github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/command/v2/org_command_test.go (about)

     1  package v2_test
     2  
     3  import (
     4  	"errors"
     5  	"time"
     6  
     7  	"github.com/liamawhite/cli-with-i18n/actor/sharedaction"
     8  	"github.com/liamawhite/cli-with-i18n/actor/v2action"
     9  	"github.com/liamawhite/cli-with-i18n/actor/v3action"
    10  	"github.com/liamawhite/cli-with-i18n/command/commandfakes"
    11  	"github.com/liamawhite/cli-with-i18n/command/translatableerror"
    12  	. "github.com/liamawhite/cli-with-i18n/command/v2"
    13  	"github.com/liamawhite/cli-with-i18n/command/v2/v2fakes"
    14  	"github.com/liamawhite/cli-with-i18n/util/configv3"
    15  	"github.com/liamawhite/cli-with-i18n/util/ui"
    16  	. "github.com/onsi/ginkgo"
    17  	. "github.com/onsi/gomega"
    18  	. "github.com/onsi/gomega/gbytes"
    19  )
    20  
    21  var _ = Describe("org Command", func() {
    22  	var (
    23  		cmd             OrgCommand
    24  		testUI          *ui.UI
    25  		fakeConfig      *commandfakes.FakeConfig
    26  		fakeSharedActor *commandfakes.FakeSharedActor
    27  		fakeActor       *v2fakes.FakeOrgActor
    28  		fakeActorV3     *v2fakes.FakeOrgActorV3
    29  		binaryName      string
    30  		executeErr      error
    31  	)
    32  
    33  	BeforeEach(func() {
    34  		testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
    35  		fakeConfig = new(commandfakes.FakeConfig)
    36  		fakeSharedActor = new(commandfakes.FakeSharedActor)
    37  		fakeActor = new(v2fakes.FakeOrgActor)
    38  		fakeActorV3 = new(v2fakes.FakeOrgActorV3)
    39  
    40  		cmd = OrgCommand{
    41  			UI:          testUI,
    42  			Config:      fakeConfig,
    43  			SharedActor: fakeSharedActor,
    44  			Actor:       fakeActor,
    45  			ActorV3:     fakeActorV3,
    46  		}
    47  
    48  		binaryName = "faceman"
    49  		fakeConfig.BinaryNameReturns(binaryName)
    50  		cmd.RequiredArgs.Organization = "some-org"
    51  		fakeActorV3.CloudControllerAPIVersionReturns("3.12.0")
    52  	})
    53  
    54  	JustBeforeEach(func() {
    55  		executeErr = cmd.Execute(nil)
    56  	})
    57  
    58  	Context("when it's been six months from April 2017", func() {
    59  		It("should stop calling CloudControllerAPIVersion() in: org, space, target, create-isolation-segment, delete-isolation-segment, disable-org-isolation, enable-org-isolation, isolation-segments, set-space-isolation, run-task, tasks, terminate-task", func() {
    60  			Expect(time.Now()).Should(BeTemporally("<", time.Date(2017, 10, 7, 0, 0, 0, 0, new(time.Location))))
    61  		})
    62  	})
    63  
    64  	Context("when checking the target fails", func() {
    65  		BeforeEach(func() {
    66  			fakeSharedActor.CheckTargetReturns(
    67  				sharedaction.NotLoggedInError{BinaryName: binaryName})
    68  		})
    69  
    70  		It("returns an error", func() {
    71  			Expect(executeErr).To(MatchError(translatableerror.NotLoggedInError{BinaryName: binaryName}))
    72  
    73  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
    74  			config, targetedOrganizationRequired, targetedSpaceRequired := fakeSharedActor.CheckTargetArgsForCall(0)
    75  			Expect(config).To(Equal(fakeConfig))
    76  			Expect(targetedOrganizationRequired).To(Equal(false))
    77  			Expect(targetedSpaceRequired).To(Equal(false))
    78  		})
    79  	})
    80  
    81  	Context("when the --guid flag is provided", func() {
    82  		BeforeEach(func() {
    83  			cmd.GUID = true
    84  		})
    85  
    86  		Context("when no errors occur", func() {
    87  			BeforeEach(func() {
    88  				fakeActor.GetOrganizationByNameReturns(
    89  					v2action.Organization{GUID: "some-org-guid"},
    90  					v2action.Warnings{"warning-1", "warning-2"},
    91  					nil)
    92  			})
    93  
    94  			It("displays the org guid and outputs all warnings", func() {
    95  				Expect(executeErr).ToNot(HaveOccurred())
    96  
    97  				Expect(testUI.Out).To(Say("some-org-guid"))
    98  				Expect(testUI.Err).To(Say("warning-1"))
    99  				Expect(testUI.Err).To(Say("warning-2"))
   100  
   101  				Expect(fakeActor.GetOrganizationByNameCallCount()).To(Equal(1))
   102  				orgName := fakeActor.GetOrganizationByNameArgsForCall(0)
   103  				Expect(orgName).To(Equal("some-org"))
   104  			})
   105  		})
   106  
   107  		Context("when getting the org returns an error", func() {
   108  			Context("when the error is translatable", func() {
   109  				BeforeEach(func() {
   110  					fakeActor.GetOrganizationByNameReturns(
   111  						v2action.Organization{},
   112  						v2action.Warnings{"warning-1", "warning-2"},
   113  						v2action.OrganizationNotFoundError{Name: "some-org"})
   114  				})
   115  
   116  				It("returns a translatable error and outputs all warnings", func() {
   117  					Expect(executeErr).To(MatchError(translatableerror.OrganizationNotFoundError{Name: "some-org"}))
   118  
   119  					Expect(testUI.Err).To(Say("warning-1"))
   120  					Expect(testUI.Err).To(Say("warning-2"))
   121  				})
   122  			})
   123  
   124  			Context("when the error is not translatable", func() {
   125  				var expectedErr error
   126  
   127  				BeforeEach(func() {
   128  					expectedErr = errors.New("get org error")
   129  					fakeActor.GetOrganizationByNameReturns(
   130  						v2action.Organization{},
   131  						v2action.Warnings{"warning-1", "warning-2"},
   132  						expectedErr)
   133  				})
   134  
   135  				It("returns the error and all warnings", func() {
   136  					Expect(executeErr).To(MatchError(expectedErr))
   137  
   138  					Expect(testUI.Err).To(Say("warning-1"))
   139  					Expect(testUI.Err).To(Say("warning-2"))
   140  				})
   141  			})
   142  		})
   143  	})
   144  
   145  	Context("when the --guid flag is not provided", func() {
   146  		Context("when no errors occur", func() {
   147  			BeforeEach(func() {
   148  				fakeConfig.CurrentUserReturns(
   149  					configv3.User{
   150  						Name: "some-user",
   151  					},
   152  					nil)
   153  
   154  				fakeActor.GetOrganizationSummaryByNameReturns(
   155  					v2action.OrganizationSummary{
   156  						Organization: v2action.Organization{
   157  							Name: "some-org",
   158  							GUID: "some-org-guid",
   159  							DefaultIsolationSegmentGUID: "default-isolation-segment-guid",
   160  						},
   161  						DomainNames: []string{
   162  							"a-shared.com",
   163  							"b-private.com",
   164  							"c-shared.com",
   165  							"d-private.com",
   166  						},
   167  						QuotaName: "some-quota",
   168  						SpaceNames: []string{
   169  							"space1",
   170  							"space2",
   171  						},
   172  					},
   173  					v2action.Warnings{"warning-1", "warning-2"},
   174  					nil)
   175  			})
   176  
   177  			Context("when the v3 actor is nil", func() {
   178  				BeforeEach(func() {
   179  					cmd.ActorV3 = nil
   180  				})
   181  				It("displays the org summary with no isolation segment row", func() {
   182  					Expect(executeErr).To(BeNil())
   183  					Expect(testUI.Out).ToNot(Say("isolation segments:"))
   184  				})
   185  			})
   186  
   187  			Context("when api version is above 3.11.0", func() {
   188  				BeforeEach(func() {
   189  					fakeActorV3.GetIsolationSegmentsByOrganizationReturns(
   190  						[]v3action.IsolationSegment{
   191  							{
   192  								Name: "isolation-segment-1",
   193  								GUID: "default-isolation-segment-guid",
   194  							}, {
   195  								Name: "isolation-segment-2",
   196  								GUID: "some-other-isolation-segment-guid",
   197  							},
   198  						},
   199  						v3action.Warnings{"warning-3", "warning-4"},
   200  						nil)
   201  					fakeActorV3.CloudControllerAPIVersionReturns("3.12.0")
   202  				})
   203  
   204  				It("displays warnings and a table with org domains, org quota, spaces and isolation segments", func() {
   205  					Expect(executeErr).To(BeNil())
   206  
   207  					Expect(testUI.Out).To(Say("Getting info for org %s as some-user\\.\\.\\.", cmd.RequiredArgs.Organization))
   208  					Expect(testUI.Err).To(Say("warning-1"))
   209  					Expect(testUI.Err).To(Say("warning-2"))
   210  					Expect(testUI.Err).To(Say("warning-3"))
   211  					Expect(testUI.Err).To(Say("warning-4"))
   212  
   213  					Expect(testUI.Out).To(Say("name:\\s+%s", cmd.RequiredArgs.Organization))
   214  					Expect(testUI.Out).To(Say("domains:\\s+a-shared.com, b-private.com, c-shared.com, d-private.com"))
   215  					Expect(testUI.Out).To(Say("quota:\\s+some-quota"))
   216  					Expect(testUI.Out).To(Say("spaces:\\s+space1, space2"))
   217  					Expect(testUI.Out).To(Say("isolation segments:\\s+isolation-segment-1 \\(default\\), isolation-segment-2"))
   218  
   219  					Expect(fakeConfig.CurrentUserCallCount()).To(Equal(1))
   220  
   221  					Expect(fakeActor.GetOrganizationSummaryByNameCallCount()).To(Equal(1))
   222  					orgName := fakeActor.GetOrganizationSummaryByNameArgsForCall(0)
   223  					Expect(orgName).To(Equal("some-org"))
   224  
   225  					Expect(fakeActorV3.GetIsolationSegmentsByOrganizationCallCount()).To(Equal(1))
   226  					orgGuid := fakeActorV3.GetIsolationSegmentsByOrganizationArgsForCall(0)
   227  					Expect(orgGuid).To(Equal("some-org-guid"))
   228  				})
   229  			})
   230  
   231  			Context("when api version is below 3.11.0", func() {
   232  				BeforeEach(func() {
   233  					fakeActorV3.CloudControllerAPIVersionReturns("3.10.0")
   234  				})
   235  
   236  				It("displays warnings and a table with org domains, org quota, spaces and isolation segments", func() {
   237  					Expect(executeErr).To(BeNil())
   238  
   239  					Expect(testUI.Out).To(Say("Getting info for org %s as some-user\\.\\.\\.", cmd.RequiredArgs.Organization))
   240  					Expect(testUI.Err).To(Say("warning-1"))
   241  					Expect(testUI.Err).To(Say("warning-2"))
   242  
   243  					Expect(testUI.Out).To(Say("name:\\s+%s", cmd.RequiredArgs.Organization))
   244  					Expect(testUI.Out).To(Say("domains:\\s+a-shared.com, b-private.com, c-shared.com, d-private.com"))
   245  					Expect(testUI.Out).To(Say("quota:\\s+some-quota"))
   246  					Expect(testUI.Out).To(Say("spaces:\\s+space1, space2"))
   247  					Expect(testUI.Out).ToNot(Say("isolation segments:"))
   248  
   249  					Expect(fakeConfig.CurrentUserCallCount()).To(Equal(1))
   250  
   251  					Expect(fakeActor.GetOrganizationSummaryByNameCallCount()).To(Equal(1))
   252  					orgName := fakeActor.GetOrganizationSummaryByNameArgsForCall(0)
   253  					Expect(orgName).To(Equal("some-org"))
   254  				})
   255  			})
   256  		})
   257  
   258  		Context("when getting the current user returns an error", func() {
   259  			var expectedErr error
   260  
   261  			BeforeEach(func() {
   262  				expectedErr = errors.New("getting current user error")
   263  				fakeConfig.CurrentUserReturns(
   264  					configv3.User{},
   265  					expectedErr)
   266  			})
   267  
   268  			It("returns the error", func() {
   269  				Expect(executeErr).To(MatchError(expectedErr))
   270  			})
   271  		})
   272  
   273  		Context("when getting the org summary returns an error", func() {
   274  			Context("when the error is translatable", func() {
   275  				BeforeEach(func() {
   276  					fakeActor.GetOrganizationSummaryByNameReturns(
   277  						v2action.OrganizationSummary{},
   278  						v2action.Warnings{"warning-1", "warning-2"},
   279  						v2action.OrganizationNotFoundError{Name: "some-org"})
   280  				})
   281  
   282  				It("returns a translatable error and outputs all warnings", func() {
   283  					Expect(executeErr).To(MatchError(translatableerror.OrganizationNotFoundError{Name: "some-org"}))
   284  
   285  					Expect(testUI.Err).To(Say("warning-1"))
   286  					Expect(testUI.Err).To(Say("warning-2"))
   287  				})
   288  			})
   289  
   290  			Context("when the error is not translatable", func() {
   291  				var expectedErr error
   292  
   293  				BeforeEach(func() {
   294  					expectedErr = errors.New("get org error")
   295  					fakeActor.GetOrganizationSummaryByNameReturns(
   296  						v2action.OrganizationSummary{},
   297  						v2action.Warnings{"warning-1", "warning-2"},
   298  						expectedErr)
   299  				})
   300  
   301  				It("returns the error and all warnings", func() {
   302  					Expect(executeErr).To(MatchError(expectedErr))
   303  
   304  					Expect(testUI.Err).To(Say("warning-1"))
   305  					Expect(testUI.Err).To(Say("warning-2"))
   306  				})
   307  			})
   308  		})
   309  
   310  		Context("when getting the org isolation segments returns an error", func() {
   311  			var expectedErr error
   312  
   313  			BeforeEach(func() {
   314  				expectedErr = errors.New("get org iso segs error")
   315  				fakeActorV3.GetIsolationSegmentsByOrganizationReturns(
   316  					nil,
   317  					v3action.Warnings{"get iso seg warning"},
   318  					expectedErr)
   319  			})
   320  
   321  			It("returns the error and all warnings", func() {
   322  				Expect(executeErr).To(MatchError(expectedErr))
   323  				Expect(testUI.Err).To(Say("get iso seg warning"))
   324  			})
   325  		})
   326  	})
   327  })