3 namespace Wallabag\ImportBundle\Tests\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;
31 private function getPocketImport($consumerKey = 'ConsumerKey')
33 $this->user
= new User();
35 $this->tokenStorage
= $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface')
36 ->disableOriginalConstructor()
39 $token = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')
40 ->disableOriginalConstructor()
43 $this->contentProxy
= $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
44 ->disableOriginalConstructor()
47 $token->expects($this->once())
49 ->willReturn($this->user
);
51 $this->tokenStorage
->expects($this->once())
55 $this->em
= $this->getMockBuilder('Doctrine\ORM\EntityManager')
56 ->disableOriginalConstructor()
59 $config = $this->getMockBuilder('Craue\ConfigBundle\Util\Config')
60 ->disableOriginalConstructor()
63 $config->expects($this->any())
65 ->with('pocket_consumer_key')
66 ->willReturn($consumerKey);
68 $pocket = new PocketImportMock(
75 $this->logHandler
= new TestHandler();
76 $logger = new Logger('test', array($this->logHandler
));
77 $pocket->setLogger($logger);
82 public function testInit()
84 $pocketImport = $this->getPocketImport();
86 $this->assertEquals('Pocket', $pocketImport->getName());
87 $this->assertNotEmpty($pocketImport->getUrl());
88 $this->assertContains('This importer will import all your Pocket data.', $pocketImport->getDescription());
91 public function testOAuthRequest()
93 $client = new Client();
96 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['code' => 'wunderbar_code']))),
99 $client->getEmitter()->attach($mock);
101 $pocketImport = $this->getPocketImport();
102 $pocketImport->setClient($client);
104 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect');
106 $this->assertEquals('wunderbar_code', $code);
109 public function testOAuthRequestBadResponse()
111 $client = new Client();
117 $client->getEmitter()->attach($mock);
119 $pocketImport = $this->getPocketImport();
120 $pocketImport->setClient($client);
122 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect');
124 $this->assertFalse($code);
126 $records = $this->logHandler
->getRecords();
127 $this->assertContains('PocketImport: Failed to request token', $records[0]['message']);
128 $this->assertEquals('ERROR', $records[0]['level_name']);
131 public function testOAuthAuthorize()
133 $client = new Client();
136 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
139 $client->getEmitter()->attach($mock);
141 $pocketImport = $this->getPocketImport();
142 $pocketImport->setClient($client);
144 $res = $pocketImport->authorize('wunderbar_code');
146 $this->assertTrue($res);
147 $this->assertEquals('wunderbar_token', $pocketImport->getAccessToken());
150 public function testOAuthAuthorizeBadResponse()
152 $client = new Client();
158 $client->getEmitter()->attach($mock);
160 $pocketImport = $this->getPocketImport();
161 $pocketImport->setClient($client);
163 $res = $pocketImport->authorize('wunderbar_code');
165 $this->assertFalse($res);
167 $records = $this->logHandler
->getRecords();
168 $this->assertContains('PocketImport: Failed to authorize client', $records[0]['message']);
169 $this->assertEquals('ERROR', $records[0]['level_name']);
173 * Will sample results from https://getpocket.com/developer/docs/v3/retrieve.
175 public function testImport()
177 $client = new Client();
180 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
181 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory('
186 "item_id": "229279689",
187 "resolved_id": "229279689",
188 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
189 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
192 "resolved_title": "The Massive Ryder Cup Preview",
193 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
194 "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.",
198 "word_count": "3197",
201 "item_id": "229279689",
203 "src": "http://a.espncdn.com/combiner/i?img=/photo/2012/0927/grant_g_ryder_cr_640.jpg&w=640&h=360",
206 "credit": "Jamie Squire/Getty Images",
212 "item_id": "229279689",
214 "src": "http://www.youtube.com/v/Er34PbFkVGk?version=3&hl=en_US&rel=0",
223 "item_id": "1147652870",
227 "item_id": "1147652870",
233 "item_id": "229279689",
234 "resolved_id": "229279689",
235 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
236 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
239 "resolved_title": "The Massive Ryder Cup Preview",
240 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
241 "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.",
252 $client->getEmitter()->attach($mock);
254 $pocketImport = $this->getPocketImport();
256 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
257 ->disableOriginalConstructor()
260 $entryRepo->expects($this->exactly(2))
261 ->method('findByUrlAndUserId')
262 ->will($this->onConsecutiveCalls(false, true));
265 ->expects($this->exactly(2))
266 ->method('getRepository')
267 ->willReturn($entryRepo);
269 $entry = new Entry($this->user
);
272 ->expects($this->once())
273 ->method('updateEntry')
274 ->willReturn($entry);
276 $pocketImport->setClient($client);
277 $pocketImport->authorize('wunderbar_code');
279 $res = $pocketImport->import();
281 $this->assertTrue($res);
282 $this->assertEquals(['skipped' => 1, 'imported' => 1], $pocketImport->getSummary());
286 * Will sample results from https://getpocket.com/developer/docs/v3/retrieve.
288 public function testImportAndMarkAllAsRead()
290 $client = new Client();
293 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
294 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory('
299 "item_id": "229279689",
300 "resolved_id": "229279689",
301 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
302 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
305 "resolved_title": "The Massive Ryder Cup Preview",
306 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
307 "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.",
314 "item_id": "229279689",
315 "resolved_id": "229279689",
316 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview/2",
317 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
320 "resolved_title": "The Massive Ryder Cup Preview",
321 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
322 "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.",
333 $client->getEmitter()->attach($mock);
335 $pocketImport = $this->getPocketImport();
337 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
338 ->disableOriginalConstructor()
341 $entryRepo->expects($this->exactly(2))
342 ->method('findByUrlAndUserId')
343 ->will($this->onConsecutiveCalls(false, false));
346 ->expects($this->exactly(2))
347 ->method('getRepository')
348 ->willReturn($entryRepo);
350 // check that every entry persisted are archived
352 ->expects($this->any())
354 ->with($this->callback(function ($persistedEntry) {
355 return $persistedEntry->isArchived();
358 $entry = new Entry($this->user
);
361 ->expects($this->exactly(2))
362 ->method('updateEntry')
363 ->willReturn($entry);
365 $pocketImport->setClient($client);
366 $pocketImport->authorize('wunderbar_code');
368 $res = $pocketImport->setMarkAsRead(true)->import();
370 $this->assertTrue($res);
371 $this->assertEquals(['skipped' => 0, 'imported' => 2], $pocketImport->getSummary());
374 public function testImportBadResponse()
376 $client = new Client();
379 new Response(200, ['Content-Type' => 'application/json'], Stream
::factory(json_encode(['access_token' => 'wunderbar_token']))),
383 $client->getEmitter()->attach($mock);
385 $pocketImport = $this->getPocketImport();
386 $pocketImport->setClient($client);
387 $pocketImport->authorize('wunderbar_code');
389 $res = $pocketImport->import();
391 $this->assertFalse($res);
393 $records = $this->logHandler
->getRecords();
394 $this->assertContains('PocketImport: Failed to import', $records[0]['message']);
395 $this->assertEquals('ERROR', $records[0]['level_name']);