]> git.immae.eu Git - github/wallabag/wallabag.git/blame - src/Wallabag/ApiBundle/Tests/Controller/WallabagRestControllerTest.php
Add test on getting starred entries using the API
[github/wallabag/wallabag.git] / src / Wallabag / ApiBundle / Tests / Controller / WallabagRestControllerTest.php
CommitLineData
769e19dc
J
1<?php
2
9744e971 3namespace Wallabag\ApiBundle\Tests\Controller;
769e19dc
J
4
5use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
6
7class WallabagRestControllerTest extends WebTestCase
8{
9 protected static $salt;
10
11 /**
4346a860 12 * Grab the salt once and store it to be available for all tests.
769e19dc
J
13 */
14 public static function setUpBeforeClass()
15 {
16 $client = self::createClient();
17
18 $user = $client->getContainer()
19 ->get('doctrine.orm.entity_manager')
20 ->getRepository('WallabagCoreBundle:User')
21 ->findOneByUsername('admin');
22
23 self::$salt = $user->getSalt();
24 }
25
26 /**
4346a860 27 * Generate HTTP headers for authenticate user on API.
769e19dc
J
28 *
29 * @param string $username
30 * @param string $password
31 *
32 * @return array
33 */
34 private function generateHeaders($username, $password)
35 {
36 $encryptedPassword = sha1($password.$username.self::$salt);
37 $nonce = substr(md5(uniqid('nonce_', true)), 0, 16);
38
39 $now = new \DateTime('now', new \DateTimeZone('UTC'));
40 $created = (string) $now->format('Y-m-d\TH:i:s\Z');
41 $digest = base64_encode(sha1(base64_decode($nonce).$created.$encryptedPassword, true));
42
43 return array(
44 'HTTP_AUTHORIZATION' => 'Authorization profile="UsernameToken"',
45 'HTTP_x-wsse' => 'X-WSSE: UsernameToken Username="'.$username.'", PasswordDigest="'.$digest.'", Nonce="'.$nonce.'", Created="'.$created.'"',
46 );
47 }
48
49 public function testGetSalt()
50 {
51 $client = $this->createClient();
52 $client->request('GET', '/api/salts/admin.json');
53
54 $user = $client->getContainer()
55 ->get('doctrine.orm.entity_manager')
56 ->getRepository('WallabagCoreBundle:User')
57 ->findOneByUsername('admin');
58
59 $this->assertEquals(200, $client->getResponse()->getStatusCode());
60
61 $content = json_decode($client->getResponse()->getContent(), true);
62
63 $this->assertArrayHasKey(0, $content);
64 $this->assertEquals($user->getSalt(), $content[0]);
65
66 $client->request('GET', '/api/salts/notfound.json');
67 $this->assertEquals(404, $client->getResponse()->getStatusCode());
68 }
69
70 public function testWithBadHeaders()
71 {
72 $client = $this->createClient();
73
74 $entry = $client->getContainer()
75 ->get('doctrine.orm.entity_manager')
76 ->getRepository('WallabagCoreBundle:Entry')
77 ->findOneByIsArchived(false);
78
79 if (!$entry) {
80 $this->markTestSkipped('No content found in db.');
81 }
82
83 $badHeaders = array(
84 'HTTP_AUTHORIZATION' => 'Authorization profile="UsernameToken"',
85 'HTTP_x-wsse' => 'X-WSSE: UsernameToken Username="admin", PasswordDigest="Wr0ngDig3st", Nonce="n0Nc3", Created="2015-01-01T13:37:00Z"',
86 );
87
88 $client->request('GET', '/api/entries/'.$entry->getId().'.json', array(), array(), $badHeaders);
89 $this->assertEquals(403, $client->getResponse()->getStatusCode());
90 }
91
92 public function testGetOneEntry()
93 {
94 $client = $this->createClient();
95 $headers = $this->generateHeaders('admin', 'mypassword');
96
97 $entry = $client->getContainer()
98 ->get('doctrine.orm.entity_manager')
99 ->getRepository('WallabagCoreBundle:Entry')
100 ->findOneBy(array('user' => 1, 'isArchived' => false));
101
102 if (!$entry) {
103 $this->markTestSkipped('No content found in db.');
104 }
105
106 $client->request('GET', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
107
108 $this->assertEquals(200, $client->getResponse()->getStatusCode());
109
110 $content = json_decode($client->getResponse()->getContent(), true);
111
112 $this->assertEquals($entry->getTitle(), $content['title']);
113 $this->assertEquals($entry->getUrl(), $content['url']);
114 $this->assertCount(count($entry->getTags()), $content['tags']);
115
116 $this->assertTrue(
117 $client->getResponse()->headers->contains(
118 'Content-Type',
119 'application/json'
120 )
121 );
122 }
123
124 public function testGetOneEntryWrongUser()
125 {
126 $client = $this->createClient();
127 $headers = $this->generateHeaders('admin', 'mypassword');
128
129 $entry = $client->getContainer()
130 ->get('doctrine.orm.entity_manager')
131 ->getRepository('WallabagCoreBundle:Entry')
132 ->findOneBy(array('user' => 2, 'isArchived' => false));
133
134 if (!$entry) {
135 $this->markTestSkipped('No content found in db.');
136 }
137
138 $client->request('GET', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
139
140 $this->assertEquals(403, $client->getResponse()->getStatusCode());
141 }
142
143 public function testGetEntries()
144 {
145 $client = $this->createClient();
146 $headers = $this->generateHeaders('admin', 'mypassword');
147
148 $client->request('GET', '/api/entries', array(), array(), $headers);
149
150 $this->assertEquals(200, $client->getResponse()->getStatusCode());
151
152 $content = json_decode($client->getResponse()->getContent(), true);
153
154 $this->assertGreaterThanOrEqual(1, count($content));
155 $this->assertNotEmpty($content['_embedded']['items']);
156 $this->assertGreaterThanOrEqual(1, $content['total']);
157 $this->assertEquals(1, $content['page']);
158 $this->assertGreaterThanOrEqual(1, $content['pages']);
159
160 $this->assertTrue(
161 $client->getResponse()->headers->contains(
162 'Content-Type',
163 'application/json'
164 )
165 );
166 }
167
168 public function testGetStarredEntries()
169 {
170 $client = $this->createClient();
171 $headers = $this->generateHeaders('admin', 'mypassword');
172
e6f55346
JB
173 $client->request('GET', '/api/entries', array('star' => 1, 'sort' => 'updated'), array(), $headers);
174
175 $this->assertEquals(200, $client->getResponse()->getStatusCode());
176
177 $content = json_decode($client->getResponse()->getContent(), true);
178
179 $this->assertGreaterThanOrEqual(1, count($content));
180 $this->assertNotEmpty($content['_embedded']['items']);
181 $this->assertGreaterThanOrEqual(1, $content['total']);
182 $this->assertEquals(1, $content['page']);
183 $this->assertGreaterThanOrEqual(1, $content['pages']);
184
185 $this->assertTrue(
186 $client->getResponse()->headers->contains(
187 'Content-Type',
188 'application/json'
189 )
190 );
191 }
192
193 public function testGetArchiveEntries()
194 {
195 $client = $this->createClient();
196 $headers = $this->generateHeaders('admin', 'mypassword');
197
769e19dc
J
198 $client->request('GET', '/api/entries', array('archive' => 1), array(), $headers);
199
200 $this->assertEquals(200, $client->getResponse()->getStatusCode());
201
202 $content = json_decode($client->getResponse()->getContent(), true);
203
204 $this->assertGreaterThanOrEqual(1, count($content));
9744e971
J
205 $this->assertNotEmpty($content['_embedded']['items']);
206 $this->assertGreaterThanOrEqual(1, $content['total']);
769e19dc 207 $this->assertEquals(1, $content['page']);
9744e971 208 $this->assertGreaterThanOrEqual(1, $content['pages']);
769e19dc
J
209
210 $this->assertTrue(
211 $client->getResponse()->headers->contains(
212 'Content-Type',
213 'application/json'
214 )
215 );
216 }
217
218 public function testDeleteEntry()
219 {
220 $client = $this->createClient();
221 $headers = $this->generateHeaders('admin', 'mypassword');
222
223 $entry = $client->getContainer()
224 ->get('doctrine.orm.entity_manager')
225 ->getRepository('WallabagCoreBundle:Entry')
226 ->findOneByUser(1);
227
228 if (!$entry) {
229 $this->markTestSkipped('No content found in db.');
230 }
231
232 $client->request('DELETE', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
233
234 $this->assertEquals(200, $client->getResponse()->getStatusCode());
235
236 $content = json_decode($client->getResponse()->getContent(), true);
237
238 $this->assertEquals($entry->getTitle(), $content['title']);
239 $this->assertEquals($entry->getUrl(), $content['url']);
240
241 // We'll try to delete this entry again
242 $headers = $this->generateHeaders('admin', 'mypassword');
243
244 $client->request('DELETE', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
245
246 $this->assertEquals(404, $client->getResponse()->getStatusCode());
247 }
248
249 public function testPostEntry()
250 {
251 $client = $this->createClient();
252 $headers = $this->generateHeaders('admin', 'mypassword');
253
254 $client->request('POST', '/api/entries.json', array(
255 'url' => 'http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html',
256 'tags' => 'google',
257 ), array(), $headers);
258
259 $this->assertEquals(200, $client->getResponse()->getStatusCode());
260
261 $content = json_decode($client->getResponse()->getContent(), true);
262
263 $this->assertGreaterThan(0, $content['id']);
264 $this->assertEquals('http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html', $content['url']);
265 $this->assertEquals(false, $content['is_archived']);
266 $this->assertEquals(false, $content['is_starred']);
267 $this->assertCount(1, $content['tags']);
268 }
269
270 public function testPatchEntry()
271 {
272 $client = $this->createClient();
273 $headers = $this->generateHeaders('admin', 'mypassword');
274
275 $entry = $client->getContainer()
276 ->get('doctrine.orm.entity_manager')
277 ->getRepository('WallabagCoreBundle:Entry')
278 ->findOneByUser(1);
279
280 if (!$entry) {
281 $this->markTestSkipped('No content found in db.');
282 }
283
284 // hydrate the tags relations
285 $nbTags = count($entry->getTags());
286
287 $client->request('PATCH', '/api/entries/'.$entry->getId().'.json', array(
288 'title' => 'New awesome title',
289 'tags' => 'new tag '.uniqid(),
290 'star' => true,
291 'archive' => false,
292 ), array(), $headers);
293
294 $this->assertEquals(200, $client->getResponse()->getStatusCode());
295
296 $content = json_decode($client->getResponse()->getContent(), true);
297
298 $this->assertEquals($entry->getId(), $content['id']);
299 $this->assertEquals($entry->getUrl(), $content['url']);
300 $this->assertEquals('New awesome title', $content['title']);
301 $this->assertGreaterThan($nbTags, count($content['tags']));
302 }
303
304 public function testGetTagsEntry()
305 {
306 $client = $this->createClient();
307 $headers = $this->generateHeaders('admin', 'mypassword');
308
309 $entry = $client->getContainer()
310 ->get('doctrine.orm.entity_manager')
311 ->getRepository('WallabagCoreBundle:Entry')
312 ->findOneWithTags(1);
313
314 $entry = $entry[0];
315
316 if (!$entry) {
317 $this->markTestSkipped('No content found in db.');
318 }
319
320 $tags = array();
321 foreach ($entry->getTags() as $tag) {
322 $tags[] = array('id' => $tag->getId(), 'label' => $tag->getLabel());
323 }
324
325 $client->request('GET', '/api/entries/'.$entry->getId().'/tags', array(), array(), $headers);
326
327 $this->assertEquals(json_encode($tags, JSON_HEX_QUOT), $client->getResponse()->getContent());
328 }
329
330 public function testPostTagsOnEntry()
331 {
332 $client = $this->createClient();
333 $headers = $this->generateHeaders('admin', 'mypassword');
334
335 $entry = $client->getContainer()
336 ->get('doctrine.orm.entity_manager')
337 ->getRepository('WallabagCoreBundle:Entry')
338 ->findOneByUser(1);
339
340 if (!$entry) {
341 $this->markTestSkipped('No content found in db.');
342 }
343
344 $nbTags = count($entry->getTags());
345
346 $newTags = 'tag1,tag2,tag3';
347
348 $client->request('POST', '/api/entries/'.$entry->getId().'/tags', array('tags' => $newTags), array(), $headers);
349
350 $this->assertEquals(200, $client->getResponse()->getStatusCode());
351
352 $content = json_decode($client->getResponse()->getContent(), true);
353
354 $this->assertArrayHasKey('tags', $content);
4346a860 355 $this->assertEquals($nbTags + 3, count($content['tags']));
769e19dc
J
356
357 $entryDB = $client->getContainer()
358 ->get('doctrine.orm.entity_manager')
359 ->getRepository('WallabagCoreBundle:Entry')
360 ->find($entry->getId());
361
362 $tagsInDB = array();
363 foreach ($entryDB->getTags()->toArray() as $tag) {
364 $tagsInDB[$tag->getId()] = $tag->getLabel();
365 }
366
367 foreach (explode(',', $newTags) as $tag) {
368 $this->assertContains($tag, $tagsInDB);
369 }
370 }
371
372 public function testDeleteOneTagEntrie()
373 {
374 $client = $this->createClient();
375 $headers = $this->generateHeaders('admin', 'mypassword');
376
377 $entry = $client->getContainer()
378 ->get('doctrine.orm.entity_manager')
379 ->getRepository('WallabagCoreBundle:Entry')
380 ->findOneByUser(1);
381
382 if (!$entry) {
383 $this->markTestSkipped('No content found in db.');
384 }
385
386 // hydrate the tags relations
387 $nbTags = count($entry->getTags());
388 $tag = $entry->getTags()[0];
389
390 $client->request('DELETE', '/api/entries/'.$entry->getId().'/tags/'.$tag->getId().'.json', array(), array(), $headers);
391
392 $this->assertEquals(200, $client->getResponse()->getStatusCode());
393
394 $content = json_decode($client->getResponse()->getContent(), true);
395
396 $this->assertArrayHasKey('tags', $content);
4346a860 397 $this->assertEquals($nbTags - 1, count($content['tags']));
769e19dc
J
398 }
399
400 public function testGetUserTags()
401 {
402 $client = $this->createClient();
403 $headers = $this->generateHeaders('admin', 'mypassword');
404
405 $client->request('GET', '/api/tags.json', array(), array(), $headers);
406
407 $this->assertEquals(200, $client->getResponse()->getStatusCode());
408
409 $content = json_decode($client->getResponse()->getContent(), true);
410
411 $this->assertGreaterThan(0, $content);
412 $this->assertArrayHasKey('id', $content[0]);
413 $this->assertArrayHasKey('label', $content[0]);
414
415 return end($content);
416 }
417
418 /**
419 * @depends testGetUserTags
420 */
421 public function testDeleteUserTag($tag)
422 {
423 $client = $this->createClient();
424 $headers = $this->generateHeaders('admin', 'mypassword');
425
426 $client->request('DELETE', '/api/tags/'.$tag['id'].'.json', array(), array(), $headers);
427
428 $this->assertEquals(200, $client->getResponse()->getStatusCode());
429
430 $content = json_decode($client->getResponse()->getContent(), true);
431
432 $this->assertArrayHasKey('label', $content);
433 $this->assertEquals($tag['label'], $content['label']);
434 }
435}