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('archive' => 1), 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 testDeleteEntry()
195 $client = $this->createClient();
196 $headers = $this->generateHeaders('admin', 'mypassword');
198 $entry = $client->getContainer()
199 ->get('doctrine.orm.entity_manager')
200 ->getRepository('WallabagCoreBundle:Entry')
204 $this->markTestSkipped('No content found in db.');
207 $client->request('DELETE', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
209 $this->assertEquals(200, $client->getResponse()->getStatusCode());
211 $content = json_decode($client->getResponse()->getContent(), true);
213 $this->assertEquals($entry->getTitle(), $content['title']);
214 $this->assertEquals($entry->getUrl(), $content['url']);
216 // We'll try to delete this entry again
217 $headers = $this->generateHeaders('admin', 'mypassword');
219 $client->request('DELETE', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
221 $this->assertEquals(404, $client->getResponse()->getStatusCode());
224 public function testPostEntry()
226 $client = $this->createClient();
227 $headers = $this->generateHeaders('admin', 'mypassword');
229 $client->request('POST', '/api/entries.json', array(
230 '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',
232 ), array(), $headers);
234 $this->assertEquals(200, $client->getResponse()->getStatusCode());
236 $content = json_decode($client->getResponse()->getContent(), true);
238 $this->assertGreaterThan(0, $content['id']);
239 $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']);
240 $this->assertEquals(false, $content['is_archived']);
241 $this->assertEquals(false, $content['is_starred']);
242 $this->assertCount(1, $content['tags']);
245 public function testPatchEntry()
247 $client = $this->createClient();
248 $headers = $this->generateHeaders('admin', 'mypassword');
250 $entry = $client->getContainer()
251 ->get('doctrine.orm.entity_manager')
252 ->getRepository('WallabagCoreBundle:Entry')
256 $this->markTestSkipped('No content found in db.');
259 // hydrate the tags relations
260 $nbTags = count($entry->getTags());
262 $client->request('PATCH', '/api/entries/'.$entry->getId().'.json', array(
263 'title' => 'New awesome title',
264 'tags' => 'new tag '.uniqid(),
267 ), array(), $headers);
269 $this->assertEquals(200, $client->getResponse()->getStatusCode());
271 $content = json_decode($client->getResponse()->getContent(), true);
273 $this->assertEquals($entry->getId(), $content['id']);
274 $this->assertEquals($entry->getUrl(), $content['url']);
275 $this->assertEquals('New awesome title', $content['title']);
276 $this->assertGreaterThan($nbTags, count($content['tags']));
279 public function testGetTagsEntry()
281 $client = $this->createClient();
282 $headers = $this->generateHeaders('admin', 'mypassword');
284 $entry = $client->getContainer()
285 ->get('doctrine.orm.entity_manager')
286 ->getRepository('WallabagCoreBundle:Entry')
287 ->findOneWithTags(1);
292 $this->markTestSkipped('No content found in db.');
296 foreach ($entry->getTags() as $tag) {
297 $tags[] = array('id' => $tag->getId(), 'label' => $tag->getLabel());
300 $client->request('GET', '/api/entries/'.$entry->getId().'/tags', array(), array(), $headers);
302 $this->assertEquals(json_encode($tags, JSON_HEX_QUOT
), $client->getResponse()->getContent());
305 public function testPostTagsOnEntry()
307 $client = $this->createClient();
308 $headers = $this->generateHeaders('admin', 'mypassword');
310 $entry = $client->getContainer()
311 ->get('doctrine.orm.entity_manager')
312 ->getRepository('WallabagCoreBundle:Entry')
316 $this->markTestSkipped('No content found in db.');
319 $nbTags = count($entry->getTags());
321 $newTags = 'tag1,tag2,tag3';
323 $client->request('POST', '/api/entries/'.$entry->getId().'/tags', array('tags' => $newTags), array(), $headers);
325 $this->assertEquals(200, $client->getResponse()->getStatusCode());
327 $content = json_decode($client->getResponse()->getContent(), true);
329 $this->assertArrayHasKey('tags', $content);
330 $this->assertEquals($nbTags +
3, count($content['tags']));
332 $entryDB = $client->getContainer()
333 ->get('doctrine.orm.entity_manager')
334 ->getRepository('WallabagCoreBundle:Entry')
335 ->find($entry->getId());
338 foreach ($entryDB->getTags()->toArray() as $tag) {
339 $tagsInDB[$tag->getId()] = $tag->getLabel();
342 foreach (explode(',', $newTags) as $tag) {
343 $this->assertContains($tag, $tagsInDB);
347 public function testDeleteOneTagEntrie()
349 $client = $this->createClient();
350 $headers = $this->generateHeaders('admin', 'mypassword');
352 $entry = $client->getContainer()
353 ->get('doctrine.orm.entity_manager')
354 ->getRepository('WallabagCoreBundle:Entry')
358 $this->markTestSkipped('No content found in db.');
361 // hydrate the tags relations
362 $nbTags = count($entry->getTags());
363 $tag = $entry->getTags()[0];
365 $client->request('DELETE', '/api/entries/'.$entry->getId().'/tags/'.$tag->getId().'.json', array(), array(), $headers);
367 $this->assertEquals(200, $client->getResponse()->getStatusCode());
369 $content = json_decode($client->getResponse()->getContent(), true);
371 $this->assertArrayHasKey('tags', $content);
372 $this->assertEquals($nbTags - 1, count($content['tags']));
375 public function testGetUserTags()
377 $client = $this->createClient();
378 $headers = $this->generateHeaders('admin', 'mypassword');
380 $client->request('GET', '/api/tags.json', array(), array(), $headers);
382 $this->assertEquals(200, $client->getResponse()->getStatusCode());
384 $content = json_decode($client->getResponse()->getContent(), true);
386 $this->assertGreaterThan(0, $content);
387 $this->assertArrayHasKey('id', $content[0]);
388 $this->assertArrayHasKey('label', $content[0]);
390 return end($content);
394 * @depends testGetUserTags
396 public function testDeleteUserTag($tag)
398 $client = $this->createClient();
399 $headers = $this->generateHeaders('admin', 'mypassword');
401 $client->request('DELETE', '/api/tags/'.$tag['id'].'.json', array(), array(), $headers);
403 $this->assertEquals(200, $client->getResponse()->getStatusCode());
405 $content = json_decode($client->getResponse()->getContent(), true);
407 $this->assertArrayHasKey('label', $content);
408 $this->assertEquals($tag['label'], $content['label']);