]> git.immae.eu Git - github/wallabag/wallabag.git/blame - src/Wallabag/ApiBundle/Tests/Controller/WallabagRestControllerTest.php
Add version in 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 4
8a493541 5use Wallabag\ApiBundle\Tests\WallabagApiTestCase;
769e19dc 6
8a493541 7class WallabagRestControllerTest extends WallabagApiTestCase
769e19dc
J
8{
9 protected static $salt;
10
769e19dc
J
11 public function testGetOneEntry()
12 {
fcb1fba5 13 $entry = $this->client->getContainer()
769e19dc
J
14 ->get('doctrine.orm.entity_manager')
15 ->getRepository('WallabagCoreBundle:Entry')
16 ->findOneBy(array('user' => 1, 'isArchived' => false));
17
18 if (!$entry) {
19 $this->markTestSkipped('No content found in db.');
20 }
21
fcb1fba5
NL
22 $this->client->request('GET', '/api/entries/'.$entry->getId().'.json');
23 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
769e19dc 24
fcb1fba5 25 $content = json_decode($this->client->getResponse()->getContent(), true);
769e19dc
J
26
27 $this->assertEquals($entry->getTitle(), $content['title']);
28 $this->assertEquals($entry->getUrl(), $content['url']);
29 $this->assertCount(count($entry->getTags()), $content['tags']);
30
31 $this->assertTrue(
fcb1fba5 32 $this->client->getResponse()->headers->contains(
769e19dc
J
33 'Content-Type',
34 'application/json'
35 )
36 );
37 }
38
39 public function testGetOneEntryWrongUser()
40 {
fcb1fba5 41 $entry = $this->client->getContainer()
769e19dc
J
42 ->get('doctrine.orm.entity_manager')
43 ->getRepository('WallabagCoreBundle:Entry')
44 ->findOneBy(array('user' => 2, 'isArchived' => false));
45
46 if (!$entry) {
47 $this->markTestSkipped('No content found in db.');
48 }
49
fcb1fba5 50 $this->client->request('GET', '/api/entries/'.$entry->getId().'.json');
769e19dc 51
fcb1fba5 52 $this->assertEquals(403, $this->client->getResponse()->getStatusCode());
769e19dc
J
53 }
54
55 public function testGetEntries()
56 {
fcb1fba5 57 $this->client->request('GET', '/api/entries');
769e19dc 58
fcb1fba5 59 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
769e19dc 60
fcb1fba5 61 $content = json_decode($this->client->getResponse()->getContent(), true);
769e19dc
J
62
63 $this->assertGreaterThanOrEqual(1, count($content));
64 $this->assertNotEmpty($content['_embedded']['items']);
65 $this->assertGreaterThanOrEqual(1, $content['total']);
66 $this->assertEquals(1, $content['page']);
67 $this->assertGreaterThanOrEqual(1, $content['pages']);
68
69 $this->assertTrue(
fcb1fba5 70 $this->client->getResponse()->headers->contains(
769e19dc
J
71 'Content-Type',
72 'application/json'
73 )
74 );
75 }
76
77 public function testGetStarredEntries()
78 {
fcb1fba5 79 $this->client->request('GET', '/api/entries', array('star' => 1, 'sort' => 'updated'));
769e19dc 80
fcb1fba5 81 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
e6f55346 82
fcb1fba5 83 $content = json_decode($this->client->getResponse()->getContent(), true);
e6f55346
JB
84
85 $this->assertGreaterThanOrEqual(1, count($content));
86 $this->assertNotEmpty($content['_embedded']['items']);
87 $this->assertGreaterThanOrEqual(1, $content['total']);
88 $this->assertEquals(1, $content['page']);
89 $this->assertGreaterThanOrEqual(1, $content['pages']);
90
91 $this->assertTrue(
fcb1fba5 92 $this->client->getResponse()->headers->contains(
e6f55346
JB
93 'Content-Type',
94 'application/json'
95 )
96 );
97 }
98
99 public function testGetArchiveEntries()
100 {
fcb1fba5 101 $this->client->request('GET', '/api/entries', array('archive' => 1));
769e19dc 102
fcb1fba5 103 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
769e19dc 104
fcb1fba5 105 $content = json_decode($this->client->getResponse()->getContent(), true);
769e19dc
J
106
107 $this->assertGreaterThanOrEqual(1, count($content));
9744e971
J
108 $this->assertNotEmpty($content['_embedded']['items']);
109 $this->assertGreaterThanOrEqual(1, $content['total']);
769e19dc 110 $this->assertEquals(1, $content['page']);
9744e971 111 $this->assertGreaterThanOrEqual(1, $content['pages']);
769e19dc
J
112
113 $this->assertTrue(
fcb1fba5 114 $this->client->getResponse()->headers->contains(
769e19dc
J
115 'Content-Type',
116 'application/json'
117 )
118 );
119 }
120
121 public function testDeleteEntry()
122 {
fcb1fba5 123 $entry = $this->client->getContainer()
769e19dc
J
124 ->get('doctrine.orm.entity_manager')
125 ->getRepository('WallabagCoreBundle:Entry')
126 ->findOneByUser(1);
127
128 if (!$entry) {
129 $this->markTestSkipped('No content found in db.');
130 }
131
fcb1fba5 132 $this->client->request('DELETE', '/api/entries/'.$entry->getId().'.json');
769e19dc 133
fcb1fba5 134 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
769e19dc 135
fcb1fba5 136 $content = json_decode($this->client->getResponse()->getContent(), true);
769e19dc
J
137
138 $this->assertEquals($entry->getTitle(), $content['title']);
139 $this->assertEquals($entry->getUrl(), $content['url']);
140
141 // We'll try to delete this entry again
fcb1fba5 142 $this->client->request('DELETE', '/api/entries/'.$entry->getId().'.json');
769e19dc 143
fcb1fba5 144 $this->assertEquals(404, $this->client->getResponse()->getStatusCode());
769e19dc
J
145 }
146
147 public function testPostEntry()
148 {
fcb1fba5 149 $this->client->request('POST', '/api/entries.json', array(
769e19dc
J
150 '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',
151 'tags' => 'google',
fcb1fba5 152 ));
769e19dc 153
fcb1fba5 154 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
769e19dc 155
fcb1fba5 156 $content = json_decode($this->client->getResponse()->getContent(), true);
769e19dc
J
157
158 $this->assertGreaterThan(0, $content['id']);
159 $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']);
160 $this->assertEquals(false, $content['is_archived']);
161 $this->assertEquals(false, $content['is_starred']);
162 $this->assertCount(1, $content['tags']);
163 }
164
816ad405
TC
165 public function testPostArchivedEntry()
166 {
167 $this->client->request('POST', '/api/entries.json', array(
168 'url' => 'http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html',
169 'archive' => true,
170 'starred' => false,
171 ));
172
173 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
174
175 $content = json_decode($this->client->getResponse()->getContent(), true);
176
177 $this->assertGreaterThan(0, $content['id']);
178 $this->assertEquals('http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html', $content['url']);
179 $this->assertEquals(true, $content['is_archived']);
180 $this->assertEquals(false, $content['is_starred']);
181 }
182
769e19dc
J
183 public function testPatchEntry()
184 {
fcb1fba5 185 $entry = $this->client->getContainer()
769e19dc
J
186 ->get('doctrine.orm.entity_manager')
187 ->getRepository('WallabagCoreBundle:Entry')
188 ->findOneByUser(1);
189
190 if (!$entry) {
191 $this->markTestSkipped('No content found in db.');
192 }
193
194 // hydrate the tags relations
195 $nbTags = count($entry->getTags());
196
fcb1fba5 197 $this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', array(
769e19dc
J
198 'title' => 'New awesome title',
199 'tags' => 'new tag '.uniqid(),
200 'star' => true,
201 'archive' => false,
fcb1fba5 202 ));
769e19dc 203
fcb1fba5 204 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
769e19dc 205
fcb1fba5 206 $content = json_decode($this->client->getResponse()->getContent(), true);
769e19dc
J
207
208 $this->assertEquals($entry->getId(), $content['id']);
209 $this->assertEquals($entry->getUrl(), $content['url']);
210 $this->assertEquals('New awesome title', $content['title']);
211 $this->assertGreaterThan($nbTags, count($content['tags']));
212 }
213
214 public function testGetTagsEntry()
215 {
fcb1fba5 216 $entry = $this->client->getContainer()
769e19dc
J
217 ->get('doctrine.orm.entity_manager')
218 ->getRepository('WallabagCoreBundle:Entry')
219 ->findOneWithTags(1);
220
221 $entry = $entry[0];
222
223 if (!$entry) {
224 $this->markTestSkipped('No content found in db.');
225 }
226
227 $tags = array();
228 foreach ($entry->getTags() as $tag) {
fc732227 229 $tags[] = array('id' => $tag->getId(), 'label' => $tag->getLabel(), 'slug' => $tag->getSlug());
769e19dc
J
230 }
231
fcb1fba5 232 $this->client->request('GET', '/api/entries/'.$entry->getId().'/tags');
769e19dc 233
fcb1fba5 234 $this->assertEquals(json_encode($tags, JSON_HEX_QUOT), $this->client->getResponse()->getContent());
769e19dc
J
235 }
236
237 public function testPostTagsOnEntry()
238 {
fcb1fba5 239 $entry = $this->client->getContainer()
769e19dc
J
240 ->get('doctrine.orm.entity_manager')
241 ->getRepository('WallabagCoreBundle:Entry')
242 ->findOneByUser(1);
243
244 if (!$entry) {
245 $this->markTestSkipped('No content found in db.');
246 }
247
248 $nbTags = count($entry->getTags());
249
250 $newTags = 'tag1,tag2,tag3';
251
fcb1fba5 252 $this->client->request('POST', '/api/entries/'.$entry->getId().'/tags', array('tags' => $newTags));
769e19dc 253
fcb1fba5 254 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
769e19dc 255
fcb1fba5 256 $content = json_decode($this->client->getResponse()->getContent(), true);
769e19dc
J
257
258 $this->assertArrayHasKey('tags', $content);
4346a860 259 $this->assertEquals($nbTags + 3, count($content['tags']));
769e19dc 260
fcb1fba5 261 $entryDB = $this->client->getContainer()
769e19dc
J
262 ->get('doctrine.orm.entity_manager')
263 ->getRepository('WallabagCoreBundle:Entry')
264 ->find($entry->getId());
265
266 $tagsInDB = array();
267 foreach ($entryDB->getTags()->toArray() as $tag) {
268 $tagsInDB[$tag->getId()] = $tag->getLabel();
269 }
270
271 foreach (explode(',', $newTags) as $tag) {
272 $this->assertContains($tag, $tagsInDB);
273 }
274 }
275
fcb1fba5 276 public function testDeleteOneTagEntry()
769e19dc 277 {
fcb1fba5 278 $entry = $this->client->getContainer()
769e19dc
J
279 ->get('doctrine.orm.entity_manager')
280 ->getRepository('WallabagCoreBundle:Entry')
fcb1fba5
NL
281 ->findOneWithTags(1);
282 $entry = $entry[0];
769e19dc
J
283
284 if (!$entry) {
285 $this->markTestSkipped('No content found in db.');
286 }
287
288 // hydrate the tags relations
289 $nbTags = count($entry->getTags());
290 $tag = $entry->getTags()[0];
291
fcb1fba5 292 $this->client->request('DELETE', '/api/entries/'.$entry->getId().'/tags/'.$tag->getId().'.json');
769e19dc 293
fcb1fba5 294 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
769e19dc 295
fcb1fba5 296 $content = json_decode($this->client->getResponse()->getContent(), true);
769e19dc
J
297
298 $this->assertArrayHasKey('tags', $content);
4346a860 299 $this->assertEquals($nbTags - 1, count($content['tags']));
769e19dc
J
300 }
301
302 public function testGetUserTags()
303 {
fcb1fba5 304 $this->client->request('GET', '/api/tags.json');
769e19dc 305
fcb1fba5 306 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
769e19dc 307
fcb1fba5 308 $content = json_decode($this->client->getResponse()->getContent(), true);
769e19dc
J
309
310 $this->assertGreaterThan(0, $content);
311 $this->assertArrayHasKey('id', $content[0]);
312 $this->assertArrayHasKey('label', $content[0]);
313
314 return end($content);
315 }
316
317 /**
318 * @depends testGetUserTags
319 */
320 public function testDeleteUserTag($tag)
321 {
fcb1fba5 322 $this->client->request('DELETE', '/api/tags/'.$tag['id'].'.json');
769e19dc 323
fcb1fba5 324 $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
769e19dc 325
fcb1fba5 326 $content = json_decode($this->client->getResponse()->getContent(), true);
769e19dc
J
327
328 $this->assertArrayHasKey('label', $content);
329 $this->assertEquals($tag['label'], $content['label']);
fc732227 330 $this->assertEquals($tag['slug'], $content['slug']);
4059a061
JB
331
332 $entries = $entry = $this->client->getContainer()
333 ->get('doctrine.orm.entity_manager')
334 ->getRepository('WallabagCoreBundle:Entry')
335 ->findAllByTagId($this->user->getId(), $tag['id']);
336
337 $this->assertCount(0, $entries);
769e19dc
J
338 }
339}