3 namespace Wallabag\ApiBundle\Tests\Controller
;
5 use Symfony\Bundle\FrameworkBundle\Test\WebTestCase
;
7 class WallabagRestControllerTest
extends WebTestCase
9 protected static $salt;
12 * Grab the salt once and store it to be available for all tests.
14 public static function setUpBeforeClass()
16 $client = self
::createClient();
18 $user = $client->getContainer()
19 ->get('doctrine.orm.entity_manager')
20 ->getRepository('WallabagCoreBundle:User')
21 ->findOneByUsername('admin');
23 self
::$salt = $user->getSalt();
27 * Generate HTTP headers for authenticate user on API.
29 * @param string $username
30 * @param string $password
34 private function generateHeaders($username, $password)
36 $encryptedPassword = sha1($password.$username.self
::$salt);
37 $nonce = substr(md5(uniqid('nonce_', true)), 0, 16);
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));
44 'HTTP_AUTHORIZATION' => 'Authorization profile="UsernameToken"',
45 'HTTP_x-wsse' => 'X-WSSE: UsernameToken Username="'.$username.'", PasswordDigest="'.$digest.'", Nonce="'.$nonce.'", Created="'.$created.'"',
49 public function testGetSalt()
51 $client = $this->createClient();
52 $client->request('GET', '/api/salts/admin.json');
54 $user = $client->getContainer()
55 ->get('doctrine.orm.entity_manager')
56 ->getRepository('WallabagCoreBundle:User')
57 ->findOneByUsername('admin');
59 $this->assertEquals(200, $client->getResponse()->getStatusCode());
61 $content = json_decode($client->getResponse()->getContent(), true);
63 $this->assertArrayHasKey(0, $content);
64 $this->assertEquals($user->getSalt(), $content[0]);
66 $client->request('GET', '/api/salts/notfound.json');
67 $this->assertEquals(404, $client->getResponse()->getStatusCode());
70 public function testWithBadHeaders()
72 $client = $this->createClient();
74 $entry = $client->getContainer()
75 ->get('doctrine.orm.entity_manager')
76 ->getRepository('WallabagCoreBundle:Entry')
77 ->findOneByIsArchived(false);
80 $this->markTestSkipped('No content found in db.');
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"',
88 $client->request('GET', '/api/entries/'.$entry->getId().'.json', array(), array(), $badHeaders);
89 $this->assertEquals(403, $client->getResponse()->getStatusCode());
92 public function testGetOneEntry()
94 $client = $this->createClient();
95 $headers = $this->generateHeaders('admin', 'mypassword');
97 $entry = $client->getContainer()
98 ->get('doctrine.orm.entity_manager')
99 ->getRepository('WallabagCoreBundle:Entry')
100 ->findOneBy(array('user' => 1, 'isArchived' => false));
103 $this->markTestSkipped('No content found in db.');
106 $client->request('GET', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
108 $this->assertEquals(200, $client->getResponse()->getStatusCode());
110 $content = json_decode($client->getResponse()->getContent(), true);
112 $this->assertEquals($entry->getTitle(), $content['title']);
113 $this->assertEquals($entry->getUrl(), $content['url']);
114 $this->assertCount(count($entry->getTags()), $content['tags']);
117 $client->getResponse()->headers
->contains(
124 public function testGetOneEntryWrongUser()
126 $client = $this->createClient();
127 $headers = $this->generateHeaders('admin', 'mypassword');
129 $entry = $client->getContainer()
130 ->get('doctrine.orm.entity_manager')
131 ->getRepository('WallabagCoreBundle:Entry')
132 ->findOneBy(array('user' => 2, 'isArchived' => false));
135 $this->markTestSkipped('No content found in db.');
138 $client->request('GET', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
140 $this->assertEquals(403, $client->getResponse()->getStatusCode());
143 public function testGetEntries()
145 $client = $this->createClient();
146 $headers = $this->generateHeaders('admin', 'mypassword');
148 $client->request('GET', '/api/entries', array(), array(), $headers);
150 $this->assertEquals(200, $client->getResponse()->getStatusCode());
152 $content = json_decode($client->getResponse()->getContent(), true);
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']);
161 $client->getResponse()->headers
->contains(
168 public function testGetStarredEntries()
170 $client = $this->createClient();
171 $headers = $this->generateHeaders('admin', 'mypassword');
173 $client->request('GET', '/api/entries', array('star' => 1, 'sort' => 'updated'), array(), $headers);
175 $this->assertEquals(200, $client->getResponse()->getStatusCode());
177 $content = json_decode($client->getResponse()->getContent(), true);
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']);
186 $client->getResponse()->headers
->contains(
193 public function testGetArchiveEntries()
195 $client = $this->createClient();
196 $headers = $this->generateHeaders('admin', 'mypassword');
198 $client->request('GET', '/api/entries', array('archive' => 1), array(), $headers);
200 $this->assertEquals(200, $client->getResponse()->getStatusCode());
202 $content = json_decode($client->getResponse()->getContent(), true);
204 $this->assertGreaterThanOrEqual(1, count($content));
205 $this->assertNotEmpty($content['_embedded']['items']);
206 $this->assertGreaterThanOrEqual(1, $content['total']);
207 $this->assertEquals(1, $content['page']);
208 $this->assertGreaterThanOrEqual(1, $content['pages']);
211 $client->getResponse()->headers
->contains(
218 public function testDeleteEntry()
220 $client = $this->createClient();
221 $headers = $this->generateHeaders('admin', 'mypassword');
223 $entry = $client->getContainer()
224 ->get('doctrine.orm.entity_manager')
225 ->getRepository('WallabagCoreBundle:Entry')
229 $this->markTestSkipped('No content found in db.');
232 $client->request('DELETE', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
234 $this->assertEquals(200, $client->getResponse()->getStatusCode());
236 $content = json_decode($client->getResponse()->getContent(), true);
238 $this->assertEquals($entry->getTitle(), $content['title']);
239 $this->assertEquals($entry->getUrl(), $content['url']);
241 // We'll try to delete this entry again
242 $headers = $this->generateHeaders('admin', 'mypassword');
244 $client->request('DELETE', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
246 $this->assertEquals(404, $client->getResponse()->getStatusCode());
249 public function testPostEntry()
251 $client = $this->createClient();
252 $headers = $this->generateHeaders('admin', 'mypassword');
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',
257 ), array(), $headers);
259 $this->assertEquals(200, $client->getResponse()->getStatusCode());
261 $content = json_decode($client->getResponse()->getContent(), true);
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']);
270 public function testPatchEntry()
272 $client = $this->createClient();
273 $headers = $this->generateHeaders('admin', 'mypassword');
275 $entry = $client->getContainer()
276 ->get('doctrine.orm.entity_manager')
277 ->getRepository('WallabagCoreBundle:Entry')
281 $this->markTestSkipped('No content found in db.');
284 // hydrate the tags relations
285 $nbTags = count($entry->getTags());
287 $client->request('PATCH', '/api/entries/'.$entry->getId().'.json', array(
288 'title' => 'New awesome title',
289 'tags' => 'new tag '.uniqid(),
292 ), array(), $headers);
294 $this->assertEquals(200, $client->getResponse()->getStatusCode());
296 $content = json_decode($client->getResponse()->getContent(), true);
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']));
304 public function testGetTagsEntry()
306 $client = $this->createClient();
307 $headers = $this->generateHeaders('admin', 'mypassword');
309 $entry = $client->getContainer()
310 ->get('doctrine.orm.entity_manager')
311 ->getRepository('WallabagCoreBundle:Entry')
312 ->findOneWithTags(1);
317 $this->markTestSkipped('No content found in db.');
321 foreach ($entry->getTags() as $tag) {
322 $tags[] = array('id' => $tag->getId(), 'label' => $tag->getLabel());
325 $client->request('GET', '/api/entries/'.$entry->getId().'/tags', array(), array(), $headers);
327 $this->assertEquals(json_encode($tags, JSON_HEX_QUOT
), $client->getResponse()->getContent());
330 public function testPostTagsOnEntry()
332 $client = $this->createClient();
333 $headers = $this->generateHeaders('admin', 'mypassword');
335 $entry = $client->getContainer()
336 ->get('doctrine.orm.entity_manager')
337 ->getRepository('WallabagCoreBundle:Entry')
341 $this->markTestSkipped('No content found in db.');
344 $nbTags = count($entry->getTags());
346 $newTags = 'tag1,tag2,tag3';
348 $client->request('POST', '/api/entries/'.$entry->getId().'/tags', array('tags' => $newTags), array(), $headers);
350 $this->assertEquals(200, $client->getResponse()->getStatusCode());
352 $content = json_decode($client->getResponse()->getContent(), true);
354 $this->assertArrayHasKey('tags', $content);
355 $this->assertEquals($nbTags +
3, count($content['tags']));
357 $entryDB = $client->getContainer()
358 ->get('doctrine.orm.entity_manager')
359 ->getRepository('WallabagCoreBundle:Entry')
360 ->find($entry->getId());
363 foreach ($entryDB->getTags()->toArray() as $tag) {
364 $tagsInDB[$tag->getId()] = $tag->getLabel();
367 foreach (explode(',', $newTags) as $tag) {
368 $this->assertContains($tag, $tagsInDB);
372 public function testDeleteOneTagEntrie()
374 $client = $this->createClient();
375 $headers = $this->generateHeaders('admin', 'mypassword');
377 $entry = $client->getContainer()
378 ->get('doctrine.orm.entity_manager')
379 ->getRepository('WallabagCoreBundle:Entry')
383 $this->markTestSkipped('No content found in db.');
386 // hydrate the tags relations
387 $nbTags = count($entry->getTags());
388 $tag = $entry->getTags()[0];
390 $client->request('DELETE', '/api/entries/'.$entry->getId().'/tags/'.$tag->getId().'.json', array(), array(), $headers);
392 $this->assertEquals(200, $client->getResponse()->getStatusCode());
394 $content = json_decode($client->getResponse()->getContent(), true);
396 $this->assertArrayHasKey('tags', $content);
397 $this->assertEquals($nbTags - 1, count($content['tags']));
400 public function testGetUserTags()
402 $client = $this->createClient();
403 $headers = $this->generateHeaders('admin', 'mypassword');
405 $client->request('GET', '/api/tags.json', array(), array(), $headers);
407 $this->assertEquals(200, $client->getResponse()->getStatusCode());
409 $content = json_decode($client->getResponse()->getContent(), true);
411 $this->assertGreaterThan(0, $content);
412 $this->assertArrayHasKey('id', $content[0]);
413 $this->assertArrayHasKey('label', $content[0]);
415 return end($content);
419 * @depends testGetUserTags
421 public function testDeleteUserTag($tag)
423 $client = $this->createClient();
424 $headers = $this->generateHeaders('admin', 'mypassword');
426 $client->request('DELETE', '/api/tags/'.$tag['id'].'.json', array(), array(), $headers);
428 $this->assertEquals(200, $client->getResponse()->getStatusCode());
430 $content = json_decode($client->getResponse()->getContent(), true);
432 $this->assertArrayHasKey('label', $content);
433 $this->assertEquals($tag['label'], $content['label']);