]> git.immae.eu Git - github/wallabag/wallabag.git/blame - src/Wallabag/ImportBundle/Tests/Import/PocketImportTest.php
Merge pull request #1693 from wallabag/v2-issue-template
[github/wallabag/wallabag.git] / src / Wallabag / ImportBundle / Tests / Import / PocketImportTest.php
CommitLineData
7ec2897e
JB
1<?php
2
3namespace Wallabag\ImportBundle\Tests\Import;
4
5use Wallabag\UserBundle\Entity\User;
6use Wallabag\ImportBundle\Import\PocketImport;
7ec2897e
JB
7use GuzzleHttp\Client;
8use GuzzleHttp\Subscriber\Mock;
9use GuzzleHttp\Message\Response;
10use GuzzleHttp\Stream\Stream;
252ebd60
JB
11use Monolog\Logger;
12use Monolog\Handler\TestHandler;
13
14class PocketImportMock extends PocketImport
15{
16 public function getAccessToken()
17 {
18 return $this->accessToken;
19 }
20}
7ec2897e
JB
21
22class PocketImportTest extends \PHPUnit_Framework_TestCase
23{
24 protected $token;
25 protected $user;
7ec2897e 26 protected $em;
252ebd60
JB
27 protected $contentProxy;
28 protected $logHandler;
7ec2897e
JB
29
30 private function getPocketImport($consumerKey = 'ConsumerKey')
31 {
32 $this->user = new User();
33
34 $this->tokenStorage = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface')
35 ->disableOriginalConstructor()
36 ->getMock();
37
38 $token = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')
39 ->disableOriginalConstructor()
40 ->getMock();
41
252ebd60
JB
42 $this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
43 ->disableOriginalConstructor()
44 ->getMock();
45
7ec2897e
JB
46 $token->expects($this->once())
47 ->method('getUser')
48 ->willReturn($this->user);
49
50 $this->tokenStorage->expects($this->once())
51 ->method('getToken')
52 ->willReturn($token);
53
7ec2897e
JB
54 $this->em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
55 ->disableOriginalConstructor()
56 ->getMock();
57
63e40f2d
JB
58 $config = $this->getMockBuilder('Craue\ConfigBundle\Util\Config')
59 ->disableOriginalConstructor()
60 ->getMock();
61
62 $config->expects($this->any())
63 ->method('get')
64 ->with('pocket_consumer_key')
65 ->willReturn($consumerKey);
66
252ebd60 67 $pocket = new PocketImportMock(
7ec2897e 68 $this->tokenStorage,
7ec2897e 69 $this->em,
252ebd60 70 $this->contentProxy,
63e40f2d 71 $config
7ec2897e 72 );
252ebd60
JB
73
74 $this->logHandler = new TestHandler();
75 $logger = new Logger('test', array($this->logHandler));
76 $pocket->setLogger($logger);
77
78 return $pocket;
7ec2897e
JB
79 }
80
81 public function testInit()
82 {
83 $pocketImport = $this->getPocketImport();
84
85 $this->assertEquals('Pocket', $pocketImport->getName());
7019c7cf 86 $this->assertNotEmpty($pocketImport->getUrl());
b88cf91f 87 $this->assertContains('This importer will import all your Pocket data.', $pocketImport->getDescription());
7ec2897e
JB
88 }
89
90 public function testOAuthRequest()
91 {
92 $client = new Client();
93
94 $mock = new Mock([
252ebd60 95 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['code' => 'wunderbar_code']))),
7ec2897e
JB
96 ]);
97
98 $client->getEmitter()->attach($mock);
99
100 $pocketImport = $this->getPocketImport();
101 $pocketImport->setClient($client);
102
252ebd60 103 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect');
7ec2897e 104
252ebd60
JB
105 $this->assertEquals('wunderbar_code', $code);
106 }
107
108 public function testOAuthRequestBadResponse()
109 {
110 $client = new Client();
111
112 $mock = new Mock([
113 new Response(403),
114 ]);
115
116 $client->getEmitter()->attach($mock);
117
118 $pocketImport = $this->getPocketImport();
119 $pocketImport->setClient($client);
120
121 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect');
122
123 $this->assertFalse($code);
124
125 $records = $this->logHandler->getRecords();
126 $this->assertContains('PocketImport: Failed to request token', $records[0]['message']);
127 $this->assertEquals('ERROR', $records[0]['level_name']);
7ec2897e
JB
128 }
129
130 public function testOAuthAuthorize()
131 {
132 $client = new Client();
133
134 $mock = new Mock([
252ebd60 135 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))),
7ec2897e
JB
136 ]);
137
138 $client->getEmitter()->attach($mock);
139
140 $pocketImport = $this->getPocketImport();
141 $pocketImport->setClient($client);
142
252ebd60 143 $res = $pocketImport->authorize('wunderbar_code');
7ec2897e 144
252ebd60
JB
145 $this->assertTrue($res);
146 $this->assertEquals('wunderbar_token', $pocketImport->getAccessToken());
7ec2897e
JB
147 }
148
252ebd60
JB
149 public function testOAuthAuthorizeBadResponse()
150 {
151 $client = new Client();
152
153 $mock = new Mock([
154 new Response(403),
155 ]);
156
157 $client->getEmitter()->attach($mock);
158
159 $pocketImport = $this->getPocketImport();
160 $pocketImport->setClient($client);
161
162 $res = $pocketImport->authorize('wunderbar_code');
163
164 $this->assertFalse($res);
165
166 $records = $this->logHandler->getRecords();
167 $this->assertContains('PocketImport: Failed to authorize client', $records[0]['message']);
168 $this->assertEquals('ERROR', $records[0]['level_name']);
169 }
170
171 /**
172 * Will sample results from https://getpocket.com/developer/docs/v3/retrieve.
173 */
7ec2897e
JB
174 public function testImport()
175 {
176 $client = new Client();
177
178 $mock = new Mock([
252ebd60
JB
179 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))),
180 new Response(200, ['Content-Type' => 'application/json'], Stream::factory('
181 {
182 "status": 1,
183 "list": {
184 "229279689": {
185 "item_id": "229279689",
186 "resolved_id": "229279689",
187 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
188 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
189 "favorite": "1",
190 "status": "1",
191 "resolved_title": "The Massive Ryder Cup Preview",
192 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
193 "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.",
194 "is_article": "1",
195 "has_video": "1",
196 "has_image": "1",
197 "word_count": "3197",
198 "images": {
199 "1": {
200 "item_id": "229279689",
201 "image_id": "1",
202 "src": "http://a.espncdn.com/combiner/i?img=/photo/2012/0927/grant_g_ryder_cr_640.jpg&w=640&h=360",
203 "width": "0",
204 "height": "0",
205 "credit": "Jamie Squire/Getty Images",
206 "caption": ""
207 }
208 },
209 "videos": {
210 "1": {
211 "item_id": "229279689",
212 "video_id": "1",
213 "src": "http://www.youtube.com/v/Er34PbFkVGk?version=3&hl=en_US&rel=0",
214 "width": "420",
215 "height": "315",
216 "type": "1",
217 "vid": "Er34PbFkVGk"
218 }
219 },
220 "tags": {
221 "grantland": {
222 "item_id": "1147652870",
223 "tag": "grantland"
224 },
225 "Ryder Cup": {
226 "item_id": "1147652870",
227 "tag": "Ryder Cup"
228 }
229 }
230 },
231 "229279690": {
232 "item_id": "229279689",
233 "resolved_id": "229279689",
234 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
235 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
236 "favorite": "1",
237 "status": "1",
238 "resolved_title": "The Massive Ryder Cup Preview",
239 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
240 "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.",
241 "is_article": "1",
242 "has_video": "0",
243 "has_image": "0",
244 "word_count": "3197"
245 }
246 }
247 }
248 ')),
249 ]);
250
251 $client->getEmitter()->attach($mock);
252
253 $pocketImport = $this->getPocketImport();
254
255 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
256 ->disableOriginalConstructor()
257 ->getMock();
258
259 $entryRepo->expects($this->exactly(2))
78833672 260 ->method('findByUrlAndUserId')
252ebd60
JB
261 ->will($this->onConsecutiveCalls(false, true));
262
263 $tag = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Tag')
264 ->disableOriginalConstructor()
265 ->getMock();
266
267 $tagRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\TagRepository')
268 ->disableOriginalConstructor()
269 ->getMock();
270
271 $tagRepo->expects($this->exactly(2))
c5c7f90a
JB
272 // the method `findOneByLabel` doesn't exist, EntityRepository will then call `_call` method
273 // to magically call the `findOneBy` with ['label' => 'foo']
274 ->method('__call')
252ebd60
JB
275 ->will($this->onConsecutiveCalls(false, $tag));
276
277 $this->em
278 ->expects($this->any())
279 ->method('getRepository')
280 ->will($this->onConsecutiveCalls($entryRepo, $tagRepo, $tagRepo, $entryRepo));
281
282 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
283 ->disableOriginalConstructor()
284 ->getMock();
285
286 $this->contentProxy
287 ->expects($this->once())
288 ->method('updateEntry')
289 ->willReturn($entry);
290
291 $pocketImport->setClient($client);
292 $pocketImport->authorize('wunderbar_code');
293
294 $res = $pocketImport->import();
295
296 $this->assertTrue($res);
297 $this->assertEquals(['skipped' => 1, 'imported' => 1], $pocketImport->getSummary());
298 }
299
300 public function testImportBadResponse()
301 {
302 $client = new Client();
303
304 $mock = new Mock([
305 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))),
306 new Response(403),
7ec2897e
JB
307 ]);
308
309 $client->getEmitter()->attach($mock);
310
311 $pocketImport = $this->getPocketImport();
312 $pocketImport->setClient($client);
252ebd60
JB
313 $pocketImport->authorize('wunderbar_code');
314
315 $res = $pocketImport->import();
7ec2897e 316
252ebd60 317 $this->assertFalse($res);
7ec2897e 318
252ebd60
JB
319 $records = $this->logHandler->getRecords();
320 $this->assertContains('PocketImport: Failed to import', $records[0]['message']);
321 $this->assertEquals('ERROR', $records[0]['level_name']);
7ec2897e
JB
322 }
323}