/** * @expectedException \Mcfedr\TwitterPushBundle\Exception\MaxPushesPerHourException */ public function testPushTweetRate() { $arn = 'topic'; $messagesMock = $this->getMockBuilder(Messages::class)->disableOriginalConstructor()->setMethods(['send'])->getMock(); $messagesMock->expects($this->exactly(5))->method('send')->with($this->isInstanceOf(Message::class), $this->equalTo($arn)); $service = new TweetPusher($messagesMock, $arn, null, null, 5, new ArrayCache()); for ($i = 0; $i < 6; $i++) { $service->pushTweet($this->getTweet()); } }
protected function execute(InputInterface $input, OutputInterface $output) { $this->logger->info("Opening twitter stream to follow user {$this->userid}"); $response = $this->client->post('statuses/filter.json', ['form_params' => ['follow' => $this->userid], 'stream' => true]); $stream = $response->getBody(); // Read until the stream is closed $this->logger->info('Reading stream'); $line = ''; while (!$stream->eof()) { $line .= $stream->read(static::BLOCK_SIZE); while (strstr($line, "\r\n") !== false) { list($json, $line) = explode("\r\n", $line, 2); $this->logger->debug('Got a line', ['line' => $json]); if (trim($json) == '') { $this->logger->debug('Keep alive'); continue; } $data = json_decode($json, true); if (isset($data['text'])) { $this->logger->info('Received tweet', ['tweet' => $data]); //Filter replies and retweets if ($data['user']['id_str'] == $this->userid) { try { $this->pusher->pushTweet($data); $this->logger->notice('Sent tweet', ['TweetId' => $data['id_str']]); } catch (\Exception $e) { $this->logger->error("Failed to push", ['TweetId' => $data['id_str'], 'Exception' => $e]); } } else { $this->logger->info('Ignored tweet', ['TweetId' => $data['id_str']]); } } else { $this->logger->debug('Other message', ['message' => $data]); } } } $this->logger->info('Stream finished'); }