github.com/DaAlbrecht/cf-cli@v0.0.0-20231128151943-1fe19bb400b9/command/v7/create_service_key_command_test.go (about)

     1  package v7_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	"code.cloudfoundry.org/cli/actor/actionerror"
     7  	"code.cloudfoundry.org/cli/actor/v7action"
     8  	"code.cloudfoundry.org/cli/command/commandfakes"
     9  	v7 "code.cloudfoundry.org/cli/command/v7"
    10  	"code.cloudfoundry.org/cli/command/v7/v7fakes"
    11  	"code.cloudfoundry.org/cli/types"
    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("create-service-key Command", func() {
    20  	var (
    21  		cmd             v7.CreateServiceKeyCommand
    22  		testUI          *ui.UI
    23  		fakeConfig      *commandfakes.FakeConfig
    24  		fakeSharedActor *commandfakes.FakeSharedActor
    25  		executeErr      error
    26  		fakeActor       *v7fakes.FakeActor
    27  	)
    28  
    29  	const (
    30  		fakeUserName            = "fake-user-name"
    31  		fakeServiceInstanceName = "fake-service-instance-name"
    32  		fakeServiceKeyName      = "fake-service-key-name"
    33  		fakeSpaceGUID           = "fake-space-guid"
    34  	)
    35  
    36  	BeforeEach(func() {
    37  		testUI = ui.NewTestUI(NewBuffer(), NewBuffer(), NewBuffer())
    38  		fakeConfig = new(commandfakes.FakeConfig)
    39  		fakeSharedActor = new(commandfakes.FakeSharedActor)
    40  		fakeActor = new(v7fakes.FakeActor)
    41  
    42  		cmd = v7.CreateServiceKeyCommand{
    43  			BaseCommand: v7.BaseCommand{
    44  				UI:          testUI,
    45  				Config:      fakeConfig,
    46  				SharedActor: fakeSharedActor,
    47  				Actor:       fakeActor,
    48  			},
    49  		}
    50  
    51  		fakeConfig.TargetedSpaceReturns(configv3.Space{GUID: fakeSpaceGUID})
    52  		fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil)
    53  
    54  		fakeActor.CreateServiceKeyReturns(
    55  			nil,
    56  			v7action.Warnings{"fake warning"},
    57  			nil,
    58  		)
    59  
    60  		setPositionalFlags(&cmd, fakeServiceInstanceName, fakeServiceKeyName)
    61  		setFlag(&cmd, "-c", `{"foo": "bar"}`)
    62  	})
    63  
    64  	JustBeforeEach(func() {
    65  		executeErr = cmd.Execute(nil)
    66  	})
    67  
    68  	It("checks the user is logged in, and targeting an org and space", func() {
    69  		Expect(executeErr).NotTo(HaveOccurred())
    70  
    71  		Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
    72  		actualOrg, actualSpace := fakeSharedActor.CheckTargetArgsForCall(0)
    73  		Expect(actualOrg).To(BeTrue())
    74  		Expect(actualSpace).To(BeTrue())
    75  	})
    76  
    77  	It("delegates to the actor", func() {
    78  		Expect(fakeActor.CreateServiceKeyCallCount()).To(Equal(1))
    79  		Expect(fakeActor.CreateServiceKeyArgsForCall(0)).To(Equal(v7action.CreateServiceKeyParams{
    80  			SpaceGUID:           fakeSpaceGUID,
    81  			ServiceInstanceName: fakeServiceInstanceName,
    82  			ServiceKeyName:      fakeServiceKeyName,
    83  			Parameters:          types.NewOptionalObject(map[string]interface{}{"foo": "bar"}),
    84  		}))
    85  	})
    86  
    87  	It("displays messages and warnings", func() {
    88  		Expect(executeErr).NotTo(HaveOccurred())
    89  
    90  		Expect(testUI.Out).To(SatisfyAll(
    91  			Say(`Creating service key %s for service instance %s as %s\.\.\.\n`, fakeServiceKeyName, fakeServiceInstanceName, fakeUserName),
    92  			Say(`OK\n`),
    93  		))
    94  
    95  		Expect(testUI.Err).To(Say("fake warning"))
    96  	})
    97  
    98  	When("key already exists", func() {
    99  		BeforeEach(func() {
   100  			fakeActor.CreateServiceKeyReturns(
   101  				nil,
   102  				v7action.Warnings{"fake warning"},
   103  				actionerror.ResourceAlreadyExistsError{},
   104  			)
   105  		})
   106  
   107  		It("prints a message and warnings", func() {
   108  			Expect(testUI.Out).To(SatisfyAll(
   109  				Say(`\n`),
   110  				Say(`Service key %s already exists\n`, fakeServiceKeyName),
   111  				Say(`OK\n`),
   112  			))
   113  
   114  			Expect(testUI.Err).To(Say("fake warning"))
   115  		})
   116  	})
   117  
   118  	Describe("processing the response stream", func() {
   119  		Context("nil stream", func() {
   120  			It("prints a message and warnings", func() {
   121  				Expect(testUI.Out).To(Say(`OK\n`))
   122  				Expect(testUI.Err).To(Say("fake warning"))
   123  			})
   124  		})
   125  
   126  		Context("stream goes to complete", func() {
   127  			BeforeEach(func() {
   128  				eventStream := make(chan v7action.PollJobEvent)
   129  				go func() {
   130  					eventStream <- v7action.PollJobEvent{
   131  						State:    v7action.JobProcessing,
   132  						Warnings: v7action.Warnings{"job processing warning"},
   133  					}
   134  					eventStream <- v7action.PollJobEvent{
   135  						State:    v7action.JobComplete,
   136  						Warnings: v7action.Warnings{"job complete warning"},
   137  					}
   138  					close(eventStream)
   139  				}()
   140  
   141  				fakeActor.CreateServiceKeyReturns(
   142  					eventStream,
   143  					v7action.Warnings{"fake warning"},
   144  					nil,
   145  				)
   146  			})
   147  
   148  			It("prints a message and warnings", func() {
   149  				Expect(testUI.Out).To(Say(`OK\n`))
   150  
   151  				Expect(testUI.Err).To(SatisfyAll(
   152  					Say("fake warning"),
   153  					Say("job processing warning"),
   154  					Say("job complete warning"),
   155  				))
   156  			})
   157  		})
   158  
   159  		Context("stream goes to polling", func() {
   160  			BeforeEach(func() {
   161  				eventStream := make(chan v7action.PollJobEvent)
   162  				go func() {
   163  					eventStream <- v7action.PollJobEvent{
   164  						State:    v7action.JobProcessing,
   165  						Warnings: v7action.Warnings{"job processing warning"},
   166  					}
   167  					eventStream <- v7action.PollJobEvent{
   168  						State:    v7action.JobPolling,
   169  						Warnings: v7action.Warnings{"job polling warning"},
   170  					}
   171  				}()
   172  
   173  				fakeActor.CreateServiceKeyReturns(
   174  					eventStream,
   175  					v7action.Warnings{"fake warning"},
   176  					nil,
   177  				)
   178  			})
   179  
   180  			It("prints a message and warnings", func() {
   181  				Expect(testUI.Out).To(SatisfyAll(
   182  					Say(`OK\n`),
   183  					Say(`\n`),
   184  					Say(`Create in progress\.\n`),
   185  				))
   186  
   187  				Expect(testUI.Err).To(SatisfyAll(
   188  					Say("fake warning"),
   189  					Say("job processing warning"),
   190  					Say("job polling warning"),
   191  				))
   192  			})
   193  		})
   194  
   195  		Context("stream goes to error", func() {
   196  			BeforeEach(func() {
   197  				eventStream := make(chan v7action.PollJobEvent)
   198  				go func() {
   199  					eventStream <- v7action.PollJobEvent{
   200  						State:    v7action.JobFailed,
   201  						Warnings: v7action.Warnings{"job failed warning"},
   202  						Err:      errors.New("boom"),
   203  					}
   204  				}()
   205  
   206  				fakeActor.CreateServiceKeyReturns(
   207  					eventStream,
   208  					v7action.Warnings{"fake warning"},
   209  					nil,
   210  				)
   211  			})
   212  
   213  			It("prints warnings and returns the error", func() {
   214  				Expect(executeErr).To(MatchError("boom"))
   215  
   216  				Expect(testUI.Err).To(SatisfyAll(
   217  					Say("fake warning"),
   218  					Say("job failed warning"),
   219  				))
   220  			})
   221  		})
   222  
   223  		When("--wait flag specified", func() {
   224  			BeforeEach(func() {
   225  				eventStream := make(chan v7action.PollJobEvent)
   226  				go func() {
   227  					eventStream <- v7action.PollJobEvent{
   228  						State:    v7action.JobProcessing,
   229  						Warnings: v7action.Warnings{"job processing warning"},
   230  					}
   231  					eventStream <- v7action.PollJobEvent{
   232  						State:    v7action.JobPolling,
   233  						Warnings: v7action.Warnings{"job polling warning"},
   234  					}
   235  					eventStream <- v7action.PollJobEvent{
   236  						State:    v7action.JobComplete,
   237  						Warnings: v7action.Warnings{"job complete warning"},
   238  					}
   239  					close(eventStream)
   240  				}()
   241  
   242  				fakeActor.CreateServiceKeyReturns(
   243  					eventStream,
   244  					v7action.Warnings{"fake warning"},
   245  					nil,
   246  				)
   247  
   248  				setFlag(&cmd, "--wait")
   249  			})
   250  
   251  			It("waits for the event stream to complete", func() {
   252  				Expect(testUI.Out).To(SatisfyAll(
   253  					Say(`Waiting for the operation to complete\.\.\.\n`),
   254  					Say(`\n`),
   255  					Say(`OK\n`),
   256  				))
   257  
   258  				Expect(testUI.Err).To(SatisfyAll(
   259  					Say("fake warning"),
   260  					Say("job processing warning"),
   261  					Say("job polling warning"),
   262  					Say("job complete warning"),
   263  				))
   264  			})
   265  		})
   266  	})
   267  
   268  	When("checking the target returns an error", func() {
   269  		BeforeEach(func() {
   270  			fakeSharedActor.CheckTargetReturns(errors.New("explode"))
   271  		})
   272  
   273  		It("returns the error", func() {
   274  			Expect(executeErr).To(MatchError("explode"))
   275  		})
   276  	})
   277  
   278  	When("actor returns error", func() {
   279  		BeforeEach(func() {
   280  			fakeActor.CreateServiceKeyReturns(
   281  				nil,
   282  				v7action.Warnings{"fake warning"},
   283  				errors.New("boom"),
   284  			)
   285  		})
   286  
   287  		It("prints warnings and returns the error", func() {
   288  			Expect(testUI.Err).To(Say("fake warning"))
   289  			Expect(executeErr).To(MatchError("boom"))
   290  		})
   291  	})
   292  
   293  	When("getting the username returns an error", func() {
   294  		BeforeEach(func() {
   295  			fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bad thing"))
   296  		})
   297  
   298  		It("returns the error", func() {
   299  			Expect(executeErr).To(MatchError("bad thing"))
   300  		})
   301  	})
   302  })