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