3 namespace Tests\Wallabag\ImportBundle\Import
;
5 use Wallabag\UserBundle\Entity\User
;
6 use Wallabag\CoreBundle\Entity\Entry
;
7 use Wallabag\ImportBundle\Import\PocketImport
;
9 use GuzzleHttp\Subscriber\Mock
;
10 use GuzzleHttp\Message\Response
;
11 use GuzzleHttp\Stream\Stream
;
13 use Monolog\Handler\TestHandler
;
15 class PocketImportMock
extends PocketImport
17 public function getAccessToken()
19 return $this->accessToken
;
23 class PocketImportTest
extends \PHPUnit_Framework_TestCase
28 protected $contentProxy;
29 protected $logHandler;
32 private function getPocketImport($consumerKey = 'ConsumerKey', $rabbitMQ = false)
34 $this->user
= new User();
36 $this->tokenStorage
= $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface')
37 ->disableOriginalConstructor()
40 $token = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')
41 ->disableOriginalConstructor()
44 $this->contentProxy
= $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
45 ->disableOriginalConstructor()
48 $token->expects($this->once())
50 ->willReturn($this->user
);
52 $this->tokenStorage
->expects($this->once())
56 $this->em
= $this->getMockBuilder('Doctrine\ORM\EntityManager')
57 ->disableOriginalConstructor()
60 $config = $this->getMockBuilder('Craue\ConfigBundle\Util\Config')
61 ->disableOriginalConstructor()
64 $config->expects($this->any())
66 ->with('pocket_consumer_key')
67 ->willReturn($consumerKey);
69 $this->producer
= $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
70 ->disableOriginalConstructor()
73 $pocket = new PocketImportMock(
81 $this->logHandler
= new TestHandler();
82 $logger = new Logger('test', [$this->logHandler
]);
83 $pocket->setLogger($logger);
88 public function testInit()
90 $pocketImport = $this->getPocketImport();
92 $this->assertEquals('Pocket', $pocketImport->getName());
93 $this->assertNotEmpty($pocketImport->getUrl());
94 $this->assertEquals('import.pocket.description', $pocketImport->getDescription());
97 public function testOAuthRequest()
99 $client = new Client();
102 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['code' => 'wunderbar_code']))),
105 $client->getEmitter()->attach($mock);
107 $pocketImport = $this->getPocketImport();
108 $pocketImport->setClient($client);
110 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect');
112 $this->assertEquals('wunderbar_code', $code);
115 public function testOAuthRequestBadResponse()
117 $client = new Client();
123 $client->getEmitter()->attach($mock);
125 $pocketImport = $this->getPocketImport();
126 $pocketImport->setClient($client);
128 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect');
130 $this->assertFalse($code);
132 $records = $this->logHandler
->getRecords();
133 $this->assertContains('PocketImport: Failed to request token', $records[0]['message']);
134 $this->assertEquals('ERROR', $records[0]['level_name']);
137 public function testOAuthAuthorize()
139 $client = new Client();
142 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
145 $client->getEmitter()->attach($mock);
147 $pocketImport = $this->getPocketImport();
148 $pocketImport->setClient($client);
150 $res = $pocketImport->authorize('wunderbar_code');
152 $this->assertTrue($res);
153 $this->assertEquals('wunderbar_token', $pocketImport->getAccessToken());
156 public function testOAuthAuthorizeBadResponse()
158 $client = new Client();
164 $client->getEmitter()->attach($mock);
166 $pocketImport = $this->getPocketImport();
167 $pocketImport->setClient($client);
169 $res = $pocketImport->authorize('wunderbar_code');
171 $this->assertFalse($res);
173 $records = $this->logHandler
->getRecords();
174 $this->assertContains('PocketImport: Failed to authorize client', $records[0]['message']);
175 $this->assertEquals('ERROR', $records[0]['level_name']);
179 * Will sample results from https://getpocket.com/developer/docs/v3/retrieve.
181 public function testImport()
183 $client = new Client();
186 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
187 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory('
192 "item_id": "229279689",
193 "resolved_id": "229279689",
194 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
195 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
198 "resolved_title": "The Massive Ryder Cup Preview",
199 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
200 "excerpt": "The list of things I love about the Ryder Cup is so long that it could fill a (tedious) novel, and golf fans can probably guess most of them.",
204 "word_count": "3197",
207 "item_id": "229279689",
209 "src": "http://a.espncdn.com/combiner/i?img=/photo/2012/0927/grant_g_ryder_cr_640.jpg&w=640&h=360",
212 "credit": "Jamie Squire/Getty Images",
218 "item_id": "229279689",
220 "src": "http://www.youtube.com/v/Er34PbFkVGk?version=3&hl=en_US&rel=0",
229 "item_id": "1147652870",
233 "item_id": "1147652870",
239 "item_id": "229279689",
240 "resolved_id": "229279689",
241 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
242 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
245 "resolved_title": "The Massive Ryder Cup Preview",
246 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
247 "excerpt": "The list of things I love about the Ryder Cup is so long that it could fill a (tedious) novel, and golf fans can probably guess most of them.",
258 $client->getEmitter()->attach($mock);
260 $pocketImport = $this->getPocketImport();
262 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
263 ->disableOriginalConstructor()
266 $entryRepo->expects($this->exactly(2))
267 ->method('findByUrlAndUserId')
268 ->will($this->onConsecutiveCalls(false, true));
271 ->expects($this->exactly(2))
272 ->method('getRepository')
273 ->willReturn($entryRepo);
275 $entry = new Entry($this->user
);
278 ->expects($this->once())
279 ->method('updateEntry')
280 ->willReturn($entry);
282 $pocketImport->setClient($client);
283 $pocketImport->authorize('wunderbar_code');
285 $res = $pocketImport->import();
287 $this->assertTrue($res);
288 $this->assertEquals(['skipped' => 1, 'imported' => 1], $pocketImport->getSummary());
292 * Will sample results from https://getpocket.com/developer/docs/v3/retrieve.
294 public function testImportAndMarkAllAsRead()
296 $client = new Client();
299 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
300 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory('
305 "item_id": "229279689",
306 "resolved_id": "229279689",
307 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
308 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
311 "excerpt": "The list of things I love about the Ryder Cup is so long that it could fill a (tedious) novel, and golf fans can probably guess most of them.",
318 "item_id": "229279689",
319 "resolved_id": "229279689",
320 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview/2",
321 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
324 "excerpt": "The list of things I love about the Ryder Cup is so long that it could fill a (tedious) novel, and golf fans can probably guess most of them.",
335 $client->getEmitter()->attach($mock);
337 $pocketImport = $this->getPocketImport();
339 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
340 ->disableOriginalConstructor()
343 $entryRepo->expects($this->exactly(2))
344 ->method('findByUrlAndUserId')
345 ->will($this->onConsecutiveCalls(false, false));
348 ->expects($this->exactly(2))
349 ->method('getRepository')
350 ->willReturn($entryRepo);
352 // check that every entry persisted are archived
354 ->expects($this->any())
356 ->with($this->callback(function ($persistedEntry) {
357 return $persistedEntry->isArchived();
360 $entry = new Entry($this->user
);
363 ->expects($this->exactly(2))
364 ->method('updateEntry')
365 ->willReturn($entry);
367 $pocketImport->setClient($client);
368 $pocketImport->authorize('wunderbar_code');
370 $res = $pocketImport->setMarkAsRead(true)->import();
372 $this->assertTrue($res);
373 $this->assertEquals(['skipped' => 0, 'imported' => 2], $pocketImport->getSummary());
376 public function testImportBadResponse()
378 $client = new Client();
381 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
385 $client->getEmitter()->attach($mock);
387 $pocketImport = $this->getPocketImport();
388 $pocketImport->setClient($client);
389 $pocketImport->authorize('wunderbar_code');
391 $res = $pocketImport->import();
393 $this->assertFalse($res);
395 $records = $this->logHandler
->getRecords();
396 $this->assertContains('PocketImport: Failed to import', $records[0]['message']);
397 $this->assertEquals('ERROR', $records[0]['level_name']);
400 public function testImportWithExceptionFromGraby()
402 $client = new Client();
405 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
406 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory('
411 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview"
418 $client->getEmitter()->attach($mock);
420 $pocketImport = $this->getPocketImport();
422 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
423 ->disableOriginalConstructor()
426 $entryRepo->expects($this->once())
427 ->method('findByUrlAndUserId')
428 ->will($this->onConsecutiveCalls(false, true));
431 ->expects($this->once())
432 ->method('getRepository')
433 ->willReturn($entryRepo);
435 $entry = new Entry($this->user
);
438 ->expects($this->once())
439 ->method('updateEntry')
440 ->will($this->throwException(new \
Exception()));
442 $pocketImport->setClient($client);
443 $pocketImport->authorize('wunderbar_code');
445 $res = $pocketImport->import();
447 $this->assertTrue($res);
448 $this->assertEquals(['skipped' => 1, 'imported' => 0], $pocketImport->getSummary());