github.com/wanddynosios/cli/v8@v8.7.9-0.20240221182337-1a92e3a7017f/command/v7/update_service_broker_command_test.go (about)

     1  package v7_test
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  
     7  	"code.cloudfoundry.org/cli/actor/actionerror"
     8  	"code.cloudfoundry.org/cli/actor/v7action"
     9  	"code.cloudfoundry.org/cli/cf/errors"
    10  	"code.cloudfoundry.org/cli/command/commandfakes"
    11  	v7 "code.cloudfoundry.org/cli/command/v7"
    12  	"code.cloudfoundry.org/cli/command/v7/v7fakes"
    13  	"code.cloudfoundry.org/cli/resources"
    14  	"code.cloudfoundry.org/cli/util/configv3"
    15  	"code.cloudfoundry.org/cli/util/ui"
    16  	. "github.com/onsi/ginkgo"
    17  	. "github.com/onsi/gomega"
    18  	. "github.com/onsi/gomega/gbytes"
    19  )
    20  
    21  var _ = Describe("update-service-broker command", func() {
    22  	const (
    23  		binaryName        = "cf-command"
    24  		serviceBrokerName = "fake-service-broker-name"
    25  		username          = "fake-username"
    26  		password          = "fake-password"
    27  		url               = "fake-url"
    28  	)
    29  
    30  	var (
    31  		cmd                          *v7.UpdateServiceBrokerCommand
    32  		fakeUpdateServiceBrokerActor *v7fakes.FakeActor
    33  		fakeSharedActor              *commandfakes.FakeSharedActor
    34  		fakeConfig                   *commandfakes.FakeConfig
    35  		input                        *Buffer
    36  		testUI                       *ui.UI
    37  	)
    38  
    39  	BeforeEach(func() {
    40  		fakeUpdateServiceBrokerActor = &v7fakes.FakeActor{}
    41  		fakeSharedActor = &commandfakes.FakeSharedActor{}
    42  		input = NewBuffer()
    43  		testUI = ui.NewTestUI(input, NewBuffer(), NewBuffer())
    44  		fakeConfig = &commandfakes.FakeConfig{}
    45  		cmd = &v7.UpdateServiceBrokerCommand{
    46  			BaseCommand: v7.BaseCommand{
    47  				Actor:       fakeUpdateServiceBrokerActor,
    48  				SharedActor: fakeSharedActor,
    49  				UI:          testUI,
    50  				Config:      fakeConfig,
    51  			},
    52  		}
    53  	})
    54  
    55  	When("logged in", func() {
    56  		const guid = "fake-service-broker-guid"
    57  
    58  		BeforeEach(func() {
    59  			fakeUpdateServiceBrokerActor.GetServiceBrokerByNameReturns(
    60  				resources.ServiceBroker{GUID: guid},
    61  				v7action.Warnings{},
    62  				nil,
    63  			)
    64  
    65  			fakeUpdateServiceBrokerActor.GetCurrentUserReturns(configv3.User{Name: "user"}, nil)
    66  
    67  			setPositionalFlags(cmd, serviceBrokerName, username, password, url)
    68  		})
    69  
    70  		It("succeeds", func() {
    71  			fakeUpdateServiceBrokerActor.UpdateServiceBrokerReturns(v7action.Warnings{"update service broker warning"}, nil)
    72  
    73  			err := cmd.Execute(nil)
    74  			Expect(err).NotTo(HaveOccurred())
    75  
    76  			Expect(fakeUpdateServiceBrokerActor.UpdateServiceBrokerCallCount()).To(Equal(1))
    77  			serviceBrokerGUID, model := fakeUpdateServiceBrokerActor.UpdateServiceBrokerArgsForCall(0)
    78  			Expect(serviceBrokerGUID).To(Equal(guid))
    79  			Expect(model.Username).To(Equal(username))
    80  			Expect(model.Password).To(Equal(password))
    81  			Expect(model.URL).To(Equal(url))
    82  
    83  			Expect(testUI.Err).To(Say("update service broker warning"))
    84  		})
    85  
    86  		When("the UpdateServiceBroker actor fails to get the broker name", func() {
    87  			BeforeEach(func() {
    88  				fakeUpdateServiceBrokerActor.GetServiceBrokerByNameReturns(
    89  					resources.ServiceBroker{},
    90  					v7action.Warnings{"some-warning"},
    91  					actionerror.ServiceBrokerNotFoundError{
    92  						Name: serviceBrokerName,
    93  					},
    94  				)
    95  			})
    96  
    97  			It("returns the error and displays all warnings", func() {
    98  				err := cmd.Execute(nil)
    99  				Expect(err).To(MatchError(actionerror.ServiceBrokerNotFoundError{Name: serviceBrokerName}))
   100  				Expect(testUI.Err).To(Say("some-warning"))
   101  
   102  				Expect(fakeUpdateServiceBrokerActor.GetServiceBrokerByNameCallCount()).To(Equal(1))
   103  				Expect(fakeUpdateServiceBrokerActor.GetServiceBrokerByNameArgsForCall(0)).To(Equal(serviceBrokerName))
   104  			})
   105  		})
   106  
   107  		When("the UpdateServiceBroker actor fails to update the broker", func() {
   108  			It("returns the error and displays any warnings", func() {
   109  				fakeUpdateServiceBrokerActor.UpdateServiceBrokerReturns(v7action.Warnings{"a-warning"}, errors.New("something went wrong"))
   110  
   111  				err := cmd.Execute(nil)
   112  
   113  				Expect(err).To(HaveOccurred())
   114  				Expect(err.Error()).To(Equal("something went wrong"))
   115  				Expect(testUI.Err).To(Say("a-warning"))
   116  			})
   117  		})
   118  
   119  		When("it fails to get the current user", func() {
   120  			BeforeEach(func() {
   121  				fakeUpdateServiceBrokerActor.GetCurrentUserReturns(configv3.User{}, errors.New("no user found"))
   122  			})
   123  
   124  			It("returns the error and displays all warnings", func() {
   125  				err := cmd.Execute(nil)
   126  
   127  				Expect(err).To(HaveOccurred())
   128  				Expect(err).To(MatchError("no user found"))
   129  			})
   130  		})
   131  
   132  		When("password is provided as environment variable", func() {
   133  			const (
   134  				varName     = "CF_BROKER_PASSWORD"
   135  				varPassword = "var-password"
   136  			)
   137  
   138  			BeforeEach(func() {
   139  				setPositionalFlags(cmd, serviceBrokerName, username, url, "")
   140  				os.Setenv(varName, varPassword)
   141  
   142  				Expect(cmd.Execute(nil)).To(Succeed())
   143  			})
   144  
   145  			AfterEach(func() {
   146  				os.Unsetenv(varName)
   147  			})
   148  
   149  			It("passes the data to the actor layer", func() {
   150  				Expect(fakeUpdateServiceBrokerActor.UpdateServiceBrokerCallCount()).To(Equal(1))
   151  				serviceBrokerGUID, model := fakeUpdateServiceBrokerActor.UpdateServiceBrokerArgsForCall(0)
   152  				Expect(serviceBrokerGUID).To(Equal(guid))
   153  				Expect(model.Username).To(Equal(username))
   154  				Expect(model.Password).To(Equal(varPassword))
   155  				Expect(model.URL).To(Equal(url))
   156  			})
   157  		})
   158  
   159  		When("password is provided via prompt", func() {
   160  			const promptPassword = "prompt-password"
   161  
   162  			BeforeEach(func() {
   163  				setPositionalFlags(cmd, serviceBrokerName, username, url, "")
   164  
   165  				_, err := input.Write([]byte(fmt.Sprintf("%s\n", promptPassword)))
   166  				Expect(err).NotTo(HaveOccurred())
   167  
   168  				Expect(cmd.Execute(nil)).To(Succeed())
   169  			})
   170  
   171  			It("prompts the user for credentials", func() {
   172  				Expect(testUI.Out).To(Say("Service Broker Password: "))
   173  			})
   174  
   175  			It("does not echo the credentials", func() {
   176  				Expect(testUI.Out).NotTo(Say(promptPassword))
   177  				Expect(testUI.Err).NotTo(Say(promptPassword))
   178  			})
   179  
   180  			It("passes the data to the actor layer", func() {
   181  				Expect(fakeUpdateServiceBrokerActor.UpdateServiceBrokerCallCount()).To(Equal(1))
   182  				serviceBrokerGUID, model := fakeUpdateServiceBrokerActor.UpdateServiceBrokerArgsForCall(0)
   183  				Expect(serviceBrokerGUID).To(Equal(guid))
   184  				Expect(model.Username).To(Equal(username))
   185  				Expect(model.Password).To(Equal(promptPassword))
   186  				Expect(model.URL).To(Equal(url))
   187  			})
   188  		})
   189  	})
   190  
   191  	When("not logged in", func() {
   192  		BeforeEach(func() {
   193  			fakeSharedActor.CheckTargetReturns(actionerror.NotLoggedInError{
   194  				BinaryName: binaryName,
   195  			})
   196  		})
   197  
   198  		It("returns an error", func() {
   199  			err := cmd.Execute(nil)
   200  
   201  			Expect(err).To(MatchError(actionerror.NotLoggedInError{BinaryName: binaryName}))
   202  
   203  			Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
   204  			checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0)
   205  			Expect(checkTargetedOrg).To(BeFalse())
   206  			Expect(checkTargetedSpace).To(BeFalse())
   207  		})
   208  	})
   209  })