aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Wallabag/ImportBundle/Tests/Import/PocketImportTest.php
diff options
context:
space:
mode:
authorJeremy Benoist <jeremy.benoist@gmail.com>2015-12-30 12:23:51 +0100
committerJeremy Benoist <jeremy.benoist@gmail.com>2016-01-02 23:27:41 +0100
commit252ebd60719d32ec954d0519c9edf2b52b03310c (patch)
tree044c97abeda75c33901d8bfcd33fa107279b1778 /src/Wallabag/ImportBundle/Tests/Import/PocketImportTest.php
parentb4b592a0c0ee356e81775baf8f9976288d7b686c (diff)
downloadwallabag-252ebd60719d32ec954d0519c9edf2b52b03310c.tar.gz
wallabag-252ebd60719d32ec954d0519c9edf2b52b03310c.tar.zst
wallabag-252ebd60719d32ec954d0519c9edf2b52b03310c.zip
Rewrote Pocket Import
For the moment, we won't do a queue system, just a plain synchronous import. We also use ContentProxy to grab content for each article from Pocket. Error from Pocket are now logged using the logger. The ImportInterface need to be simple and not related to oAuth (not all import will use that method).
Diffstat (limited to 'src/Wallabag/ImportBundle/Tests/Import/PocketImportTest.php')
-rw-r--r--src/Wallabag/ImportBundle/Tests/Import/PocketImportTest.php228
1 files changed, 211 insertions, 17 deletions
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;
4 4
5use Wallabag\UserBundle\Entity\User; 5use Wallabag\UserBundle\Entity\User;
6use Wallabag\ImportBundle\Import\PocketImport; 6use Wallabag\ImportBundle\Import\PocketImport;
7use Symfony\Component\HttpFoundation\Session\Session;
8use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
9use GuzzleHttp\Client; 7use GuzzleHttp\Client;
10use GuzzleHttp\Subscriber\Mock; 8use GuzzleHttp\Subscriber\Mock;
11use GuzzleHttp\Message\Response; 9use GuzzleHttp\Message\Response;
12use GuzzleHttp\Stream\Stream; 10use GuzzleHttp\Stream\Stream;
11use Monolog\Logger;
12use Monolog\Handler\TestHandler;
13
14class PocketImportMock extends PocketImport
15{
16 public function getAccessToken()
17 {
18 return $this->accessToken;
19 }
20}
13 21
14class PocketImportTest extends \PHPUnit_Framework_TestCase 22class PocketImportTest extends \PHPUnit_Framework_TestCase
15{ 23{
16 protected $token; 24 protected $token;
17 protected $user; 25 protected $user;
18 protected $session;
19 protected $em; 26 protected $em;
27 protected $contentProxy;
28 protected $logHandler;
20 29
21 private function getPocketImport($consumerKey = 'ConsumerKey') 30 private function getPocketImport($consumerKey = 'ConsumerKey')
22 { 31 {
@@ -30,6 +39,10 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase
30 ->disableOriginalConstructor() 39 ->disableOriginalConstructor()
31 ->getMock(); 40 ->getMock();
32 41
42 $this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
43 ->disableOriginalConstructor()
44 ->getMock();
45
33 $token->expects($this->once()) 46 $token->expects($this->once())
34 ->method('getUser') 47 ->method('getUser')
35 ->willReturn($this->user); 48 ->willReturn($this->user);
@@ -38,18 +51,22 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase
38 ->method('getToken') 51 ->method('getToken')
39 ->willReturn($token); 52 ->willReturn($token);
40 53
41 $this->session = new Session(new MockArraySessionStorage());
42
43 $this->em = $this->getMockBuilder('Doctrine\ORM\EntityManager') 54 $this->em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
44 ->disableOriginalConstructor() 55 ->disableOriginalConstructor()
45 ->getMock(); 56 ->getMock();
46 57
47 return new PocketImport( 58 $pocket = new PocketImportMock(
48 $this->tokenStorage, 59 $this->tokenStorage,
49 $this->session,
50 $this->em, 60 $this->em,
61 $this->contentProxy,
51 $consumerKey 62 $consumerKey
52 ); 63 );
64
65 $this->logHandler = new TestHandler();
66 $logger = new Logger('test', array($this->logHandler));
67 $pocket->setLogger($logger);
68
69 return $pocket;
53 } 70 }
54 71
55 public function testInit() 72 public function testInit()
@@ -65,7 +82,7 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase
65 $client = new Client(); 82 $client = new Client();
66 83
67 $mock = new Mock([ 84 $mock = new Mock([
68 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['code' => 'wunderbar']))), 85 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['code' => 'wunderbar_code']))),
69 ]); 86 ]);
70 87
71 $client->getEmitter()->attach($mock); 88 $client->getEmitter()->attach($mock);
@@ -73,10 +90,31 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase
73 $pocketImport = $this->getPocketImport(); 90 $pocketImport = $this->getPocketImport();
74 $pocketImport->setClient($client); 91 $pocketImport->setClient($client);
75 92
76 $url = $pocketImport->oAuthRequest('http://0.0.0.0./redirect', 'http://0.0.0.0./callback'); 93 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect');
77 94
78 $this->assertEquals('https://getpocket.com/auth/authorize?request_token=wunderbar&redirect_uri=http://0.0.0.0./callback', $url); 95 $this->assertEquals('wunderbar_code', $code);
79 $this->assertEquals('wunderbar', $this->session->get('pocketCode')); 96 }
97
98 public function testOAuthRequestBadResponse()
99 {
100 $client = new Client();
101
102 $mock = new Mock([
103 new Response(403),
104 ]);
105
106 $client->getEmitter()->attach($mock);
107
108 $pocketImport = $this->getPocketImport();
109 $pocketImport->setClient($client);
110
111 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect');
112
113 $this->assertFalse($code);
114
115 $records = $this->logHandler->getRecords();
116 $this->assertContains('PocketImport: Failed to request token', $records[0]['message']);
117 $this->assertEquals('ERROR', $records[0]['level_name']);
80 } 118 }
81 119
82 public function testOAuthAuthorize() 120 public function testOAuthAuthorize()
@@ -84,7 +122,7 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase
84 $client = new Client(); 122 $client = new Client();
85 123
86 $mock = new Mock([ 124 $mock = new Mock([
87 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar']))), 125 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))),
88 ]); 126 ]);
89 127
90 $client->getEmitter()->attach($mock); 128 $client->getEmitter()->attach($mock);
@@ -92,26 +130,182 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase
92 $pocketImport = $this->getPocketImport(); 130 $pocketImport = $this->getPocketImport();
93 $pocketImport->setClient($client); 131 $pocketImport->setClient($client);
94 132
95 $accessToken = $pocketImport->oAuthAuthorize(); 133 $res = $pocketImport->authorize('wunderbar_code');
96 134
97 $this->assertEquals('wunderbar', $accessToken); 135 $this->assertTrue($res);
136 $this->assertEquals('wunderbar_token', $pocketImport->getAccessToken());
98 } 137 }
99 138
139 public function testOAuthAuthorizeBadResponse()
140 {
141 $client = new Client();
142
143 $mock = new Mock([
144 new Response(403),
145 ]);
146
147 $client->getEmitter()->attach($mock);
148
149 $pocketImport = $this->getPocketImport();
150 $pocketImport->setClient($client);
151
152 $res = $pocketImport->authorize('wunderbar_code');
153
154 $this->assertFalse($res);
155
156 $records = $this->logHandler->getRecords();
157 $this->assertContains('PocketImport: Failed to authorize client', $records[0]['message']);
158 $this->assertEquals('ERROR', $records[0]['level_name']);
159 }
160
161 /**
162 * Will sample results from https://getpocket.com/developer/docs/v3/retrieve.
163 */
100 public function testImport() 164 public function testImport()
101 { 165 {
102 $client = new Client(); 166 $client = new Client();
103 167
104 $mock = new Mock([ 168 $mock = new Mock([
105 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['list' => []]))), 169 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))),
170 new Response(200, ['Content-Type' => 'application/json'], Stream::factory('
171 {
172 "status": 1,
173 "list": {
174 "229279689": {
175 "item_id": "229279689",
176 "resolved_id": "229279689",
177 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
178 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
179 "favorite": "1",
180 "status": "1",
181 "resolved_title": "The Massive Ryder Cup Preview",
182 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
183 "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.",
184 "is_article": "1",
185 "has_video": "1",
186 "has_image": "1",
187 "word_count": "3197",
188 "images": {
189 "1": {
190 "item_id": "229279689",
191 "image_id": "1",
192 "src": "http://a.espncdn.com/combiner/i?img=/photo/2012/0927/grant_g_ryder_cr_640.jpg&w=640&h=360",
193 "width": "0",
194 "height": "0",
195 "credit": "Jamie Squire/Getty Images",
196 "caption": ""
197 }
198 },
199 "videos": {
200 "1": {
201 "item_id": "229279689",
202 "video_id": "1",
203 "src": "http://www.youtube.com/v/Er34PbFkVGk?version=3&hl=en_US&rel=0",
204 "width": "420",
205 "height": "315",
206 "type": "1",
207 "vid": "Er34PbFkVGk"
208 }
209 },
210 "tags": {
211 "grantland": {
212 "item_id": "1147652870",
213 "tag": "grantland"
214 },
215 "Ryder Cup": {
216 "item_id": "1147652870",
217 "tag": "Ryder Cup"
218 }
219 }
220 },
221 "229279690": {
222 "item_id": "229279689",
223 "resolved_id": "229279689",
224 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
225 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
226 "favorite": "1",
227 "status": "1",
228 "resolved_title": "The Massive Ryder Cup Preview",
229 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
230 "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.",
231 "is_article": "1",
232 "has_video": "0",
233 "has_image": "0",
234 "word_count": "3197"
235 }
236 }
237 }
238 ')),
239 ]);
240
241 $client->getEmitter()->attach($mock);
242
243 $pocketImport = $this->getPocketImport();
244
245 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
246 ->disableOriginalConstructor()
247 ->getMock();
248
249 $entryRepo->expects($this->exactly(2))
250 ->method('existByUrlAndUserId')
251 ->will($this->onConsecutiveCalls(false, true));
252
253 $tag = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Tag')
254 ->disableOriginalConstructor()
255 ->getMock();
256
257 $tagRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\TagRepository')
258 ->disableOriginalConstructor()
259 ->getMock();
260
261 $tagRepo->expects($this->exactly(2))
262 ->method('findOneByLabelAndUserId')
263 ->will($this->onConsecutiveCalls(false, $tag));
264
265 $this->em
266 ->expects($this->any())
267 ->method('getRepository')
268 ->will($this->onConsecutiveCalls($entryRepo, $tagRepo, $tagRepo, $entryRepo));
269
270 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
271 ->disableOriginalConstructor()
272 ->getMock();
273
274 $this->contentProxy
275 ->expects($this->once())
276 ->method('updateEntry')
277 ->willReturn($entry);
278
279 $pocketImport->setClient($client);
280 $pocketImport->authorize('wunderbar_code');
281
282 $res = $pocketImport->import();
283
284 $this->assertTrue($res);
285 $this->assertEquals(['skipped' => 1, 'imported' => 1], $pocketImport->getSummary());
286 }
287
288 public function testImportBadResponse()
289 {
290 $client = new Client();
291
292 $mock = new Mock([
293 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))),
294 new Response(403),
106 ]); 295 ]);
107 296
108 $client->getEmitter()->attach($mock); 297 $client->getEmitter()->attach($mock);
109 298
110 $pocketImport = $this->getPocketImport(); 299 $pocketImport = $this->getPocketImport();
111 $pocketImport->setClient($client); 300 $pocketImport->setClient($client);
301 $pocketImport->authorize('wunderbar_code');
302
303 $res = $pocketImport->import();
112 304
113 $pocketImport->import('wunderbar'); 305 $this->assertFalse($res);
114 306
115 $this->assertEquals('0 entries imported, 0 already saved.', $this->session->getFlashBag()->get('notice')[0]); 307 $records = $this->logHandler->getRecords();
308 $this->assertContains('PocketImport: Failed to import', $records[0]['message']);
309 $this->assertEquals('ERROR', $records[0]['level_name']);
116 } 310 }
117} 311}