github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/command/v2/logs_command_test.go (about)

     1  package v2_test
     2  
     3  import (
     4  	"errors"
     5  	"time"
     6  
     7  	"github.com/cloudfoundry/noaa/consumer"
     8  	"github.com/liamawhite/cli-with-i18n/actor/sharedaction"
     9  	"github.com/liamawhite/cli-with-i18n/actor/v2action"
    10  	"github.com/liamawhite/cli-with-i18n/command/commandfakes"
    11  	"github.com/liamawhite/cli-with-i18n/command/translatableerror"
    12  	. "github.com/liamawhite/cli-with-i18n/command/v2"
    13  	"github.com/liamawhite/cli-with-i18n/command/v2/v2fakes"
    14  	"github.com/liamawhite/cli-with-i18n/util/configv3"
    15  	"github.com/liamawhite/cli-with-i18n/util/ui"
    16  	. "github.com/onsi/ginkgo"
    17  	. "github.com/onsi/gomega"
    18  	. "github.com/onsi/gomega/gbytes"
    19  )
    20  
    21  var _ = Describe("logs command", func() {
    22  	var (
    23  		cmd             LogsCommand
    24  		testUI          *ui.UI
    25  		fakeConfig      *commandfakes.FakeConfig
    26  		fakeSharedActor *commandfakes.FakeSharedActor
    27  		fakeActor       *v2fakes.FakeLogsActor
    28  		noaaClient      *consumer.Consumer
    29  		binaryName      string
    30  		executeErr      error
    31  	)
    32  
    33  	BeforeEach(func() {
    34  		testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
    35  		fakeConfig = new(commandfakes.FakeConfig)
    36  		fakeSharedActor = new(commandfakes.FakeSharedActor)
    37  		fakeActor = new(v2fakes.FakeLogsActor)
    38  		noaaClient = new(consumer.Consumer)
    39  
    40  		cmd = LogsCommand{
    41  			UI:          testUI,
    42  			Config:      fakeConfig,
    43  			SharedActor: fakeSharedActor,
    44  			Actor:       fakeActor,
    45  			NOAAClient:  noaaClient,
    46  		}
    47  
    48  		binaryName = "faceman"
    49  		fakeConfig.BinaryNameReturns(binaryName)
    50  		cmd.RequiredArgs.AppName = "some-app"
    51  		fakeConfig.CurrentUserReturns(configv3.User{Name: "some-user"}, nil)
    52  	})
    53  
    54  	JustBeforeEach(func() {
    55  		executeErr = cmd.Execute(nil)
    56  	})
    57  
    58  	Context("when the checkTarget fails", func() {
    59  		BeforeEach(func() {
    60  			fakeSharedActor.CheckTargetReturns(
    61  				sharedaction.NotLoggedInError{BinaryName: binaryName})
    62  		})
    63  		It("returns an error", func() {
    64  			_, orgRequired, spaceRequired := fakeSharedActor.CheckTargetArgsForCall(0)
    65  			Expect(orgRequired).To(BeTrue())
    66  			Expect(spaceRequired).To(BeTrue())
    67  
    68  			Expect(executeErr).To(MatchError(
    69  				translatableerror.NotLoggedInError{BinaryName: binaryName}))
    70  		})
    71  	})
    72  
    73  	Context("when checkTarget succeeds", func() {
    74  		BeforeEach(func() {
    75  			fakeConfig.TargetedSpaceReturns(configv3.Space{
    76  				Name: "some-space-name",
    77  				GUID: "some-space-guid",
    78  			})
    79  			fakeConfig.TargetedOrganizationReturns(configv3.Organization{
    80  				Name: "some-org-name",
    81  			})
    82  		})
    83  
    84  		Context("when the --recent flag is provided", func() {
    85  			BeforeEach(func() {
    86  				cmd.Recent = true
    87  			})
    88  
    89  			It("displays flavor text", func() {
    90  				Expect(testUI.Out).To(Say("Retrieving logs for app some-app in org some-org-name / space some-space-name as some-user..."))
    91  			})
    92  
    93  			Context("when the logs actor returns an error", func() {
    94  				var expectedErr error
    95  				BeforeEach(func() {
    96  					expectedErr = errors.New("some-error")
    97  					fakeActor.GetRecentLogsForApplicationByNameAndSpaceReturns(
    98  						nil,
    99  						v2action.Warnings{"some-warning-1", "some-warning-2"},
   100  						expectedErr)
   101  				})
   102  
   103  				It("displays the error", func() {
   104  					Expect(executeErr).To(MatchError(expectedErr))
   105  					Expect(testUI.Err).To(Say("some-warning-1"))
   106  					Expect(testUI.Err).To(Say("some-warning-2"))
   107  				})
   108  			})
   109  
   110  			Context("when the logs actor returns logs", func() {
   111  				BeforeEach(func() {
   112  					fakeActor.GetRecentLogsForApplicationByNameAndSpaceReturns(
   113  						[]v2action.LogMessage{
   114  							*v2action.NewLogMessage(
   115  								"i am message 1",
   116  								1,
   117  								time.Unix(0, 0),
   118  								"app",
   119  								"1",
   120  							),
   121  							*v2action.NewLogMessage(
   122  								"i am message 2",
   123  								1,
   124  								time.Unix(1, 0),
   125  								"another-app",
   126  								"2",
   127  							),
   128  						},
   129  						v2action.Warnings{"some-warning-1", "some-warning-2"},
   130  						nil)
   131  				})
   132  
   133  				It("displays the recent log messages and warnings", func() {
   134  					Expect(executeErr).NotTo(HaveOccurred())
   135  					Expect(testUI.Err).To(Say("some-warning-1"))
   136  					Expect(testUI.Err).To(Say("some-warning-2"))
   137  
   138  					Expect(testUI.Out).To(Say("i am message 1"))
   139  					Expect(testUI.Out).To(Say("i am message 2"))
   140  
   141  					Expect(fakeActor.GetRecentLogsForApplicationByNameAndSpaceCallCount()).To(Equal(1))
   142  					appName, spaceGUID, client, config := fakeActor.GetRecentLogsForApplicationByNameAndSpaceArgsForCall(0)
   143  
   144  					Expect(appName).To(Equal("some-app"))
   145  					Expect(spaceGUID).To(Equal("some-space-guid"))
   146  					Expect(client).To(Equal(noaaClient))
   147  					Expect(config).To(Equal(fakeConfig))
   148  				})
   149  			})
   150  		})
   151  
   152  		Context("when the --recent flag is not provided", func() {
   153  			BeforeEach(func() {
   154  				cmd.Recent = false
   155  			})
   156  
   157  			Context("when the logs setup returns an error", func() {
   158  				var expectedErr error
   159  
   160  				BeforeEach(func() {
   161  					expectedErr = errors.New("some-error")
   162  					fakeActor.GetStreamingLogsForApplicationByNameAndSpaceReturns(nil, nil, v2action.Warnings{"some-warning-1", "some-warning-2"}, expectedErr)
   163  				})
   164  
   165  				It("displays the error and all warnings", func() {
   166  					Expect(executeErr).To(MatchError(expectedErr))
   167  					Expect(testUI.Err).To(Say("some-warning-1"))
   168  					Expect(testUI.Err).To(Say("some-warning-2"))
   169  				})
   170  			})
   171  
   172  			Context("when the logs stream returns an error", func() {
   173  				var expectedErr error
   174  
   175  				BeforeEach(func() {
   176  					expectedErr = errors.New("some-error")
   177  
   178  					fakeActor.GetStreamingLogsForApplicationByNameAndSpaceStub = func(_ string, _ string, _ v2action.NOAAClient, _ v2action.Config) (<-chan *v2action.LogMessage, <-chan error, v2action.Warnings, error) {
   179  						messages := make(chan *v2action.LogMessage)
   180  						logErrs := make(chan error)
   181  
   182  						go func() {
   183  							logErrs <- expectedErr
   184  							close(messages)
   185  							close(logErrs)
   186  						}()
   187  
   188  						return messages, logErrs, v2action.Warnings{"some-warning-1", "some-warning-2"}, nil
   189  					}
   190  				})
   191  
   192  				It("displays the error and all warnings", func() {
   193  					Expect(executeErr).To(MatchError(expectedErr))
   194  					Expect(testUI.Err).To(Say("some-warning-1"))
   195  					Expect(testUI.Err).To(Say("some-warning-2"))
   196  				})
   197  			})
   198  
   199  			Context("when the logs actor returns logs", func() {
   200  				BeforeEach(func() {
   201  					fakeActor.GetStreamingLogsForApplicationByNameAndSpaceStub = func(_ string, _ string, _ v2action.NOAAClient, _ v2action.Config) (<-chan *v2action.LogMessage, <-chan error, v2action.Warnings, error) {
   202  						messages := make(chan *v2action.LogMessage)
   203  						logErrs := make(chan error)
   204  						message1 := v2action.NewLogMessage(
   205  							"i am message 1",
   206  							1,
   207  							time.Unix(0, 0),
   208  							"app",
   209  							"1",
   210  						)
   211  						message2 := v2action.NewLogMessage(
   212  							"i am message 2",
   213  							1,
   214  							time.Unix(1, 0),
   215  							"another-app",
   216  							"2",
   217  						)
   218  
   219  						go func() {
   220  							messages <- message1
   221  							messages <- message2
   222  							close(messages)
   223  							close(logErrs)
   224  						}()
   225  
   226  						return messages, logErrs, v2action.Warnings{"some-warning-1", "some-warning-2"}, nil
   227  					}
   228  				})
   229  
   230  				It("displays flavor text", func() {
   231  					Expect(testUI.Out).To(Say("Retrieving logs for app some-app in org some-org-name / space some-space-name as some-user..."))
   232  				})
   233  
   234  				It("displays all streaming log messages and warnings", func() {
   235  					Expect(executeErr).NotTo(HaveOccurred())
   236  					Expect(testUI.Err).To(Say("some-warning-1"))
   237  					Expect(testUI.Err).To(Say("some-warning-2"))
   238  
   239  					Expect(testUI.Out).To(Say("i am message 1"))
   240  					Expect(testUI.Out).To(Say("i am message 2"))
   241  
   242  					Expect(fakeActor.GetStreamingLogsForApplicationByNameAndSpaceCallCount()).To(Equal(1))
   243  					appName, spaceGUID, client, config := fakeActor.GetStreamingLogsForApplicationByNameAndSpaceArgsForCall(0)
   244  
   245  					Expect(appName).To(Equal("some-app"))
   246  					Expect(spaceGUID).To(Equal("some-space-guid"))
   247  					Expect(client).To(Equal(noaaClient))
   248  					Expect(config).To(Equal(fakeConfig))
   249  				})
   250  			})
   251  		})
   252  	})
   253  })