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(
82 $this->logHandler
= new TestHandler();
83 $logger = new Logger('test', [$this->logHandler
]);
84 $pocket->setLogger($logger);
89 public function testInit()
91 $pocketImport = $this->getPocketImport();
93 $this->assertEquals('Pocket', $pocketImport->getName());
94 $this->assertNotEmpty($pocketImport->getUrl());
95 $this->assertEquals('import.pocket.description', $pocketImport->getDescription());
98 public function testOAuthRequest()
100 $client = new Client();
103 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['code' => 'wunderbar_code']))),
106 $client->getEmitter()->attach($mock);
108 $pocketImport = $this->getPocketImport();
109 $pocketImport->setClient($client);
111 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect');
113 $this->assertEquals('wunderbar_code', $code);
116 public function testOAuthRequestBadResponse()
118 $client = new Client();
124 $client->getEmitter()->attach($mock);
126 $pocketImport = $this->getPocketImport();
127 $pocketImport->setClient($client);
129 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect');
131 $this->assertFalse($code);
133 $records = $this->logHandler
->getRecords();
134 $this->assertContains('PocketImport: Failed to request token', $records[0]['message']);
135 $this->assertEquals('ERROR', $records[0]['level_name']);
138 public function testOAuthAuthorize()
140 $client = new Client();
143 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
146 $client->getEmitter()->attach($mock);
148 $pocketImport = $this->getPocketImport();
149 $pocketImport->setClient($client);
151 $res = $pocketImport->authorize('wunderbar_code');
153 $this->assertTrue($res);
154 $this->assertEquals('wunderbar_token', $pocketImport->getAccessToken());
157 public function testOAuthAuthorizeBadResponse()
159 $client = new Client();
165 $client->getEmitter()->attach($mock);
167 $pocketImport = $this->getPocketImport();
168 $pocketImport->setClient($client);
170 $res = $pocketImport->authorize('wunderbar_code');
172 $this->assertFalse($res);
174 $records = $this->logHandler
->getRecords();
175 $this->assertContains('PocketImport: Failed to authorize client', $records[0]['message']);
176 $this->assertEquals('ERROR', $records[0]['level_name']);
180 * Will sample results from https://getpocket.com/developer/docs/v3/retrieve.
182 public function testImport()
184 $client = new Client();
187 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
188 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory('
193 "item_id": "229279689",
194 "resolved_id": "229279689",
195 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
196 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
199 "resolved_title": "The Massive Ryder Cup Preview",
200 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
201 "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.",
205 "word_count": "3197",
208 "item_id": "229279689",
210 "src": "http://a.espncdn.com/combiner/i?img=/photo/2012/0927/grant_g_ryder_cr_640.jpg&w=640&h=360",
213 "credit": "Jamie Squire/Getty Images",
219 "item_id": "229279689",
221 "src": "http://www.youtube.com/v/Er34PbFkVGk?version=3&hl=en_US&rel=0",
230 "item_id": "1147652870",
234 "item_id": "1147652870",
240 "item_id": "229279689",
241 "resolved_id": "229279689",
242 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
243 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
246 "resolved_title": "The Massive Ryder Cup Preview",
247 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
248 "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.",
259 $client->getEmitter()->attach($mock);
261 $pocketImport = $this->getPocketImport();
263 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
264 ->disableOriginalConstructor()
267 $entryRepo->expects($this->exactly(2))
268 ->method('findByUrlAndUserId')
269 ->will($this->onConsecutiveCalls(false, true));
272 ->expects($this->exactly(2))
273 ->method('getRepository')
274 ->willReturn($entryRepo);
276 $entry = new Entry($this->user
);
279 ->expects($this->once())
280 ->method('updateEntry')
281 ->willReturn($entry);
283 $pocketImport->setClient($client);
284 $pocketImport->authorize('wunderbar_code');
286 $res = $pocketImport->import();
288 $this->assertTrue($res);
289 $this->assertEquals(['skipped' => 1, 'imported' => 1], $pocketImport->getSummary());
293 * Will sample results from https://getpocket.com/developer/docs/v3/retrieve.
295 public function testImportAndMarkAllAsRead()
297 $client = new Client();
300 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
301 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory('
306 "item_id": "229279689",
307 "resolved_id": "229279689",
308 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
309 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
312 "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.",
319 "item_id": "229279689",
320 "resolved_id": "229279689",
321 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview/2",
322 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
325 "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.",
336 $client->getEmitter()->attach($mock);
338 $pocketImport = $this->getPocketImport();
340 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
341 ->disableOriginalConstructor()
344 $entryRepo->expects($this->exactly(2))
345 ->method('findByUrlAndUserId')
346 ->will($this->onConsecutiveCalls(false, false));
349 ->expects($this->exactly(2))
350 ->method('getRepository')
351 ->willReturn($entryRepo);
353 // check that every entry persisted are archived
355 ->expects($this->any())
357 ->with($this->callback(function ($persistedEntry) {
358 return $persistedEntry->isArchived();
361 $entry = new Entry($this->user
);
364 ->expects($this->exactly(2))
365 ->method('updateEntry')
366 ->willReturn($entry);
368 $pocketImport->setClient($client);
369 $pocketImport->authorize('wunderbar_code');
371 $res = $pocketImport->setMarkAsRead(true)->import();
373 $this->assertTrue($res);
374 $this->assertEquals(['skipped' => 0, 'imported' => 2], $pocketImport->getSummary());
377 public function testImportBadResponse()
379 $client = new Client();
382 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
386 $client->getEmitter()->attach($mock);
388 $pocketImport = $this->getPocketImport();
389 $pocketImport->setClient($client);
390 $pocketImport->authorize('wunderbar_code');
392 $res = $pocketImport->import();
394 $this->assertFalse($res);
396 $records = $this->logHandler
->getRecords();
397 $this->assertContains('PocketImport: Failed to import', $records[0]['message']);
398 $this->assertEquals('ERROR', $records[0]['level_name']);
401 public function testImportWithExceptionFromGraby()
403 $client = new Client();
406 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
407 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory('
412 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview"
419 $client->getEmitter()->attach($mock);
421 $pocketImport = $this->getPocketImport();
423 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
424 ->disableOriginalConstructor()
427 $entryRepo->expects($this->once())
428 ->method('findByUrlAndUserId')
429 ->will($this->onConsecutiveCalls(false, true));
432 ->expects($this->once())
433 ->method('getRepository')
434 ->willReturn($entryRepo);
436 $entry = new Entry($this->user
);
439 ->expects($this->once())
440 ->method('updateEntry')
441 ->will($this->throwException(new \
Exception()));
443 $pocketImport->setClient($client);
444 $pocketImport->authorize('wunderbar_code');
446 $res = $pocketImport->import();
448 $this->assertTrue($res);
449 $this->assertEquals(['skipped' => 1, 'imported' => 0], $pocketImport->getSummary());