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

     1  package v7_test
     2  
     3  import (
     4  	"github.com/LukasHeimann/cloudfoundrycli/v8/actor/actionerror"
     5  	"github.com/LukasHeimann/cloudfoundrycli/v8/actor/v7action"
     6  	"github.com/LukasHeimann/cloudfoundrycli/v8/cf/errors"
     7  	"github.com/LukasHeimann/cloudfoundrycli/v8/command/commandfakes"
     8  	"github.com/LukasHeimann/cloudfoundrycli/v8/command/translatableerror"
     9  	v7 "github.com/LukasHeimann/cloudfoundrycli/v8/command/v7"
    10  	"github.com/LukasHeimann/cloudfoundrycli/v8/command/v7/v7fakes"
    11  	"github.com/LukasHeimann/cloudfoundrycli/v8/util/configv3"
    12  	"github.com/LukasHeimann/cloudfoundrycli/v8/util/ui"
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  	. "github.com/onsi/gomega/gbytes"
    16  )
    17  
    18  var _ = Describe("delete-service-key Command", func() {
    19  	var (
    20  		cmd             v7.DeleteServiceKeyCommand
    21  		input           *Buffer
    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-key-name"
    33  		fakeSpaceGUID           = "fake-space-guid"
    34  	)
    35  
    36  	BeforeEach(func() {
    37  		input = NewBuffer()
    38  		testUI = ui.NewTestUI(input, NewBuffer(), NewBuffer())
    39  		fakeConfig = new(commandfakes.FakeConfig)
    40  		fakeSharedActor = new(commandfakes.FakeSharedActor)
    41  		fakeActor = new(v7fakes.FakeActor)
    42  
    43  		cmd = v7.DeleteServiceKeyCommand{
    44  			BaseCommand: v7.BaseCommand{
    45  				UI:          testUI,
    46  				Config:      fakeConfig,
    47  				SharedActor: fakeSharedActor,
    48  				Actor:       fakeActor,
    49  			},
    50  		}
    51  
    52  		fakeConfig.TargetedSpaceReturns(configv3.Space{GUID: fakeSpaceGUID})
    53  		fakeActor.GetCurrentUserReturns(configv3.User{Name: fakeUserName}, nil)
    54  
    55  		fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns(
    56  			nil,
    57  			v7action.Warnings{"fake warning"},
    58  			nil,
    59  		)
    60  
    61  		setPositionalFlags(&cmd, fakeServiceInstanceName, fakeServiceKeyName)
    62  		setFlag(&cmd, "-f")
    63  	})
    64  
    65  	JustBeforeEach(func() {
    66  		executeErr = cmd.Execute(nil)
    67  	})
    68  
    69  	It("checks the user is logged in, and targeting an org and space", func() {
    70  		Expect(executeErr).NotTo(HaveOccurred())
    71  
    72  		Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1))
    73  		actualOrg, actualSpace := fakeSharedActor.CheckTargetArgsForCall(0)
    74  		Expect(actualOrg).To(BeTrue())
    75  		Expect(actualSpace).To(BeTrue())
    76  	})
    77  
    78  	It("delegates to the actor", func() {
    79  		Expect(fakeActor.DeleteServiceKeyByServiceInstanceAndNameCallCount()).To(Equal(1))
    80  		actualServiceInstanceName, actualKeyName, actualSpaceGUID := fakeActor.DeleteServiceKeyByServiceInstanceAndNameArgsForCall(0)
    81  		Expect(actualKeyName).To(Equal(fakeServiceKeyName))
    82  		Expect(actualServiceInstanceName).To(Equal(fakeServiceInstanceName))
    83  		Expect(actualSpaceGUID).To(Equal(fakeSpaceGUID))
    84  	})
    85  
    86  	Describe("intro message", func() {
    87  		It("prints an intro and warnings", func() {
    88  			Expect(executeErr).NotTo(HaveOccurred())
    89  			Expect(testUI.Err).To(Say("fake warning"))
    90  
    91  			Expect(testUI.Out).To(Say(
    92  				`Deleting key %s for service instance %s as %s\.\.\.\n`,
    93  				fakeServiceKeyName,
    94  				fakeServiceInstanceName,
    95  				fakeUserName,
    96  			))
    97  		})
    98  	})
    99  
   100  	Describe("prompting the user", func() {
   101  		BeforeEach(func() {
   102  			setFlag(&cmd, "-f", false)
   103  		})
   104  
   105  		It("prompts the user", func() {
   106  			Expect(testUI.Out).To(Say(`Really delete the service key %s\? \[yN\]:`, fakeServiceKeyName))
   107  		})
   108  
   109  		When("user says no", func() {
   110  			BeforeEach(func() {
   111  				_, err := input.Write([]byte("n\n"))
   112  				Expect(err).NotTo(HaveOccurred())
   113  			})
   114  
   115  			It("does not call the actor", func() {
   116  				Expect(fakeActor.DeleteServiceKeyByServiceInstanceAndNameCallCount()).To(BeZero())
   117  			})
   118  
   119  			It("says the unbind was cancelled", func() {
   120  				Expect(executeErr).NotTo(HaveOccurred())
   121  				Expect(testUI.Out).To(Say("Delete cancelled\n"))
   122  			})
   123  		})
   124  
   125  		When("user says yes", func() {
   126  			BeforeEach(func() {
   127  				_, err := input.Write([]byte("y\n"))
   128  				Expect(err).NotTo(HaveOccurred())
   129  			})
   130  
   131  			It("calls the actor", func() {
   132  				Expect(fakeActor.DeleteServiceKeyByServiceInstanceAndNameCallCount()).To(Equal(1))
   133  			})
   134  		})
   135  	})
   136  
   137  	When("service key not found", func() {
   138  		BeforeEach(func() {
   139  			fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns(
   140  				nil,
   141  				v7action.Warnings{"key warning"},
   142  				actionerror.ServiceKeyNotFoundError{
   143  					KeyName:             fakeServiceKeyName,
   144  					ServiceInstanceName: fakeServiceInstanceName,
   145  				},
   146  			)
   147  		})
   148  
   149  		It("succeeds with a message", func() {
   150  			Expect(testUI.Err).To(Say("key warning"))
   151  			Expect(executeErr).NotTo(HaveOccurred())
   152  			Expect(testUI.Out).To(SatisfyAll(
   153  				Say(`\n`),
   154  				Say(`Service key %s does not exist for service instance %s\.\n`, fakeServiceKeyName, fakeServiceInstanceName),
   155  				Say(`OK\n`),
   156  			))
   157  		})
   158  	})
   159  
   160  	When("service instance not found", func() {
   161  		BeforeEach(func() {
   162  			fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns(
   163  				nil,
   164  				v7action.Warnings{"instance warning"},
   165  				actionerror.ServiceInstanceNotFoundError{Name: fakeServiceInstanceName},
   166  			)
   167  		})
   168  
   169  		It("returns an appropriate error", func() {
   170  			Expect(testUI.Err).To(Say("instance warning"))
   171  			Expect(executeErr).To(MatchError(translatableerror.ServiceInstanceNotFoundError{
   172  				Name: fakeServiceInstanceName,
   173  			}))
   174  		})
   175  	})
   176  
   177  	When("there is an error", func() {
   178  		BeforeEach(func() {
   179  			fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns(
   180  				nil,
   181  				v7action.Warnings{"bad warning"},
   182  				errors.New("boom"),
   183  			)
   184  		})
   185  
   186  		It("returns the error", func() {
   187  			Expect(testUI.Err).To(Say("bad warning"))
   188  			Expect(executeErr).To(MatchError("boom"))
   189  		})
   190  	})
   191  
   192  	Describe("processing the response stream", func() {
   193  		Context("nil stream", func() {
   194  			It("prints a message and warnings", func() {
   195  				Expect(testUI.Out).To(Say(`OK\n`))
   196  				Expect(testUI.Err).To(Say("fake warning"))
   197  			})
   198  		})
   199  
   200  		Context("stream goes to complete", func() {
   201  			BeforeEach(func() {
   202  				eventStream := make(chan v7action.PollJobEvent)
   203  				go func() {
   204  					eventStream <- v7action.PollJobEvent{
   205  						State:    v7action.JobProcessing,
   206  						Warnings: v7action.Warnings{"job processing warning"},
   207  					}
   208  					eventStream <- v7action.PollJobEvent{
   209  						State:    v7action.JobComplete,
   210  						Warnings: v7action.Warnings{"job complete warning"},
   211  					}
   212  					close(eventStream)
   213  				}()
   214  
   215  				fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns(
   216  					eventStream,
   217  					v7action.Warnings{"fake warning"},
   218  					nil,
   219  				)
   220  			})
   221  
   222  			It("prints a message and warnings", func() {
   223  				Expect(testUI.Out).To(Say(`OK\n`))
   224  
   225  				Expect(testUI.Err).To(SatisfyAll(
   226  					Say("fake warning"),
   227  					Say("job processing warning"),
   228  					Say("job complete warning"),
   229  				))
   230  			})
   231  		})
   232  
   233  		Context("stream goes to polling", func() {
   234  			BeforeEach(func() {
   235  				eventStream := make(chan v7action.PollJobEvent)
   236  				go func() {
   237  					eventStream <- v7action.PollJobEvent{
   238  						State:    v7action.JobProcessing,
   239  						Warnings: v7action.Warnings{"job processing warning"},
   240  					}
   241  					eventStream <- v7action.PollJobEvent{
   242  						State:    v7action.JobPolling,
   243  						Warnings: v7action.Warnings{"job polling warning"},
   244  					}
   245  				}()
   246  
   247  				fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns(
   248  					eventStream,
   249  					v7action.Warnings{"fake warning"},
   250  					nil,
   251  				)
   252  			})
   253  
   254  			It("prints a message and warnings", func() {
   255  				Expect(testUI.Out).To(SatisfyAll(
   256  					Say(`OK\n`),
   257  					Say(`\n`),
   258  					Say(`Delete in progress\.\n`),
   259  				))
   260  
   261  				Expect(testUI.Err).To(SatisfyAll(
   262  					Say("fake warning"),
   263  					Say("job processing warning"),
   264  					Say("job polling warning"),
   265  				))
   266  			})
   267  		})
   268  
   269  		Context("stream goes to error", func() {
   270  			BeforeEach(func() {
   271  				eventStream := make(chan v7action.PollJobEvent)
   272  				go func() {
   273  					eventStream <- v7action.PollJobEvent{
   274  						State:    v7action.JobFailed,
   275  						Warnings: v7action.Warnings{"job failed warning"},
   276  						Err:      errors.New("boom"),
   277  					}
   278  				}()
   279  
   280  				fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns(
   281  					eventStream,
   282  					v7action.Warnings{"fake warning"},
   283  					nil,
   284  				)
   285  			})
   286  
   287  			It("prints warnings and returns the error", func() {
   288  				Expect(executeErr).To(MatchError("boom"))
   289  
   290  				Expect(testUI.Err).To(SatisfyAll(
   291  					Say("fake warning"),
   292  					Say("job failed warning"),
   293  				))
   294  			})
   295  		})
   296  
   297  		When("--wait flag specified", func() {
   298  			BeforeEach(func() {
   299  				eventStream := make(chan v7action.PollJobEvent)
   300  				go func() {
   301  					eventStream <- v7action.PollJobEvent{
   302  						State:    v7action.JobProcessing,
   303  						Warnings: v7action.Warnings{"job processing warning"},
   304  					}
   305  					eventStream <- v7action.PollJobEvent{
   306  						State:    v7action.JobPolling,
   307  						Warnings: v7action.Warnings{"job polling warning"},
   308  					}
   309  					eventStream <- v7action.PollJobEvent{
   310  						State:    v7action.JobComplete,
   311  						Warnings: v7action.Warnings{"job complete warning"},
   312  					}
   313  					close(eventStream)
   314  				}()
   315  
   316  				fakeActor.DeleteServiceKeyByServiceInstanceAndNameReturns(
   317  					eventStream,
   318  					v7action.Warnings{"fake warning"},
   319  					nil,
   320  				)
   321  
   322  				setFlag(&cmd, "--wait")
   323  			})
   324  
   325  			It("waits for the event stream to complete", func() {
   326  				Expect(testUI.Out).To(SatisfyAll(
   327  					Say(`Waiting for the operation to complete\.\.\.\n`),
   328  					Say(`\n`),
   329  					Say(`OK\n`),
   330  				))
   331  
   332  				Expect(testUI.Err).To(SatisfyAll(
   333  					Say("fake warning"),
   334  					Say("job processing warning"),
   335  					Say("job polling warning"),
   336  					Say("job complete warning"),
   337  				))
   338  			})
   339  		})
   340  	})
   341  
   342  	When("checking the target returns an error", func() {
   343  		BeforeEach(func() {
   344  			fakeSharedActor.CheckTargetReturns(errors.New("explode"))
   345  		})
   346  
   347  		It("returns the error", func() {
   348  			Expect(executeErr).To(MatchError("explode"))
   349  		})
   350  	})
   351  
   352  	When("getting the username returns an error", func() {
   353  		BeforeEach(func() {
   354  			fakeActor.GetCurrentUserReturns(configv3.User{}, errors.New("bad thing"))
   355  		})
   356  
   357  		It("returns the error", func() {
   358  			Expect(executeErr).To(MatchError("bad thing"))
   359  		})
   360  	})
   361  })