github.com/LukasHeimann/cloudfoundrycli/v8@v8.4.4/command/v7/create_user_provided_service_command_test.go (about)

     1  package v7_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	"github.com/LukasHeimann/cloudfoundrycli/v8/types"
     7  
     8  	"github.com/LukasHeimann/cloudfoundrycli/v8/actor/v7action"
     9  	"github.com/LukasHeimann/cloudfoundrycli/v8/command/commandfakes"
    10  	"github.com/LukasHeimann/cloudfoundrycli/v8/command/flag"
    11  	. "github.com/LukasHeimann/cloudfoundrycli/v8/command/v7"
    12  	"github.com/LukasHeimann/cloudfoundrycli/v8/command/v7/v7fakes"
    13  	"github.com/LukasHeimann/cloudfoundrycli/v8/resources"
    14  	"github.com/LukasHeimann/cloudfoundrycli/v8/util/configv3"
    15  	"github.com/LukasHeimann/cloudfoundrycli/v8/util/ui"
    16  	. "github.com/onsi/ginkgo"
    17  	. "github.com/onsi/gomega"
    18  	. "github.com/onsi/gomega/gbytes"
    19  )
    20  
    21  var _ = Describe("create-user-provided-service Command", func() {
    22  	var (
    23  		input           *Buffer
    24  		testUI          *ui.UI
    25  		fakeConfig      *commandfakes.FakeConfig
    26  		fakeActor       *v7fakes.FakeActor
    27  		fakeSharedActor *commandfakes.FakeSharedActor
    28  		cmd             CreateUserProvidedServiceCommand
    29  		executeErr      error
    30  	)
    31  
    32  	BeforeEach(func() {
    33  		input = NewBuffer()
    34  		testUI = ui.NewTestUI(input, NewBuffer(), NewBuffer())
    35  		fakeConfig = new(commandfakes.FakeConfig)
    36  		fakeActor = new(v7fakes.FakeActor)
    37  		fakeSharedActor = new(commandfakes.FakeSharedActor)
    38  
    39  		cmd = CreateUserProvidedServiceCommand{
    40  			BaseCommand: BaseCommand{
    41  				UI:          testUI,
    42  				Config:      fakeConfig,
    43  				SharedActor: fakeSharedActor,
    44  				Actor:       fakeActor,
    45  			},
    46  		}
    47  	})
    48  
    49  	JustBeforeEach(func() {
    50  		executeErr = cmd.Execute(nil)
    51  	})
    52  
    53  	It("checks the user is logged in, and targeting an org and space", func() {
    54  		Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
    55  		orgChecked, spaceChecked := fakeSharedActor.CheckTargetArgsForCall(0)
    56  		Expect(orgChecked).To(BeTrue())
    57  		Expect(spaceChecked).To(BeTrue())
    58  	})
    59  
    60  	When("checking the target returns an error", func() {
    61  		BeforeEach(func() {
    62  			fakeSharedActor.CheckTargetReturns(errors.New("explode"))
    63  		})
    64  
    65  		It("returns the error", func() {
    66  			Expect(executeErr).To(MatchError("explode"))
    67  		})
    68  	})
    69  
    70  	When("the user is logged in, and is targeting an org and space", func() {
    71  		const (
    72  			fakeServiceInstanceName = "fake-service-instance-name"
    73  			fakeOrgName             = "fake-org-name"
    74  			fakeSpaceName           = "fake-space-name"
    75  			fakeSpaceGUID           = "fake-space-guid"
    76  			fakeUserName            = "fake-user-name"
    77  		)
    78  
    79  		BeforeEach(func() {
    80  			fakeConfig.TargetedSpaceReturns(configv3.Space{
    81  				Name: fakeSpaceName,
    82  				GUID: fakeSpaceGUID,
    83  			})
    84  
    85  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{
    86  				Name: fakeOrgName,
    87  			})
    88  
    89  			fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil)
    90  
    91  			setPositionalFlags(&cmd, fakeServiceInstanceName)
    92  
    93  			fakeActor.CreateUserProvidedServiceInstanceReturns(v7action.Warnings{"be warned", "take care"}, nil)
    94  		})
    95  
    96  		It("succeeds", func() {
    97  			Expect(executeErr).NotTo(HaveOccurred())
    98  		})
    99  
   100  		It("prints a message and warnings", func() {
   101  			Expect(testUI.Out).To(SatisfyAll(
   102  				Say("Creating user provided service %s in org %s / space %s as %s...", fakeServiceInstanceName, fakeOrgName, fakeSpaceName, fakeUserName),
   103  				Say("OK"),
   104  			))
   105  
   106  			Expect(testUI.Err).To(SatisfyAll(
   107  				Say("be warned"),
   108  				Say("take care"),
   109  			))
   110  		})
   111  
   112  		It("calls the actor with the service instance name and space GUID", func() {
   113  			Expect(fakeActor.CreateUserProvidedServiceInstanceCallCount()).To(Equal(1))
   114  			serviceInstance := fakeActor.CreateUserProvidedServiceInstanceArgsForCall(0)
   115  			Expect(serviceInstance).To(Equal(resources.ServiceInstance{
   116  				Name:      fakeServiceInstanceName,
   117  				SpaceGUID: fakeSpaceGUID,
   118  			}))
   119  		})
   120  
   121  		When("all optional arguments are provided", func() {
   122  			BeforeEach(func() {
   123  				setFlag(&cmd, "-t", flag.Tags{IsSet: true, Value: []string{"list", "of", "tags"}})
   124  				setFlag(&cmd, "-l", flag.OptionalString{IsSet: true, Value: "https://fake-sylogg.com"})
   125  				setFlag(&cmd, "-r", flag.OptionalString{IsSet: true, Value: "https://fake-route.com"})
   126  				setFlag(&cmd, "-p", flag.CredentialsOrJSON{
   127  					OptionalObject: types.OptionalObject{
   128  						IsSet: true,
   129  						Value: map[string]interface{}{
   130  							"foo": "bar",
   131  							"baz": 42,
   132  						},
   133  					},
   134  				})
   135  			})
   136  
   137  			It("calls the actor with all the flag values", func() {
   138  				Expect(fakeActor.CreateUserProvidedServiceInstanceCallCount()).To(Equal(1))
   139  				serviceInstance := fakeActor.CreateUserProvidedServiceInstanceArgsForCall(0)
   140  				Expect(serviceInstance).To(Equal(resources.ServiceInstance{
   141  					Name:            fakeServiceInstanceName,
   142  					SpaceGUID:       fakeSpaceGUID,
   143  					Tags:            types.NewOptionalStringSlice("list", "of", "tags"),
   144  					SyslogDrainURL:  types.NewOptionalString("https://fake-sylogg.com"),
   145  					RouteServiceURL: types.NewOptionalString("https://fake-route.com"),
   146  					Credentials: types.NewOptionalObject(map[string]interface{}{
   147  						"foo": "bar",
   148  						"baz": 42,
   149  					}),
   150  				}))
   151  			})
   152  		})
   153  
   154  		When("setting credentials interactively", func() {
   155  			BeforeEach(func() {
   156  				cmd.Credentials.IsSet = true
   157  				cmd.Credentials.UserPromptCredentials = []string{"pass phrase", "cred"}
   158  
   159  				_, err := input.Write([]byte("very secret passphrase\nsecret cred\n"))
   160  				Expect(err).NotTo(HaveOccurred())
   161  			})
   162  
   163  			It("prompts the user for credentials", func() {
   164  				Expect(testUI.Out).To(Say("pass phrase: "))
   165  				Expect(testUI.Out).To(Say("cred: "))
   166  			})
   167  
   168  			It("does not echo the credentials", func() {
   169  				Expect(testUI.Out).NotTo(Say("secret"))
   170  				Expect(testUI.Err).NotTo(Say("secret"))
   171  			})
   172  
   173  			It("succeeds", func() {
   174  				Expect(executeErr).NotTo(HaveOccurred())
   175  
   176  				Expect(fakeActor.CreateUserProvidedServiceInstanceCallCount()).To(Equal(1))
   177  				serviceInstance := fakeActor.CreateUserProvidedServiceInstanceArgsForCall(0)
   178  				Expect(serviceInstance).To(Equal(resources.ServiceInstance{
   179  					Name:      fakeServiceInstanceName,
   180  					SpaceGUID: fakeSpaceGUID,
   181  					Credentials: types.NewOptionalObject(map[string]interface{}{
   182  						"pass phrase": "very secret passphrase",
   183  						"cred":        "secret cred",
   184  					}),
   185  				}))
   186  			})
   187  		})
   188  
   189  		When("getting the user fails", func() {
   190  			BeforeEach(func() {
   191  				fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, errors.New("boom"))
   192  			})
   193  
   194  			It("returns the error", func() {
   195  				Expect(executeErr).To(MatchError("boom"))
   196  			})
   197  		})
   198  
   199  		When("the actor returns an error", func() {
   200  			BeforeEach(func() {
   201  				fakeActor.CreateUserProvidedServiceInstanceReturns(v7action.Warnings{"be warned", "take care"}, errors.New("bang"))
   202  			})
   203  
   204  			It("returns the error", func() {
   205  				Expect(executeErr).To(MatchError("bang"))
   206  			})
   207  
   208  			It("prints a message and warnings", func() {
   209  				Expect(testUI.Out).To(Say("Creating user provided service %s in org %s / space %s as %s...", fakeServiceInstanceName, fakeOrgName, fakeSpaceName, fakeUserName))
   210  				Expect(testUI.Out).NotTo(Say("OK"))
   211  
   212  				Expect(testUI.Err).To(SatisfyAll(
   213  					Say("be warned"),
   214  					Say("take care"),
   215  				))
   216  			})
   217  		})
   218  	})
   219  })