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

     1  package v7_test
     2  
     3  import (
     4  	"errors"
     5  	"regexp"
     6  	"strings"
     7  
     8  	"code.cloudfoundry.org/cli/actor/v7action"
     9  	"code.cloudfoundry.org/cli/command/commandfakes"
    10  	"code.cloudfoundry.org/cli/command/flag"
    11  	"code.cloudfoundry.org/cli/command/translatableerror"
    12  	. "code.cloudfoundry.org/cli/command/v7"
    13  	"code.cloudfoundry.org/cli/command/v7/v7fakes"
    14  	"code.cloudfoundry.org/cli/types"
    15  	"code.cloudfoundry.org/cli/util/configv3"
    16  	"code.cloudfoundry.org/cli/util/ui"
    17  	uuid "github.com/nu7hatch/gouuid"
    18  	. "github.com/onsi/ginkgo"
    19  	. "github.com/onsi/ginkgo/extensions/table"
    20  	. "github.com/onsi/gomega"
    21  	. "github.com/onsi/gomega/gbytes"
    22  )
    23  
    24  var _ = Describe("set-label command", func() {
    25  	var (
    26  		cmd             SetLabelCommand
    27  		resourceName    string
    28  		fakeActor       *v7fakes.FakeSetLabelActor
    29  		fakeConfig      *commandfakes.FakeConfig
    30  		fakeSharedActor *commandfakes.FakeSharedActor
    31  		testUI          *ui.UI
    32  
    33  		executeErr error
    34  	)
    35  
    36  	Context("shared validations", func() {
    37  		BeforeEach(func() {
    38  			testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
    39  			fakeActor = new(v7fakes.FakeSetLabelActor)
    40  			fakeConfig = new(commandfakes.FakeConfig)
    41  			fakeSharedActor = new(commandfakes.FakeSharedActor)
    42  			cmd = SetLabelCommand{
    43  				Actor:       fakeActor,
    44  				UI:          testUI,
    45  				Config:      fakeConfig,
    46  				SharedActor: fakeSharedActor,
    47  			}
    48  		})
    49  
    50  		DescribeTable(
    51  			"Combination of --stack with resource type",
    52  			func(resourceType string) {
    53  				cmd.BuildpackStack = "cflinuxfs3"
    54  				cmd.RequiredArgs = flag.SetLabelArgs{
    55  					ResourceType: resourceType,
    56  				}
    57  
    58  				err := cmd.Execute(nil)
    59  
    60  				argumentCombinationError := translatableerror.ArgumentCombinationError{
    61  					Args: []string{strings.ToLower(resourceType), "--stack, -s"},
    62  				}
    63  				Expect(err).To(MatchError(argumentCombinationError))
    64  			},
    65  			Entry("app", "app"),
    66  			Entry("domains", "domain"),
    67  			Entry("orgs", "org"),
    68  			Entry("routes", "route"),
    69  			Entry("spaces", "space"),
    70  			Entry("stacks", "stack"),
    71  			Entry("service brokers", "service-broker"),
    72  		)
    73  
    74  		When("some provided labels do not have a value part", func() {
    75  			BeforeEach(func() {
    76  				cmd.RequiredArgs = flag.SetLabelArgs{
    77  					ResourceType: "anything",
    78  					ResourceName: resourceName,
    79  					Labels:       []string{"FOO=BAR", "MISSING_EQUALS", "ENV=FAKE"},
    80  				}
    81  			})
    82  
    83  			It("complains about the missing equal sign", func() {
    84  				err := cmd.Execute(nil)
    85  				Expect(err).To(MatchError("Metadata error: no value provided for label 'MISSING_EQUALS'"))
    86  				Expect(err).To(HaveOccurred())
    87  			})
    88  		})
    89  
    90  		When("fetching the current user's name fails", func() {
    91  			BeforeEach(func() {
    92  				cmd.RequiredArgs = flag.SetLabelArgs{
    93  					ResourceType: "anything",
    94  					ResourceName: resourceName,
    95  				}
    96  				fakeConfig.CurrentUserNameReturns("some-user", errors.New("boom"))
    97  			})
    98  
    99  			It("returns an error", func() {
   100  				err := cmd.Execute(nil)
   101  				Expect(err).To(MatchError("boom"))
   102  			})
   103  		})
   104  	})
   105  
   106  	When("setting labels on apps", func() {
   107  
   108  		BeforeEach(func() {
   109  			testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
   110  			fakeActor = new(v7fakes.FakeSetLabelActor)
   111  			fakeConfig = new(commandfakes.FakeConfig)
   112  			fakeSharedActor = new(commandfakes.FakeSharedActor)
   113  			cmd = SetLabelCommand{
   114  				Actor:       fakeActor,
   115  				UI:          testUI,
   116  				Config:      fakeConfig,
   117  				SharedActor: fakeSharedActor,
   118  			}
   119  			cmd.RequiredArgs = flag.SetLabelArgs{
   120  				ResourceType: "app",
   121  			}
   122  		})
   123  
   124  		JustBeforeEach(func() {
   125  			executeErr = cmd.Execute(nil)
   126  		})
   127  
   128  		It("doesn't error", func() {
   129  			Expect(executeErr).ToNot(HaveOccurred())
   130  		})
   131  
   132  		It("checks that the user is logged in and targeted to an org and space", func() {
   133  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
   134  			checkOrg, checkSpace := fakeSharedActor.CheckTargetArgsForCall(0)
   135  			Expect(checkOrg).To(BeTrue())
   136  			Expect(checkSpace).To(BeTrue())
   137  		})
   138  
   139  		When("checking target succeeds", func() {
   140  			BeforeEach(func() {
   141  				fakeSharedActor.CheckTargetReturns(nil)
   142  			})
   143  
   144  			When("fetching current user's name succeeds", func() {
   145  				BeforeEach(func() {
   146  					fakeConfig.CurrentUserNameReturns("some-user", nil)
   147  					fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "fake-org"})
   148  					fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "fake-space", GUID: "some-space-guid"})
   149  
   150  					u, err := uuid.NewV4()
   151  					Expect(err).NotTo(HaveOccurred())
   152  					resourceName = u.String()
   153  				})
   154  
   155  				When("all the provided labels are valid", func() {
   156  					BeforeEach(func() {
   157  						cmd.RequiredArgs = flag.SetLabelArgs{
   158  							ResourceType: "app",
   159  							ResourceName: resourceName,
   160  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   161  						}
   162  						fakeActor.UpdateApplicationLabelsByApplicationNameReturns(
   163  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   164  							nil,
   165  						)
   166  					})
   167  
   168  					When("updating the application labels succeeds", func() {
   169  						It("sets the provided labels on the app", func() {
   170  							name, spaceGUID, labels := fakeActor.UpdateApplicationLabelsByApplicationNameArgsForCall(0)
   171  							Expect(name).To(Equal(resourceName), "failed to pass app name")
   172  							Expect(spaceGUID).To(Equal("some-space-guid"))
   173  							Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
   174  								"FOO": types.NewNullString("BAR"),
   175  								"ENV": types.NewNullString("FAKE"),
   176  							}))
   177  						})
   178  
   179  						It("displays a message", func() {
   180  							Expect(executeErr).ToNot(HaveOccurred())
   181  
   182  							Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
   183  
   184  							Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for app %s in org fake-org / space fake-space as some-user...`), resourceName))
   185  							Expect(testUI.Out).To(Say("OK"))
   186  						})
   187  
   188  						It("prints all warnings", func() {
   189  							Expect(testUI.Err).To(Say("some-warning-1"))
   190  							Expect(testUI.Err).To(Say("some-warning-2"))
   191  						})
   192  					})
   193  				})
   194  
   195  				When("updating the application labels fail", func() {
   196  					BeforeEach(func() {
   197  						cmd.RequiredArgs = flag.SetLabelArgs{
   198  							ResourceType: "app",
   199  							ResourceName: resourceName,
   200  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   201  						}
   202  						fakeActor.UpdateApplicationLabelsByApplicationNameReturns(
   203  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   204  							errors.New("some-updating-error"),
   205  						)
   206  					})
   207  					It("displays warnings and an error message", func() {
   208  						Expect(testUI.Err).To(Say("some-warning-1"))
   209  						Expect(testUI.Err).To(Say("some-warning-2"))
   210  						Expect(executeErr).To(HaveOccurred())
   211  						Expect(executeErr).To(MatchError("some-updating-error"))
   212  					})
   213  				})
   214  
   215  				When("some provided labels do not have a value part", func() {
   216  					BeforeEach(func() {
   217  						cmd.RequiredArgs = flag.SetLabelArgs{
   218  							ResourceType: "app",
   219  							ResourceName: resourceName,
   220  							Labels:       []string{"FOO=BAR", "MISSING_EQUALS", "ENV=FAKE"},
   221  						}
   222  					})
   223  
   224  					It("complains about the missing equal sign", func() {
   225  						Expect(executeErr).To(MatchError("Metadata error: no value provided for label 'MISSING_EQUALS'"))
   226  					})
   227  				})
   228  
   229  				When("when the --stack flag is specified", func() {
   230  					BeforeEach(func() {
   231  						cmd.RequiredArgs = flag.SetLabelArgs{
   232  							ResourceType: "app",
   233  							ResourceName: resourceName,
   234  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   235  						}
   236  						cmd.BuildpackStack = "im-a-stack"
   237  					})
   238  
   239  					It("complains about the --stack flag being present", func() {
   240  						Expect(executeErr).To(MatchError(translatableerror.ArgumentCombinationError{Args: []string{"app", "--stack, -s"}}))
   241  					})
   242  				})
   243  
   244  				When("the resource type argument is not lowercase", func() {
   245  					BeforeEach(func() {
   246  						cmd.RequiredArgs = flag.SetLabelArgs{
   247  							ResourceType: "ApP",
   248  							ResourceName: resourceName,
   249  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   250  						}
   251  						fakeActor.UpdateApplicationLabelsByApplicationNameReturns(
   252  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   253  							nil,
   254  						)
   255  					})
   256  
   257  					It("sets the provided labels on the app", func() {
   258  						name, spaceGUID, labels := fakeActor.UpdateApplicationLabelsByApplicationNameArgsForCall(0)
   259  						Expect(name).To(Equal(resourceName), "failed to pass app name")
   260  						Expect(spaceGUID).To(Equal("some-space-guid"))
   261  						Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
   262  							"FOO": types.NewNullString("BAR"),
   263  							"ENV": types.NewNullString("FAKE"),
   264  						}))
   265  					})
   266  
   267  					It("prints the flavor text in lowercase", func() {
   268  						Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for app %s`), resourceName))
   269  					})
   270  				})
   271  			})
   272  		})
   273  
   274  		When("checking targeted org and space fails", func() {
   275  			BeforeEach(func() {
   276  				fakeSharedActor.CheckTargetReturns(errors.New("nope"))
   277  			})
   278  
   279  			It("returns an error", func() {
   280  				Expect(executeErr).To(MatchError("nope"))
   281  			})
   282  		})
   283  	})
   284  
   285  	When("setting labels on domains", func() {
   286  		BeforeEach(func() {
   287  			resourceName = "example.com"
   288  			testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
   289  			fakeActor = new(v7fakes.FakeSetLabelActor)
   290  			fakeConfig = new(commandfakes.FakeConfig)
   291  			fakeSharedActor = new(commandfakes.FakeSharedActor)
   292  			cmd = SetLabelCommand{
   293  				Actor:       fakeActor,
   294  				UI:          testUI,
   295  				Config:      fakeConfig,
   296  				SharedActor: fakeSharedActor,
   297  			}
   298  			cmd.RequiredArgs = flag.SetLabelArgs{
   299  				ResourceType: "domain",
   300  				ResourceName: resourceName,
   301  				Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   302  			}
   303  
   304  			fakeConfig.CurrentUserNameReturns("some-user", nil)
   305  
   306  			fakeActor.UpdateDomainLabelsByDomainNameReturns(
   307  				v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   308  				nil,
   309  			)
   310  		})
   311  
   312  		JustBeforeEach(func() {
   313  			executeErr = cmd.Execute(nil)
   314  		})
   315  
   316  		It("doesn't error", func() {
   317  			Expect(executeErr).ToNot(HaveOccurred())
   318  		})
   319  
   320  		It("outputs that the label is being set", func() {
   321  			Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for domain %s as some-user...`), resourceName))
   322  			Expect(testUI.Out).To(Say("OK"))
   323  		})
   324  
   325  		It("sets the provided labels on the domain", func() {
   326  			Expect(fakeActor.UpdateDomainLabelsByDomainNameCallCount()).To(Equal(1))
   327  			name, labels := fakeActor.UpdateDomainLabelsByDomainNameArgsForCall(0)
   328  			Expect(name).To(Equal(resourceName), "failed to pass domain name")
   329  			Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
   330  				"FOO": types.NewNullString("BAR"),
   331  				"ENV": types.NewNullString("FAKE"),
   332  			}))
   333  		})
   334  
   335  		It("prints all warnings", func() {
   336  			Expect(testUI.Err).To(Say("some-warning-1"))
   337  			Expect(testUI.Err).To(Say("some-warning-2"))
   338  		})
   339  
   340  		When("updating the domain labels fails", func() {
   341  			BeforeEach(func() {
   342  				fakeActor.UpdateDomainLabelsByDomainNameReturns(
   343  					v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   344  					errors.New("some-updating-error"),
   345  				)
   346  			})
   347  			It("displays warnings and an error message", func() {
   348  				Expect(testUI.Err).To(Say("some-warning-1"))
   349  				Expect(testUI.Err).To(Say("some-warning-2"))
   350  				Expect(executeErr).To(HaveOccurred())
   351  				Expect(executeErr).To(MatchError("some-updating-error"))
   352  			})
   353  		})
   354  
   355  		When("some provided labels do not have a value part", func() {
   356  			BeforeEach(func() {
   357  				cmd.RequiredArgs = flag.SetLabelArgs{
   358  					ResourceType: "domain",
   359  					ResourceName: resourceName,
   360  					Labels:       []string{"FOO=BAR", "MISSING_EQUALS", "ENV=FAKE"},
   361  				}
   362  			})
   363  
   364  			It("complains about the missing equal sign", func() {
   365  				Expect(executeErr).To(MatchError("Metadata error: no value provided for label 'MISSING_EQUALS'"))
   366  			})
   367  		})
   368  
   369  		When("the resource type argument is not lowercase", func() {
   370  			BeforeEach(func() {
   371  				cmd.RequiredArgs = flag.SetLabelArgs{
   372  					ResourceType: "DoMaiN",
   373  					ResourceName: resourceName,
   374  					Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   375  				}
   376  			})
   377  
   378  			It("sets the provided labels on the domain", func() {
   379  				Expect(fakeActor.UpdateDomainLabelsByDomainNameCallCount()).To(Equal(1))
   380  				name, labels := fakeActor.UpdateDomainLabelsByDomainNameArgsForCall(0)
   381  				Expect(name).To(Equal(resourceName), "failed to pass domain name")
   382  				Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
   383  					"FOO": types.NewNullString("BAR"),
   384  					"ENV": types.NewNullString("FAKE"),
   385  				}))
   386  			})
   387  
   388  			It("prints the flavor text in lowercase", func() {
   389  				Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for domain %s as some-user...`), resourceName))
   390  			})
   391  		})
   392  	})
   393  
   394  	When("setting labels on orgs", func() {
   395  		BeforeEach(func() {
   396  			testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
   397  			fakeActor = new(v7fakes.FakeSetLabelActor)
   398  			fakeConfig = new(commandfakes.FakeConfig)
   399  			fakeSharedActor = new(commandfakes.FakeSharedActor)
   400  			resourceName = "some-org"
   401  			cmd = SetLabelCommand{
   402  				Actor:       fakeActor,
   403  				UI:          testUI,
   404  				Config:      fakeConfig,
   405  				SharedActor: fakeSharedActor,
   406  			}
   407  			cmd.RequiredArgs = flag.SetLabelArgs{
   408  				ResourceType: "org",
   409  				ResourceName: resourceName,
   410  			}
   411  		})
   412  
   413  		JustBeforeEach(func() {
   414  			executeErr = cmd.Execute(nil)
   415  		})
   416  
   417  		It("doesn't error", func() {
   418  			Expect(executeErr).ToNot(HaveOccurred())
   419  		})
   420  
   421  		It("checks that the user is logged in", func() {
   422  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
   423  			checkOrg, checkSpace := fakeSharedActor.CheckTargetArgsForCall(0)
   424  			Expect(checkOrg).To(BeFalse())
   425  			Expect(checkSpace).To(BeFalse())
   426  		})
   427  
   428  		When("checking target succeeds", func() {
   429  			BeforeEach(func() {
   430  				fakeSharedActor.CheckTargetReturns(nil)
   431  			})
   432  
   433  			When("fetching current user's name succeeds", func() {
   434  				BeforeEach(func() {
   435  					fakeConfig.CurrentUserNameReturns("some-user", nil)
   436  				})
   437  
   438  				When("all the provided labels are valid", func() {
   439  					BeforeEach(func() {
   440  						cmd.RequiredArgs = flag.SetLabelArgs{
   441  							ResourceType: "org",
   442  							ResourceName: resourceName,
   443  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   444  						}
   445  						fakeActor.UpdateOrganizationLabelsByOrganizationNameReturns(
   446  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   447  							nil,
   448  						)
   449  					})
   450  
   451  					When("updating the application labels succeeds", func() {
   452  						It("sets the provided labels on the app", func() {
   453  							Expect(fakeActor.UpdateOrganizationLabelsByOrganizationNameCallCount()).To(Equal(1))
   454  							name, labels := fakeActor.UpdateOrganizationLabelsByOrganizationNameArgsForCall(0)
   455  							Expect(name).To(Equal(resourceName), "failed to pass app name")
   456  							Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
   457  								"FOO": types.NewNullString("BAR"),
   458  								"ENV": types.NewNullString("FAKE"),
   459  							}))
   460  						})
   461  
   462  						It("displays a message", func() {
   463  							Expect(executeErr).ToNot(HaveOccurred())
   464  
   465  							Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
   466  
   467  							Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for org %s as some-user...`), resourceName))
   468  							Expect(testUI.Out).To(Say("OK"))
   469  						})
   470  
   471  						It("prints all warnings", func() {
   472  							Expect(testUI.Err).To(Say("some-warning-1"))
   473  							Expect(testUI.Err).To(Say("some-warning-2"))
   474  						})
   475  					})
   476  				})
   477  
   478  				When("updating the application labels fail", func() {
   479  					BeforeEach(func() {
   480  						cmd.RequiredArgs = flag.SetLabelArgs{
   481  							ResourceType: "org",
   482  							ResourceName: resourceName,
   483  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   484  						}
   485  						fakeActor.UpdateOrganizationLabelsByOrganizationNameReturns(
   486  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   487  							errors.New("some-updating-error"),
   488  						)
   489  					})
   490  
   491  					It("displays warnings and an error message", func() {
   492  						Expect(testUI.Err).To(Say("some-warning-1"))
   493  						Expect(testUI.Err).To(Say("some-warning-2"))
   494  						Expect(executeErr).To(MatchError("some-updating-error"))
   495  					})
   496  				})
   497  
   498  				When("some provided labels do not have a value part", func() {
   499  					BeforeEach(func() {
   500  						cmd.RequiredArgs = flag.SetLabelArgs{
   501  							ResourceType: "org",
   502  							ResourceName: resourceName,
   503  							Labels:       []string{"FOO=BAR", "MISSING_EQUALS", "ENV=FAKE"},
   504  						}
   505  					})
   506  
   507  					It("complains about the missing equal sign", func() {
   508  						Expect(executeErr).To(MatchError("Metadata error: no value provided for label 'MISSING_EQUALS'"))
   509  						Expect(executeErr).To(HaveOccurred())
   510  					})
   511  				})
   512  
   513  				When("when the --stack flag is specified", func() {
   514  					BeforeEach(func() {
   515  						cmd.RequiredArgs = flag.SetLabelArgs{
   516  							ResourceType: "org",
   517  							ResourceName: resourceName,
   518  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   519  						}
   520  						cmd.BuildpackStack = "im-a-stack"
   521  					})
   522  
   523  					It("complains about the --stack flag being present", func() {
   524  						Expect(executeErr).To(MatchError(translatableerror.ArgumentCombinationError{Args: []string{"org", "--stack, -s"}}))
   525  					})
   526  				})
   527  
   528  				When("the resource type argument is not lowercase", func() {
   529  					BeforeEach(func() {
   530  						cmd.RequiredArgs = flag.SetLabelArgs{
   531  							ResourceType: "OrG",
   532  							ResourceName: resourceName,
   533  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   534  						}
   535  						fakeActor.UpdateOrganizationLabelsByOrganizationNameReturns(
   536  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   537  							nil,
   538  						)
   539  					})
   540  
   541  					It("sets the provided labels on the org", func() {
   542  						name, labels := fakeActor.UpdateOrganizationLabelsByOrganizationNameArgsForCall(0)
   543  						Expect(name).To(Equal(resourceName), "failed to pass org name")
   544  						Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
   545  							"FOO": types.NewNullString("BAR"),
   546  							"ENV": types.NewNullString("FAKE"),
   547  						}))
   548  					})
   549  
   550  					It("prints the flavor text in lowercase", func() {
   551  						Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for org %s`), resourceName))
   552  					})
   553  				})
   554  			})
   555  		})
   556  
   557  		When("checking targeted org and space fails", func() {
   558  			BeforeEach(func() {
   559  				fakeSharedActor.CheckTargetReturns(errors.New("nope"))
   560  			})
   561  
   562  			It("returns an error", func() {
   563  				Expect(executeErr).To(MatchError("nope"))
   564  			})
   565  		})
   566  	})
   567  
   568  	When("setting labels on routes", func() {
   569  
   570  		BeforeEach(func() {
   571  			testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
   572  			fakeActor = new(v7fakes.FakeSetLabelActor)
   573  			fakeConfig = new(commandfakes.FakeConfig)
   574  			fakeSharedActor = new(commandfakes.FakeSharedActor)
   575  			cmd = SetLabelCommand{
   576  				Actor:       fakeActor,
   577  				UI:          testUI,
   578  				Config:      fakeConfig,
   579  				SharedActor: fakeSharedActor,
   580  			}
   581  			cmd.RequiredArgs = flag.SetLabelArgs{
   582  				ResourceType: "route",
   583  			}
   584  		})
   585  
   586  		JustBeforeEach(func() {
   587  			executeErr = cmd.Execute(nil)
   588  		})
   589  
   590  		It("doesn't error", func() {
   591  			Expect(executeErr).ToNot(HaveOccurred())
   592  		})
   593  
   594  		It("checks that the user is logged in and targeted to an org and space", func() {
   595  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
   596  			checkOrg, checkSpace := fakeSharedActor.CheckTargetArgsForCall(0)
   597  			Expect(checkOrg).To(BeTrue())
   598  			Expect(checkSpace).To(BeTrue())
   599  		})
   600  
   601  		When("checking target succeeds", func() {
   602  			BeforeEach(func() {
   603  				fakeSharedActor.CheckTargetReturns(nil)
   604  			})
   605  
   606  			When("fetching current user's name succeeds", func() {
   607  				BeforeEach(func() {
   608  					fakeConfig.CurrentUserNameReturns("some-user", nil)
   609  					fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "fake-org"})
   610  					fakeConfig.TargetedSpaceReturns(configv3.Space{Name: "fake-space", GUID: "some-space-guid"})
   611  
   612  					u, err := uuid.NewV4()
   613  					Expect(err).NotTo(HaveOccurred())
   614  					resourceName = u.String()
   615  				})
   616  
   617  				When("all the provided labels are valid", func() {
   618  					BeforeEach(func() {
   619  						cmd.RequiredArgs = flag.SetLabelArgs{
   620  							ResourceType: "route",
   621  							ResourceName: resourceName,
   622  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   623  						}
   624  						fakeActor.UpdateRouteLabelsReturns(
   625  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   626  							nil,
   627  						)
   628  					})
   629  
   630  					When("updating the route labels succeeds", func() {
   631  						It("sets the provided labels on the route", func() {
   632  							name, spaceGUID, labels := fakeActor.UpdateRouteLabelsArgsForCall(0)
   633  							Expect(name).To(Equal(resourceName), "failed to pass route name")
   634  							Expect(spaceGUID).To(Equal("some-space-guid"))
   635  							Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
   636  								"FOO": types.NewNullString("BAR"),
   637  								"ENV": types.NewNullString("FAKE"),
   638  							}))
   639  						})
   640  
   641  						It("displays a message", func() {
   642  							Expect(executeErr).ToNot(HaveOccurred())
   643  
   644  							Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
   645  
   646  							Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for route %s in org fake-org / space fake-space as some-user...`), resourceName))
   647  							Expect(testUI.Out).To(Say("OK"))
   648  						})
   649  
   650  						It("prints all warnings", func() {
   651  							Expect(testUI.Err).To(Say("some-warning-1"))
   652  							Expect(testUI.Err).To(Say("some-warning-2"))
   653  						})
   654  					})
   655  				})
   656  
   657  				When("updating the route labels fail", func() {
   658  					BeforeEach(func() {
   659  						cmd.RequiredArgs = flag.SetLabelArgs{
   660  							ResourceType: "route",
   661  							ResourceName: resourceName,
   662  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   663  						}
   664  						fakeActor.UpdateRouteLabelsReturns(
   665  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   666  							errors.New("some-updating-error"),
   667  						)
   668  					})
   669  					It("displays warnings and an error message", func() {
   670  						Expect(testUI.Err).To(Say("some-warning-1"))
   671  						Expect(testUI.Err).To(Say("some-warning-2"))
   672  						Expect(executeErr).To(HaveOccurred())
   673  						Expect(executeErr).To(MatchError("some-updating-error"))
   674  					})
   675  				})
   676  
   677  				When("some provided labels do not have a value part", func() {
   678  					BeforeEach(func() {
   679  						cmd.RequiredArgs = flag.SetLabelArgs{
   680  							ResourceType: "route",
   681  							ResourceName: resourceName,
   682  							Labels:       []string{"FOO=BAR", "MISSING_EQUALS", "ENV=FAKE"},
   683  						}
   684  					})
   685  
   686  					It("complains about the missing equal sign", func() {
   687  						Expect(executeErr).To(MatchError("Metadata error: no value provided for label 'MISSING_EQUALS'"))
   688  					})
   689  				})
   690  
   691  				When("when the --stack flag is specified", func() {
   692  					BeforeEach(func() {
   693  						cmd.RequiredArgs = flag.SetLabelArgs{
   694  							ResourceType: "route",
   695  							ResourceName: resourceName,
   696  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   697  						}
   698  						cmd.BuildpackStack = "im-a-stack"
   699  					})
   700  
   701  					It("complains about the --stack flag being present", func() {
   702  						Expect(executeErr).To(MatchError(translatableerror.ArgumentCombinationError{Args: []string{"route", "--stack, -s"}}))
   703  					})
   704  				})
   705  
   706  				When("the resource type argument is not lowercase", func() {
   707  					BeforeEach(func() {
   708  						cmd.RequiredArgs = flag.SetLabelArgs{
   709  							ResourceType: "RoUTe",
   710  							ResourceName: resourceName,
   711  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   712  						}
   713  						fakeActor.UpdateRouteLabelsReturns(
   714  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   715  							nil,
   716  						)
   717  					})
   718  
   719  					It("sets the provided labels on the route", func() {
   720  						name, spaceGUID, labels := fakeActor.UpdateRouteLabelsArgsForCall(0)
   721  						Expect(name).To(Equal(resourceName), "failed to pass route name")
   722  						Expect(spaceGUID).To(Equal("some-space-guid"))
   723  						Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
   724  							"FOO": types.NewNullString("BAR"),
   725  							"ENV": types.NewNullString("FAKE"),
   726  						}))
   727  					})
   728  
   729  					It("prints the flavor text in lowercase", func() {
   730  						Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for route %s`), resourceName))
   731  					})
   732  				})
   733  			})
   734  		})
   735  
   736  		When("checking targeted org and space fails", func() {
   737  			BeforeEach(func() {
   738  				fakeSharedActor.CheckTargetReturns(errors.New("nope"))
   739  			})
   740  
   741  			It("returns an error", func() {
   742  				Expect(executeErr).To(MatchError("nope"))
   743  			})
   744  		})
   745  	})
   746  
   747  	When("setting labels on buildpacks", func() {
   748  		BeforeEach(func() {
   749  			testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
   750  			fakeActor = new(v7fakes.FakeSetLabelActor)
   751  			fakeConfig = new(commandfakes.FakeConfig)
   752  			fakeSharedActor = new(commandfakes.FakeSharedActor)
   753  			resourceName = "some-buildpack"
   754  			cmd = SetLabelCommand{
   755  				Actor:       fakeActor,
   756  				UI:          testUI,
   757  				Config:      fakeConfig,
   758  				SharedActor: fakeSharedActor,
   759  			}
   760  			cmd.RequiredArgs = flag.SetLabelArgs{
   761  				ResourceType: "buildpack",
   762  				ResourceName: resourceName,
   763  			}
   764  		})
   765  
   766  		JustBeforeEach(func() {
   767  			executeErr = cmd.Execute(nil)
   768  		})
   769  
   770  		It("doesn't error", func() {
   771  			Expect(executeErr).ToNot(HaveOccurred())
   772  		})
   773  
   774  		It("checks that the user is logged in", func() {
   775  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
   776  			checkOrg, checkSpace := fakeSharedActor.CheckTargetArgsForCall(0)
   777  			Expect(checkOrg).To(BeFalse())
   778  			Expect(checkSpace).To(BeFalse())
   779  		})
   780  
   781  		When("checking target succeeds", func() {
   782  			BeforeEach(func() {
   783  				fakeSharedActor.CheckTargetReturns(nil)
   784  			})
   785  
   786  			When("fetching current user's name succeeds", func() {
   787  				BeforeEach(func() {
   788  					fakeConfig.CurrentUserNameReturns("some-user", nil)
   789  				})
   790  
   791  				When("all the provided labels are valid", func() {
   792  					BeforeEach(func() {
   793  						cmd.RequiredArgs = flag.SetLabelArgs{
   794  							ResourceType: "buildpack",
   795  							ResourceName: resourceName,
   796  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   797  						}
   798  						cmd.BuildpackStack = "globinski"
   799  
   800  						fakeActor.UpdateBuildpackLabelsByBuildpackNameAndStackReturns(
   801  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   802  							nil,
   803  						)
   804  					})
   805  
   806  					When("updating the buildpack labels succeeds", func() {
   807  						When("the buildpack stack is specified", func() {
   808  							It("sets the provided labels on the buildpack", func() {
   809  								Expect(fakeActor.UpdateBuildpackLabelsByBuildpackNameAndStackCallCount()).To(Equal(1))
   810  								name, stack, labels := fakeActor.UpdateBuildpackLabelsByBuildpackNameAndStackArgsForCall(0)
   811  								Expect(name).To(Equal(resourceName), "failed to pass buildpack name")
   812  								Expect(stack).To(Equal("globinski"), "failed to pass stack name")
   813  								Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
   814  									"FOO": types.NewNullString("BAR"),
   815  									"ENV": types.NewNullString("FAKE"),
   816  								}))
   817  							})
   818  
   819  							It("displays a message", func() {
   820  								Expect(executeErr).ToNot(HaveOccurred())
   821  
   822  								Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
   823  
   824  								Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for buildpack %s with stack %s as some-user...`), resourceName, cmd.BuildpackStack))
   825  								Expect(testUI.Out).To(Say("OK"))
   826  							})
   827  
   828  							It("prints all warnings", func() {
   829  								Expect(testUI.Err).To(Say("some-warning-1"))
   830  								Expect(testUI.Err).To(Say("some-warning-2"))
   831  							})
   832  						})
   833  
   834  						When("the buildpack stack is not specified", func() {
   835  							BeforeEach(func() {
   836  								cmd.BuildpackStack = ""
   837  							})
   838  
   839  							It("sets the provided labels on the buildpack", func() {
   840  								Expect(fakeActor.UpdateBuildpackLabelsByBuildpackNameAndStackCallCount()).To(Equal(1))
   841  								name, stack, labels := fakeActor.UpdateBuildpackLabelsByBuildpackNameAndStackArgsForCall(0)
   842  								Expect(name).To(Equal(resourceName), "failed to pass buildpack name")
   843  								Expect(stack).To(Equal(""), "got a non-empty stack name")
   844  								Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
   845  									"FOO": types.NewNullString("BAR"),
   846  									"ENV": types.NewNullString("FAKE"),
   847  								}))
   848  							})
   849  
   850  							It("displays a message", func() {
   851  								Expect(executeErr).ToNot(HaveOccurred())
   852  
   853  								Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
   854  
   855  								Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for buildpack %s as some-user...`), resourceName))
   856  								Expect(testUI.Out).To(Say("OK"))
   857  							})
   858  
   859  							It("prints all warnings", func() {
   860  								Expect(testUI.Err).To(Say("some-warning-1"))
   861  								Expect(testUI.Err).To(Say("some-warning-2"))
   862  							})
   863  						})
   864  
   865  						When("no stack is provided", func() {
   866  							BeforeEach(func() {
   867  								cmd.BuildpackStack = ""
   868  							})
   869  
   870  							It("displays a message that includes the stack name", func() {
   871  								Expect(executeErr).ToNot(HaveOccurred())
   872  
   873  								Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
   874  								Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for buildpack %s as some-user...`), resourceName))
   875  
   876  								Expect(testUI.Out).To(Say("OK"))
   877  							})
   878  						})
   879  					})
   880  				})
   881  
   882  				When("updating the buildpack labels fail", func() {
   883  					BeforeEach(func() {
   884  						cmd.RequiredArgs = flag.SetLabelArgs{
   885  							ResourceType: "buildpack",
   886  							ResourceName: resourceName,
   887  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   888  						}
   889  						fakeActor.UpdateBuildpackLabelsByBuildpackNameAndStackReturns(
   890  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   891  							errors.New("some-updating-error"),
   892  						)
   893  					})
   894  
   895  					It("displays warnings and an error message", func() {
   896  						Expect(testUI.Err).To(Say("some-warning-1"))
   897  						Expect(testUI.Err).To(Say("some-warning-2"))
   898  						Expect(executeErr).To(MatchError("some-updating-error"))
   899  					})
   900  				})
   901  
   902  				When("some provided labels do not have a value part", func() {
   903  					BeforeEach(func() {
   904  						cmd.RequiredArgs = flag.SetLabelArgs{
   905  							ResourceType: "buildpack",
   906  							ResourceName: resourceName,
   907  							Labels:       []string{"FOO=BAR", "MISSING_EQUALS", "ENV=FAKE"},
   908  						}
   909  					})
   910  
   911  					It("complains about the missing equal sign", func() {
   912  						Expect(executeErr).To(MatchError("Metadata error: no value provided for label 'MISSING_EQUALS'"))
   913  						Expect(executeErr).To(HaveOccurred())
   914  					})
   915  				})
   916  
   917  				When("the resource type argument is not lowercase", func() {
   918  					BeforeEach(func() {
   919  						cmd.RequiredArgs = flag.SetLabelArgs{
   920  							ResourceType: "bUiLdPaCk",
   921  							ResourceName: resourceName,
   922  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
   923  						}
   924  						fakeActor.UpdateBuildpackLabelsByBuildpackNameAndStackReturns(
   925  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
   926  							nil,
   927  						)
   928  					})
   929  
   930  					It("sets the provided labels on the buildpack", func() {
   931  						name, stack, labels := fakeActor.UpdateBuildpackLabelsByBuildpackNameAndStackArgsForCall(0)
   932  						Expect(name).To(Equal(resourceName), "failed to pass buildpack name")
   933  						Expect(stack).To(Equal(""), "failed to pass buildpack stack")
   934  						Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
   935  							"FOO": types.NewNullString("BAR"),
   936  							"ENV": types.NewNullString("FAKE"),
   937  						}))
   938  					})
   939  
   940  					It("prints the flavor text in lowercase", func() {
   941  						Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for buildpack %s`), resourceName))
   942  					})
   943  
   944  					When("setting the stack argument", func() {
   945  						BeforeEach(func() {
   946  							cmd.BuildpackStack = "cflinuxfs3"
   947  						})
   948  
   949  						It("does not display an argument combination error", func() {
   950  							Expect(executeErr).ToNot(HaveOccurred())
   951  						})
   952  
   953  					})
   954  				})
   955  			})
   956  		})
   957  
   958  		When("checking targeted org and space fails", func() {
   959  			BeforeEach(func() {
   960  				fakeSharedActor.CheckTargetReturns(errors.New("nope"))
   961  			})
   962  
   963  			It("returns an error", func() {
   964  				Expect(executeErr).To(MatchError("nope"))
   965  			})
   966  		})
   967  
   968  		When("setting the stack argument", func() {
   969  
   970  			BeforeEach(func() {
   971  				cmd.BuildpackStack = "cflinuxfs3"
   972  			})
   973  
   974  			It("does not display an argument combination error", func() {
   975  				Expect(executeErr).ToNot(HaveOccurred())
   976  			})
   977  
   978  		})
   979  	})
   980  
   981  	When("setting labels on spaces", func() {
   982  		BeforeEach(func() {
   983  			testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
   984  			fakeActor = new(v7fakes.FakeSetLabelActor)
   985  			fakeConfig = new(commandfakes.FakeConfig)
   986  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "fake-org", GUID: "some-org-guid"})
   987  
   988  			fakeSharedActor = new(commandfakes.FakeSharedActor)
   989  			resourceName = "some-space"
   990  			cmd = SetLabelCommand{
   991  				Actor:       fakeActor,
   992  				UI:          testUI,
   993  				Config:      fakeConfig,
   994  				SharedActor: fakeSharedActor,
   995  			}
   996  			cmd.RequiredArgs = flag.SetLabelArgs{
   997  				ResourceType: "space",
   998  				ResourceName: resourceName,
   999  			}
  1000  		})
  1001  
  1002  		JustBeforeEach(func() {
  1003  			executeErr = cmd.Execute(nil)
  1004  		})
  1005  
  1006  		It("checks that the user is logged in and targeted to an org", func() {
  1007  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
  1008  			checkOrg, checkSpace := fakeSharedActor.CheckTargetArgsForCall(0)
  1009  			Expect(checkOrg).To(BeTrue())
  1010  			Expect(checkSpace).To(BeFalse())
  1011  		})
  1012  
  1013  		When("checking target succeeds", func() {
  1014  			BeforeEach(func() {
  1015  				fakeSharedActor.CheckTargetReturns(nil)
  1016  			})
  1017  
  1018  			When("fetching current user's name succeeds", func() {
  1019  				BeforeEach(func() {
  1020  					fakeConfig.CurrentUserNameReturns("some-user", nil)
  1021  				})
  1022  
  1023  				When("all the provided labels are valid", func() {
  1024  					BeforeEach(func() {
  1025  						cmd.RequiredArgs = flag.SetLabelArgs{
  1026  							ResourceType: "space",
  1027  							ResourceName: resourceName,
  1028  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
  1029  						}
  1030  						fakeActor.UpdateSpaceLabelsBySpaceNameReturns(
  1031  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
  1032  							nil,
  1033  						)
  1034  					})
  1035  
  1036  					When("updating the space labels succeeds", func() {
  1037  						It("sets the provided labels on the space", func() {
  1038  							Expect(fakeActor.UpdateSpaceLabelsBySpaceNameCallCount()).To(Equal(1))
  1039  							spaceName, orgGUID, labels := fakeActor.UpdateSpaceLabelsBySpaceNameArgsForCall(0)
  1040  							Expect(spaceName).To(Equal(resourceName), "failed to pass space name")
  1041  							Expect(orgGUID).To(Equal("some-org-guid"))
  1042  							Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
  1043  								"FOO": types.NewNullString("BAR"),
  1044  								"ENV": types.NewNullString("FAKE"),
  1045  							}))
  1046  						})
  1047  
  1048  						It("displays a message", func() {
  1049  							Expect(executeErr).ToNot(HaveOccurred())
  1050  							Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
  1051  							Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for space %s in org fake-org as some-user...`), resourceName))
  1052  							Expect(testUI.Out).To(Say("OK"))
  1053  						})
  1054  
  1055  						It("prints all warnings", func() {
  1056  							Expect(testUI.Err).To(Say("some-warning-1"))
  1057  							Expect(testUI.Err).To(Say("some-warning-2"))
  1058  						})
  1059  					})
  1060  				})
  1061  
  1062  				When("updating the application labels fail", func() {
  1063  					BeforeEach(func() {
  1064  						cmd.RequiredArgs = flag.SetLabelArgs{
  1065  							ResourceType: "org",
  1066  							ResourceName: resourceName,
  1067  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
  1068  						}
  1069  						fakeActor.UpdateOrganizationLabelsByOrganizationNameReturns(
  1070  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
  1071  							errors.New("some-updating-error"),
  1072  						)
  1073  					})
  1074  
  1075  					It("displays warnings and an error message", func() {
  1076  						Expect(testUI.Err).To(Say("some-warning-1"))
  1077  						Expect(testUI.Err).To(Say("some-warning-2"))
  1078  						Expect(executeErr).To(MatchError("some-updating-error"))
  1079  					})
  1080  				})
  1081  
  1082  				When("some provided labels do not have a value part", func() {
  1083  					BeforeEach(func() {
  1084  						cmd.RequiredArgs = flag.SetLabelArgs{
  1085  							ResourceType: "org",
  1086  							ResourceName: resourceName,
  1087  							Labels:       []string{"FOO=BAR", "MISSING_EQUALS", "ENV=FAKE"},
  1088  						}
  1089  					})
  1090  
  1091  					It("complains about the missing equal sign", func() {
  1092  						Expect(executeErr).To(MatchError("Metadata error: no value provided for label 'MISSING_EQUALS'"))
  1093  						Expect(executeErr).To(HaveOccurred())
  1094  					})
  1095  				})
  1096  
  1097  				When("the resource type argument is not lowercase", func() {
  1098  					BeforeEach(func() {
  1099  						cmd.RequiredArgs = flag.SetLabelArgs{
  1100  							ResourceType: "sPaCe",
  1101  							ResourceName: resourceName,
  1102  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
  1103  						}
  1104  						fakeActor.UpdateSpaceLabelsBySpaceNameReturns(
  1105  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
  1106  							nil,
  1107  						)
  1108  					})
  1109  
  1110  					It("sets the provided labels on the app", func() {
  1111  						name, orgGUID, labels := fakeActor.UpdateSpaceLabelsBySpaceNameArgsForCall(0)
  1112  						Expect(name).To(Equal(resourceName), "failed to pass space name")
  1113  						Expect(orgGUID).To(Equal("some-org-guid"))
  1114  						Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
  1115  							"FOO": types.NewNullString("BAR"),
  1116  							"ENV": types.NewNullString("FAKE"),
  1117  						}))
  1118  					})
  1119  
  1120  					It("prints the flavor text in lowercase", func() {
  1121  						Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for space %s`), resourceName))
  1122  					})
  1123  				})
  1124  			})
  1125  		})
  1126  
  1127  		When("checking targeted org and space fails", func() {
  1128  			BeforeEach(func() {
  1129  				fakeSharedActor.CheckTargetReturns(errors.New("nope"))
  1130  			})
  1131  
  1132  			It("returns an error", func() {
  1133  				Expect(executeErr).To(MatchError("nope"))
  1134  			})
  1135  		})
  1136  	})
  1137  
  1138  	When("setting labels on stacks", func() {
  1139  		BeforeEach(func() {
  1140  			testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
  1141  			fakeActor = new(v7fakes.FakeSetLabelActor)
  1142  			fakeConfig = new(commandfakes.FakeConfig)
  1143  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "fake-org", GUID: "some-org-guid"})
  1144  
  1145  			fakeSharedActor = new(commandfakes.FakeSharedActor)
  1146  			resourceName = "some-stack"
  1147  			cmd = SetLabelCommand{
  1148  				Actor:       fakeActor,
  1149  				UI:          testUI,
  1150  				Config:      fakeConfig,
  1151  				SharedActor: fakeSharedActor,
  1152  			}
  1153  			cmd.RequiredArgs = flag.SetLabelArgs{
  1154  				ResourceType: "stack",
  1155  				ResourceName: resourceName,
  1156  			}
  1157  		})
  1158  
  1159  		JustBeforeEach(func() {
  1160  			executeErr = cmd.Execute(nil)
  1161  		})
  1162  
  1163  		It("checks that the user is logged in but not necessarily targeted to an org", func() {
  1164  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
  1165  			checkOrg, checkSpace := fakeSharedActor.CheckTargetArgsForCall(0)
  1166  			Expect(checkOrg).To(BeFalse())
  1167  			Expect(checkSpace).To(BeFalse())
  1168  		})
  1169  
  1170  		When("checking target succeeds", func() {
  1171  			BeforeEach(func() {
  1172  				fakeSharedActor.CheckTargetReturns(nil)
  1173  			})
  1174  
  1175  			When("fetching current user's name succeeds", func() {
  1176  				BeforeEach(func() {
  1177  					fakeConfig.CurrentUserNameReturns("some-user", nil)
  1178  				})
  1179  
  1180  				When("all the provided labels are valid", func() {
  1181  					BeforeEach(func() {
  1182  						cmd.RequiredArgs = flag.SetLabelArgs{
  1183  							ResourceType: "stack",
  1184  							ResourceName: resourceName,
  1185  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
  1186  						}
  1187  						fakeActor.UpdateStackLabelsByStackNameReturns(
  1188  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
  1189  							nil,
  1190  						)
  1191  					})
  1192  
  1193  					When("updating the stack labels succeeds", func() {
  1194  						It("sets the provided labels on the stack", func() {
  1195  							Expect(fakeActor.UpdateStackLabelsByStackNameCallCount()).To(Equal(1))
  1196  							stackName, labels := fakeActor.UpdateStackLabelsByStackNameArgsForCall(0)
  1197  							Expect(stackName).To(Equal(resourceName), "failed to pass stack name")
  1198  							Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
  1199  								"FOO": types.NewNullString("BAR"),
  1200  								"ENV": types.NewNullString("FAKE"),
  1201  							}))
  1202  						})
  1203  
  1204  						It("displays a message", func() {
  1205  							Expect(executeErr).ToNot(HaveOccurred())
  1206  							Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
  1207  							Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for stack %s as some-user...`), resourceName))
  1208  							Expect(testUI.Out).To(Say("OK"))
  1209  						})
  1210  
  1211  						It("prints all warnings", func() {
  1212  							Expect(testUI.Err).To(Say("some-warning-1"))
  1213  							Expect(testUI.Err).To(Say("some-warning-2"))
  1214  						})
  1215  					})
  1216  				})
  1217  
  1218  				When("updating the application labels fail", func() {
  1219  					BeforeEach(func() {
  1220  						cmd.RequiredArgs = flag.SetLabelArgs{
  1221  							ResourceType: "org",
  1222  							ResourceName: resourceName,
  1223  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
  1224  						}
  1225  						fakeActor.UpdateOrganizationLabelsByOrganizationNameReturns(
  1226  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
  1227  							errors.New("some-updating-error"),
  1228  						)
  1229  					})
  1230  
  1231  					It("displays warnings and an error message", func() {
  1232  						Expect(testUI.Err).To(Say("some-warning-1"))
  1233  						Expect(testUI.Err).To(Say("some-warning-2"))
  1234  						Expect(executeErr).To(MatchError("some-updating-error"))
  1235  					})
  1236  				})
  1237  
  1238  				When("some provided labels do not have a value part", func() {
  1239  					BeforeEach(func() {
  1240  						cmd.RequiredArgs = flag.SetLabelArgs{
  1241  							ResourceType: "org",
  1242  							ResourceName: resourceName,
  1243  							Labels:       []string{"FOO=BAR", "MISSING_EQUALS", "ENV=FAKE"},
  1244  						}
  1245  					})
  1246  
  1247  					It("complains about the missing equal sign", func() {
  1248  						Expect(executeErr).To(MatchError("Metadata error: no value provided for label 'MISSING_EQUALS'"))
  1249  						Expect(executeErr).To(HaveOccurred())
  1250  					})
  1251  				})
  1252  
  1253  				When("the resource type argument is not lowercase", func() {
  1254  					BeforeEach(func() {
  1255  						cmd.RequiredArgs = flag.SetLabelArgs{
  1256  							ResourceType: "sTaCk",
  1257  							ResourceName: resourceName,
  1258  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
  1259  						}
  1260  						fakeActor.UpdateStackLabelsByStackNameReturns(
  1261  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
  1262  							nil,
  1263  						)
  1264  					})
  1265  
  1266  					It("sets the provided labels on the stack", func() {
  1267  						name, labels := fakeActor.UpdateStackLabelsByStackNameArgsForCall(0)
  1268  						Expect(name).To(Equal(resourceName), "failed to pass stack name")
  1269  						Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
  1270  							"FOO": types.NewNullString("BAR"),
  1271  							"ENV": types.NewNullString("FAKE"),
  1272  						}))
  1273  					})
  1274  
  1275  					It("prints the flavor text in lowercase", func() {
  1276  						Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for stack %s`), resourceName))
  1277  					})
  1278  				})
  1279  			})
  1280  		})
  1281  
  1282  		When("checking targeted org and stack fails", func() {
  1283  			BeforeEach(func() {
  1284  				fakeSharedActor.CheckTargetReturns(errors.New("nope"))
  1285  			})
  1286  
  1287  			It("returns an error", func() {
  1288  				Expect(executeErr).To(MatchError("nope"))
  1289  			})
  1290  		})
  1291  	})
  1292  
  1293  	When("setting labels on service-brokers", func() {
  1294  		BeforeEach(func() {
  1295  			testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
  1296  			fakeActor = new(v7fakes.FakeSetLabelActor)
  1297  			fakeConfig = new(commandfakes.FakeConfig)
  1298  			//fakeConfig.TargetedOrganizationReturns(configv3.Organization{Name: "fake-org", GUID: "some-org-guid"})
  1299  
  1300  			fakeSharedActor = new(commandfakes.FakeSharedActor)
  1301  			resourceName = "some-service-broker"
  1302  			cmd = SetLabelCommand{
  1303  				Actor:       fakeActor,
  1304  				UI:          testUI,
  1305  				Config:      fakeConfig,
  1306  				SharedActor: fakeSharedActor,
  1307  			}
  1308  			cmd.RequiredArgs = flag.SetLabelArgs{
  1309  				ResourceType: "service-broker",
  1310  				ResourceName: resourceName,
  1311  			}
  1312  		})
  1313  
  1314  		JustBeforeEach(func() {
  1315  			executeErr = cmd.Execute(nil)
  1316  		})
  1317  
  1318  		It("checks that the user is logged in but not necessarily targeted to an org", func() {
  1319  			Expect(executeErr).NotTo(HaveOccurred())
  1320  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
  1321  			checkOrg, checkSpace := fakeSharedActor.CheckTargetArgsForCall(0)
  1322  			Expect(checkOrg).To(BeFalse())
  1323  			Expect(checkSpace).To(BeFalse())
  1324  		})
  1325  
  1326  		When("checking target succeeds", func() {
  1327  			BeforeEach(func() {
  1328  				fakeSharedActor.CheckTargetReturns(nil)
  1329  			})
  1330  
  1331  			When("fetching current user's name succeeds", func() {
  1332  				BeforeEach(func() {
  1333  					fakeConfig.CurrentUserNameReturns("some-user", nil)
  1334  				})
  1335  
  1336  				When("all the provided labels are valid", func() {
  1337  					BeforeEach(func() {
  1338  						cmd.RequiredArgs = flag.SetLabelArgs{
  1339  							ResourceType: "service-broker",
  1340  							ResourceName: resourceName,
  1341  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
  1342  						}
  1343  						fakeActor.UpdateServiceBrokerLabelsByServiceBrokerNameReturns(
  1344  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
  1345  							nil,
  1346  						)
  1347  					})
  1348  
  1349  					When("updating the service-broker labels succeeds", func() {
  1350  						It("sets the provided labels on the service-broker", func() {
  1351  							Expect(executeErr).NotTo(HaveOccurred())
  1352  							Expect(fakeActor.UpdateServiceBrokerLabelsByServiceBrokerNameCallCount()).To(Equal(1))
  1353  							serviceBroker, labels := fakeActor.UpdateServiceBrokerLabelsByServiceBrokerNameArgsForCall(0)
  1354  							Expect(serviceBroker).To(Equal(resourceName))
  1355  							Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
  1356  								"FOO": types.NewNullString("BAR"),
  1357  								"ENV": types.NewNullString("FAKE"),
  1358  							}))
  1359  						})
  1360  
  1361  						It("displays a message", func() {
  1362  							Expect(executeErr).ToNot(HaveOccurred())
  1363  							Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for service-broker %s as some-user...`), resourceName))
  1364  							Expect(testUI.Out).To(Say("OK"))
  1365  						})
  1366  
  1367  						It("prints all warnings", func() {
  1368  							Expect(testUI.Err).To(Say("some-warning-1"))
  1369  							Expect(testUI.Err).To(Say("some-warning-2"))
  1370  						})
  1371  					})
  1372  				})
  1373  
  1374  				When("updating the service-broker labels fail", func() {
  1375  					BeforeEach(func() {
  1376  						cmd.RequiredArgs = flag.SetLabelArgs{
  1377  							ResourceType: "service-broker",
  1378  							ResourceName: resourceName,
  1379  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
  1380  						}
  1381  						fakeActor.UpdateServiceBrokerLabelsByServiceBrokerNameReturns(
  1382  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
  1383  							errors.New("some-updating-error"),
  1384  						)
  1385  					})
  1386  
  1387  					It("displays warnings and an error message", func() {
  1388  						Expect(testUI.Err).To(Say("some-warning-1"))
  1389  						Expect(testUI.Err).To(Say("some-warning-2"))
  1390  						Expect(executeErr).To(MatchError("some-updating-error"))
  1391  					})
  1392  				})
  1393  
  1394  				When("the resource type argument is not lowercase", func() {
  1395  					BeforeEach(func() {
  1396  						cmd.RequiredArgs = flag.SetLabelArgs{
  1397  							ResourceType: "sErvicE-BrokEr",
  1398  							ResourceName: resourceName,
  1399  							Labels:       []string{"FOO=BAR", "ENV=FAKE"},
  1400  						}
  1401  						fakeActor.UpdateServiceBrokerLabelsByServiceBrokerNameReturns(
  1402  							v7action.Warnings([]string{"some-warning-1", "some-warning-2"}),
  1403  							nil,
  1404  						)
  1405  					})
  1406  
  1407  					It("sets the provided labels on the service-broker", func() {
  1408  						name, labels := fakeActor.UpdateServiceBrokerLabelsByServiceBrokerNameArgsForCall(0)
  1409  						Expect(name).To(Equal(resourceName), "failed to pass stack name")
  1410  						Expect(labels).To(BeEquivalentTo(map[string]types.NullString{
  1411  							"FOO": types.NewNullString("BAR"),
  1412  							"ENV": types.NewNullString("FAKE"),
  1413  						}))
  1414  					})
  1415  
  1416  					It("prints the flavor text in lowercase", func() {
  1417  						Expect(testUI.Out).To(Say(regexp.QuoteMeta(`Setting label(s) for service-broker %s`), resourceName))
  1418  					})
  1419  				})
  1420  			})
  1421  		})
  1422  
  1423  		When("checking targeted org and stack fails", func() {
  1424  			BeforeEach(func() {
  1425  				fakeSharedActor.CheckTargetReturns(errors.New("nope"))
  1426  			})
  1427  
  1428  			It("returns an error", func() {
  1429  				Expect(executeErr).To(MatchError("nope"))
  1430  			})
  1431  		})
  1432  	})
  1433  
  1434  	When("an unrecognized resource is specified", func() {
  1435  		BeforeEach(func() {
  1436  			testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
  1437  			fakeActor = new(v7fakes.FakeSetLabelActor)
  1438  			fakeConfig = new(commandfakes.FakeConfig)
  1439  			fakeSharedActor = new(commandfakes.FakeSharedActor)
  1440  			resourceName = "some-unrecognized-resource"
  1441  			cmd = SetLabelCommand{
  1442  				Actor:       fakeActor,
  1443  				UI:          testUI,
  1444  				Config:      fakeConfig,
  1445  				SharedActor: fakeSharedActor,
  1446  			}
  1447  			cmd.RequiredArgs = flag.SetLabelArgs{
  1448  				ResourceType: "unrecognized-resource",
  1449  				ResourceName: resourceName,
  1450  			}
  1451  		})
  1452  
  1453  		JustBeforeEach(func() {
  1454  			executeErr = cmd.Execute(nil)
  1455  		})
  1456  
  1457  		It("errors", func() {
  1458  			Expect(executeErr).To(MatchError("Unsupported resource type of 'unrecognized-resource'"))
  1459  		})
  1460  	})
  1461  })