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 })