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

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