X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=src%2FWallabag%2FImportBundle%2FTests%2FImport%2FPocketImportTest.php;fp=src%2FWallabag%2FImportBundle%2FTests%2FImport%2FPocketImportTest.php;h=cf706fa9490bb53bad0ea2585a142557b41d42e8;hb=252ebd60719d32ec954d0519c9edf2b52b03310c;hp=4c718fa3a30de9d55b3f4903bfa818bf5faa5b41;hpb=b4b592a0c0ee356e81775baf8f9976288d7b686c;p=github%2Fwallabag%2Fwallabag.git diff --git a/src/Wallabag/ImportBundle/Tests/Import/PocketImportTest.php b/src/Wallabag/ImportBundle/Tests/Import/PocketImportTest.php index 4c718fa3..cf706fa9 100644 --- a/src/Wallabag/ImportBundle/Tests/Import/PocketImportTest.php +++ b/src/Wallabag/ImportBundle/Tests/Import/PocketImportTest.php @@ -4,19 +4,28 @@ namespace Wallabag\ImportBundle\Tests\Import; use Wallabag\UserBundle\Entity\User; use Wallabag\ImportBundle\Import\PocketImport; -use Symfony\Component\HttpFoundation\Session\Session; -use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; use GuzzleHttp\Client; use GuzzleHttp\Subscriber\Mock; use GuzzleHttp\Message\Response; use GuzzleHttp\Stream\Stream; +use Monolog\Logger; +use Monolog\Handler\TestHandler; + +class PocketImportMock extends PocketImport +{ + public function getAccessToken() + { + return $this->accessToken; + } +} class PocketImportTest extends \PHPUnit_Framework_TestCase { protected $token; protected $user; - protected $session; protected $em; + protected $contentProxy; + protected $logHandler; private function getPocketImport($consumerKey = 'ConsumerKey') { @@ -30,6 +39,10 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); + $this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy') + ->disableOriginalConstructor() + ->getMock(); + $token->expects($this->once()) ->method('getUser') ->willReturn($this->user); @@ -38,18 +51,22 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase ->method('getToken') ->willReturn($token); - $this->session = new Session(new MockArraySessionStorage()); - $this->em = $this->getMockBuilder('Doctrine\ORM\EntityManager') ->disableOriginalConstructor() ->getMock(); - return new PocketImport( + $pocket = new PocketImportMock( $this->tokenStorage, - $this->session, $this->em, + $this->contentProxy, $consumerKey ); + + $this->logHandler = new TestHandler(); + $logger = new Logger('test', array($this->logHandler)); + $pocket->setLogger($logger); + + return $pocket; } public function testInit() @@ -65,7 +82,7 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase $client = new Client(); $mock = new Mock([ - new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['code' => 'wunderbar']))), + new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['code' => 'wunderbar_code']))), ]); $client->getEmitter()->attach($mock); @@ -73,10 +90,31 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase $pocketImport = $this->getPocketImport(); $pocketImport->setClient($client); - $url = $pocketImport->oAuthRequest('http://0.0.0.0./redirect', 'http://0.0.0.0./callback'); + $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect'); - $this->assertEquals('https://getpocket.com/auth/authorize?request_token=wunderbar&redirect_uri=http://0.0.0.0./callback', $url); - $this->assertEquals('wunderbar', $this->session->get('pocketCode')); + $this->assertEquals('wunderbar_code', $code); + } + + public function testOAuthRequestBadResponse() + { + $client = new Client(); + + $mock = new Mock([ + new Response(403), + ]); + + $client->getEmitter()->attach($mock); + + $pocketImport = $this->getPocketImport(); + $pocketImport->setClient($client); + + $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect'); + + $this->assertFalse($code); + + $records = $this->logHandler->getRecords(); + $this->assertContains('PocketImport: Failed to request token', $records[0]['message']); + $this->assertEquals('ERROR', $records[0]['level_name']); } public function testOAuthAuthorize() @@ -84,7 +122,7 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase $client = new Client(); $mock = new Mock([ - new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar']))), + new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))), ]); $client->getEmitter()->attach($mock); @@ -92,26 +130,182 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase $pocketImport = $this->getPocketImport(); $pocketImport->setClient($client); - $accessToken = $pocketImport->oAuthAuthorize(); + $res = $pocketImport->authorize('wunderbar_code'); - $this->assertEquals('wunderbar', $accessToken); + $this->assertTrue($res); + $this->assertEquals('wunderbar_token', $pocketImport->getAccessToken()); } + public function testOAuthAuthorizeBadResponse() + { + $client = new Client(); + + $mock = new Mock([ + new Response(403), + ]); + + $client->getEmitter()->attach($mock); + + $pocketImport = $this->getPocketImport(); + $pocketImport->setClient($client); + + $res = $pocketImport->authorize('wunderbar_code'); + + $this->assertFalse($res); + + $records = $this->logHandler->getRecords(); + $this->assertContains('PocketImport: Failed to authorize client', $records[0]['message']); + $this->assertEquals('ERROR', $records[0]['level_name']); + } + + /** + * Will sample results from https://getpocket.com/developer/docs/v3/retrieve. + */ public function testImport() { $client = new Client(); $mock = new Mock([ - new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['list' => []]))), + new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))), + new Response(200, ['Content-Type' => 'application/json'], Stream::factory(' + { + "status": 1, + "list": { + "229279689": { + "item_id": "229279689", + "resolved_id": "229279689", + "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview", + "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland", + "favorite": "1", + "status": "1", + "resolved_title": "The Massive Ryder Cup Preview", + "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview", + "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.", + "is_article": "1", + "has_video": "1", + "has_image": "1", + "word_count": "3197", + "images": { + "1": { + "item_id": "229279689", + "image_id": "1", + "src": "http://a.espncdn.com/combiner/i?img=/photo/2012/0927/grant_g_ryder_cr_640.jpg&w=640&h=360", + "width": "0", + "height": "0", + "credit": "Jamie Squire/Getty Images", + "caption": "" + } + }, + "videos": { + "1": { + "item_id": "229279689", + "video_id": "1", + "src": "http://www.youtube.com/v/Er34PbFkVGk?version=3&hl=en_US&rel=0", + "width": "420", + "height": "315", + "type": "1", + "vid": "Er34PbFkVGk" + } + }, + "tags": { + "grantland": { + "item_id": "1147652870", + "tag": "grantland" + }, + "Ryder Cup": { + "item_id": "1147652870", + "tag": "Ryder Cup" + } + } + }, + "229279690": { + "item_id": "229279689", + "resolved_id": "229279689", + "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview", + "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland", + "favorite": "1", + "status": "1", + "resolved_title": "The Massive Ryder Cup Preview", + "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview", + "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.", + "is_article": "1", + "has_video": "0", + "has_image": "0", + "word_count": "3197" + } + } + } + ')), + ]); + + $client->getEmitter()->attach($mock); + + $pocketImport = $this->getPocketImport(); + + $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository') + ->disableOriginalConstructor() + ->getMock(); + + $entryRepo->expects($this->exactly(2)) + ->method('existByUrlAndUserId') + ->will($this->onConsecutiveCalls(false, true)); + + $tag = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Tag') + ->disableOriginalConstructor() + ->getMock(); + + $tagRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\TagRepository') + ->disableOriginalConstructor() + ->getMock(); + + $tagRepo->expects($this->exactly(2)) + ->method('findOneByLabelAndUserId') + ->will($this->onConsecutiveCalls(false, $tag)); + + $this->em + ->expects($this->any()) + ->method('getRepository') + ->will($this->onConsecutiveCalls($entryRepo, $tagRepo, $tagRepo, $entryRepo)); + + $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry') + ->disableOriginalConstructor() + ->getMock(); + + $this->contentProxy + ->expects($this->once()) + ->method('updateEntry') + ->willReturn($entry); + + $pocketImport->setClient($client); + $pocketImport->authorize('wunderbar_code'); + + $res = $pocketImport->import(); + + $this->assertTrue($res); + $this->assertEquals(['skipped' => 1, 'imported' => 1], $pocketImport->getSummary()); + } + + public function testImportBadResponse() + { + $client = new Client(); + + $mock = new Mock([ + new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))), + new Response(403), ]); $client->getEmitter()->attach($mock); $pocketImport = $this->getPocketImport(); $pocketImport->setClient($client); + $pocketImport->authorize('wunderbar_code'); + + $res = $pocketImport->import(); - $pocketImport->import('wunderbar'); + $this->assertFalse($res); - $this->assertEquals('0 entries imported, 0 already saved.', $this->session->getFlashBag()->get('notice')[0]); + $records = $this->logHandler->getRecords(); + $this->assertContains('PocketImport: Failed to import', $records[0]['message']); + $this->assertEquals('ERROR', $records[0]['level_name']); } }