code.cloudfoundry.org/cli@v7.1.0+incompatible/actor/v2v3action/application_summary_test.go (about)

     1  package v2v3action_test
     2  
     3  import (
     4  	"errors"
     5  
     6  	"code.cloudfoundry.org/cli/actor/actionerror"
     7  	"code.cloudfoundry.org/cli/actor/v2action"
     8  	. "code.cloudfoundry.org/cli/actor/v2v3action"
     9  	"code.cloudfoundry.org/cli/actor/v2v3action/v2v3actionfakes"
    10  	"code.cloudfoundry.org/cli/actor/v3action"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    12  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
    13  
    14  	. "github.com/onsi/ginkgo"
    15  	. "github.com/onsi/ginkgo/extensions/table"
    16  	. "github.com/onsi/gomega"
    17  )
    18  
    19  var _ = Describe("Application Summary Actions", func() {
    20  	var (
    21  		actor       *Actor
    22  		fakeV2Actor *v2v3actionfakes.FakeV2Actor
    23  		fakeV3Actor *v2v3actionfakes.FakeV3Actor
    24  	)
    25  
    26  	BeforeEach(func() {
    27  		fakeV2Actor = new(v2v3actionfakes.FakeV2Actor)
    28  		fakeV3Actor = new(v2v3actionfakes.FakeV3Actor)
    29  		actor = NewActor(fakeV2Actor, fakeV3Actor)
    30  	})
    31  
    32  	Describe("ApplicationSummary", func() {
    33  		DescribeTable("GetIsolationSegmentName",
    34  			func(summary ApplicationSummary, isoName string, exists bool) {
    35  				name, ok := summary.GetIsolationSegmentName()
    36  				Expect(ok).To(Equal(exists))
    37  				Expect(name).To(Equal(isoName))
    38  			},
    39  
    40  			Entry("when the there are application instances and the isolationSegmentName is set",
    41  				ApplicationSummary{
    42  					ApplicationInstanceWithStats: []v2action.ApplicationInstanceWithStats{{IsolationSegment: "some-name"}},
    43  				},
    44  				"some-name",
    45  				true,
    46  			),
    47  
    48  			Entry("when the there are application instances and the isolationSegmentName is blank",
    49  				ApplicationSummary{
    50  					ApplicationInstanceWithStats: []v2action.ApplicationInstanceWithStats{{}},
    51  				},
    52  				"",
    53  				false,
    54  			),
    55  
    56  			Entry("when the there are no application instances", ApplicationSummary{}, "", false),
    57  		)
    58  	})
    59  
    60  	Describe("GetApplicationSummaryByNameAndSpace", func() {
    61  		var (
    62  			appName              string
    63  			spaceGUID            string
    64  			withObfuscatedValues bool
    65  
    66  			summary    ApplicationSummary
    67  			warnings   Warnings
    68  			executeErr error
    69  		)
    70  
    71  		BeforeEach(func() {
    72  			appName = "some-app-name"
    73  			spaceGUID = "some-space-guid"
    74  			withObfuscatedValues = true
    75  		})
    76  
    77  		JustBeforeEach(func() {
    78  			summary, warnings, executeErr = actor.GetApplicationSummaryByNameAndSpace(appName, spaceGUID, withObfuscatedValues)
    79  		})
    80  
    81  		When("getting the V3 Application Summary is successful", func() {
    82  			Context("regardless of the application state", func() {
    83  				BeforeEach(func() {
    84  					v3Summary := v3action.ApplicationSummary{
    85  						Application: v3action.Application{
    86  							GUID: "some-app-guid",
    87  						},
    88  						ProcessSummaries: v3action.ProcessSummaries{
    89  							{Process: v3action.Process{Type: "console"}},
    90  							{Process: v3action.Process{Type: constant.ProcessTypeWeb}},
    91  						},
    92  					}
    93  					fakeV3Actor.GetApplicationSummaryByNameAndSpaceReturns(v3Summary, v3action.Warnings{"v3-summary-warning"}, nil)
    94  				})
    95  
    96  				It("returns the v3 application summary with sorted processes and warnings", func() {
    97  					Expect(executeErr).ToNot(HaveOccurred())
    98  					Expect(warnings).To(ConsistOf("v3-summary-warning"))
    99  					Expect(summary.ApplicationSummary).To(Equal(v3action.ApplicationSummary{
   100  						Application: v3action.Application{
   101  							GUID: "some-app-guid",
   102  						},
   103  						ProcessSummaries: v3action.ProcessSummaries{
   104  							{Process: v3action.Process{Type: constant.ProcessTypeWeb}},
   105  							{Process: v3action.Process{Type: "console"}},
   106  						},
   107  					}))
   108  
   109  					Expect(fakeV3Actor.GetApplicationSummaryByNameAndSpaceCallCount()).To(Equal(1))
   110  					passedAppName, passedSpaceGUID, passedWithObfuscatedValues := fakeV3Actor.GetApplicationSummaryByNameAndSpaceArgsForCall(0)
   111  					Expect(passedAppName).To(Equal(appName))
   112  					Expect(passedSpaceGUID).To(Equal(spaceGUID))
   113  					Expect(passedWithObfuscatedValues).To(Equal(withObfuscatedValues))
   114  				})
   115  
   116  				When("getting the routes is successful", func() {
   117  					BeforeEach(func() {
   118  						routes := v2action.Routes{
   119  							{GUID: "some-route-guid"},
   120  							{GUID: "some-other-route-guid"},
   121  						}
   122  
   123  						fakeV2Actor.GetApplicationRoutesReturns(routes, v2action.Warnings{"v2-routes-warnings"}, nil)
   124  					})
   125  
   126  					It("adds the routes to the summary", func() {
   127  						Expect(executeErr).ToNot(HaveOccurred())
   128  						Expect(warnings).To(ConsistOf("v2-routes-warnings", "v3-summary-warning"))
   129  
   130  						Expect(summary.Routes).To(Equal(v2action.Routes{
   131  							{GUID: "some-route-guid"},
   132  							{GUID: "some-other-route-guid"},
   133  						}))
   134  
   135  						Expect(fakeV2Actor.GetApplicationRoutesCallCount()).To(Equal(1))
   136  						Expect(fakeV2Actor.GetApplicationRoutesArgsForCall(0)).To(Equal("some-app-guid"))
   137  					})
   138  				})
   139  
   140  				When("getting the application routes errors", func() {
   141  					When("a generic error is returned", func() {
   142  						BeforeEach(func() {
   143  							fakeV2Actor.GetApplicationRoutesReturns(nil, v2action.Warnings{"v2-routes-warnings"}, errors.New("some-error"))
   144  						})
   145  
   146  						It("returns warnings and the error", func() {
   147  							Expect(executeErr).To(MatchError("some-error"))
   148  							Expect(warnings).To(ConsistOf("v2-routes-warnings", "v3-summary-warning"))
   149  						})
   150  					})
   151  
   152  					When("a ResourceNotFoundError is returned", func() {
   153  						BeforeEach(func() {
   154  							fakeV2Actor.GetApplicationRoutesReturns(nil, v2action.Warnings{"v2-routes-warnings"}, ccerror.ResourceNotFoundError{})
   155  						})
   156  
   157  						It("adds warnings and continues", func() {
   158  							Expect(executeErr).ToNot(HaveOccurred())
   159  							Expect(warnings).To(ConsistOf("v2-routes-warnings", "v3-summary-warning"))
   160  						})
   161  					})
   162  				})
   163  			})
   164  
   165  			When("the application is running", func() {
   166  				BeforeEach(func() {
   167  					v3Summary := v3action.ApplicationSummary{
   168  						Application: v3action.Application{
   169  							GUID:  "some-app-guid",
   170  							State: constant.ApplicationStarted,
   171  						},
   172  					}
   173  					fakeV3Actor.GetApplicationSummaryByNameAndSpaceReturns(v3Summary, v3action.Warnings{"v3-summary-warning"}, nil)
   174  				})
   175  
   176  				When("getting the application instances with stats is successful", func() {
   177  					BeforeEach(func() {
   178  						stats := []v2action.ApplicationInstanceWithStats{{ID: 0}, {ID: 1}}
   179  						fakeV2Actor.GetApplicationInstancesWithStatsByApplicationReturns(stats, v2action.Warnings{"v2-app-instances-warning"}, nil)
   180  					})
   181  
   182  					It("returns the application summary with application instances with stats", func() {
   183  						Expect(executeErr).ToNot(HaveOccurred())
   184  						Expect(warnings).To(ConsistOf("v2-app-instances-warning", "v3-summary-warning"))
   185  						Expect(summary.ApplicationInstanceWithStats).To(Equal([]v2action.ApplicationInstanceWithStats{{ID: 0}, {ID: 1}}))
   186  
   187  						Expect(fakeV2Actor.GetApplicationInstancesWithStatsByApplicationCallCount()).To(Equal(1))
   188  					})
   189  				})
   190  
   191  				When("getting the application instances with stats returns an error", func() {
   192  					When("a generic error is returned", func() {
   193  						BeforeEach(func() {
   194  							fakeV2Actor.GetApplicationInstancesWithStatsByApplicationReturns(nil, v2action.Warnings{"v2-app-instances-warning"}, errors.New("boom"))
   195  						})
   196  
   197  						It("returns error and warnings", func() {
   198  							Expect(executeErr).To(MatchError("boom"))
   199  							Expect(warnings).To(ConsistOf("v2-app-instances-warning", "v3-summary-warning"))
   200  						})
   201  					})
   202  
   203  					When("a ApplicationInstancesNotFoundError is returned", func() {
   204  						BeforeEach(func() {
   205  							fakeV2Actor.GetApplicationInstancesWithStatsByApplicationReturns(nil, v2action.Warnings{"v2-app-instances-warning"}, actionerror.ApplicationInstancesNotFoundError{})
   206  						})
   207  
   208  						It("adds warnings and continues", func() {
   209  							Expect(executeErr).ToNot(HaveOccurred())
   210  							Expect(warnings).To(ConsistOf("v2-app-instances-warning", "v3-summary-warning"))
   211  						})
   212  					})
   213  				})
   214  			})
   215  
   216  			When("the application is stopped", func() {
   217  				BeforeEach(func() {
   218  					v3Summary := v3action.ApplicationSummary{
   219  						Application: v3action.Application{
   220  							GUID:  "some-app-guid",
   221  							State: constant.ApplicationStopped,
   222  						},
   223  					}
   224  					fakeV3Actor.GetApplicationSummaryByNameAndSpaceReturns(v3Summary, v3action.Warnings{"v3-summary-warning"}, nil)
   225  				})
   226  
   227  				It("does not get application instances with stats", func() {
   228  					Expect(executeErr).ToNot(HaveOccurred())
   229  					Expect(warnings).To(ConsistOf("v3-summary-warning"))
   230  
   231  					Expect(fakeV2Actor.GetApplicationInstancesWithStatsByApplicationCallCount()).To(Equal(0))
   232  				})
   233  			})
   234  		})
   235  
   236  		When("getting the V3 Application Summary returns an error", func() {
   237  			BeforeEach(func() {
   238  				fakeV3Actor.GetApplicationSummaryByNameAndSpaceReturns(v3action.ApplicationSummary{}, v3action.Warnings{"v3-summary-warning"}, errors.New("CRAZY!"))
   239  			})
   240  
   241  			It("returns back error and warnings", func() {
   242  				Expect(executeErr).To(MatchError("CRAZY!"))
   243  				Expect(warnings).To(ConsistOf("v3-summary-warning"))
   244  			})
   245  		})
   246  	})
   247  })