aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php
diff options
context:
space:
mode:
authorJérémy Benoist <j0k3r@users.noreply.github.com>2017-10-23 11:09:17 +0200
committerGitHub <noreply@github.com>2017-10-23 11:09:17 +0200
commit1953a872932a63792293b4aec087880265ba89f7 (patch)
treefd16599e737fcdaf193c933ef3ec4a4ee248b117 /tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php
parentd83d25dadec2c38460a32d96f5d2903426fec9d3 (diff)
parent702f2d67d60ca963492b90dad74cb5f8dcc84e51 (diff)
downloadwallabag-1953a872932a63792293b4aec087880265ba89f7.tar.gz
wallabag-1953a872932a63792293b4aec087880265ba89f7.tar.zst
wallabag-1953a872932a63792293b4aec087880265ba89f7.zip
Merge pull request #3011 from wallabag/2.3
wallabag 2.3.0
Diffstat (limited to 'tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php')
-rw-r--r--tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php607
1 files changed, 469 insertions, 138 deletions
diff --git a/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php b/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php
index 0a65f9ce..95c64501 100644
--- a/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php
+++ b/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php
@@ -3,8 +3,10 @@
3namespace Tests\Wallabag\ApiBundle\Controller; 3namespace Tests\Wallabag\ApiBundle\Controller;
4 4
5use Tests\Wallabag\ApiBundle\WallabagApiTestCase; 5use Tests\Wallabag\ApiBundle\WallabagApiTestCase;
6use Wallabag\CoreBundle\Entity\Entry;
6use Wallabag\CoreBundle\Entity\Tag; 7use Wallabag\CoreBundle\Entity\Tag;
7use Wallabag\CoreBundle\Helper\ContentProxy; 8use Wallabag\CoreBundle\Helper\ContentProxy;
9use Wallabag\UserBundle\Entity\User;
8 10
9class EntryRestControllerTest extends WallabagApiTestCase 11class EntryRestControllerTest extends WallabagApiTestCase
10{ 12{
@@ -19,19 +21,19 @@ class EntryRestControllerTest extends WallabagApiTestCase
19 $this->markTestSkipped('No content found in db.'); 21 $this->markTestSkipped('No content found in db.');
20 } 22 }
21 23
22 $this->client->request('GET', '/api/entries/'.$entry->getId().'.json'); 24 $this->client->request('GET', '/api/entries/' . $entry->getId() . '.json');
23 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 25 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
24 26
25 $content = json_decode($this->client->getResponse()->getContent(), true); 27 $content = json_decode($this->client->getResponse()->getContent(), true);
26 28
27 $this->assertEquals($entry->getTitle(), $content['title']); 29 $this->assertSame($entry->getTitle(), $content['title']);
28 $this->assertEquals($entry->getUrl(), $content['url']); 30 $this->assertSame($entry->getUrl(), $content['url']);
29 $this->assertCount(count($entry->getTags()), $content['tags']); 31 $this->assertCount(count($entry->getTags()), $content['tags']);
30 $this->assertEquals($entry->getUserName(), $content['user_name']); 32 $this->assertSame($entry->getUserName(), $content['user_name']);
31 $this->assertEquals($entry->getUserEmail(), $content['user_email']); 33 $this->assertSame($entry->getUserEmail(), $content['user_email']);
32 $this->assertEquals($entry->getUserId(), $content['user_id']); 34 $this->assertSame($entry->getUserId(), $content['user_id']);
33 35
34 $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type')); 36 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
35 } 37 }
36 38
37 public function testExportEntry() 39 public function testExportEntry()
@@ -45,39 +47,39 @@ class EntryRestControllerTest extends WallabagApiTestCase
45 $this->markTestSkipped('No content found in db.'); 47 $this->markTestSkipped('No content found in db.');
46 } 48 }
47 49
48 $this->client->request('GET', '/api/entries/'.$entry->getId().'/export.epub'); 50 $this->client->request('GET', '/api/entries/' . $entry->getId() . '/export.epub');
49 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 51 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
50 52
51 // epub format got the content type in the content 53 // epub format got the content type in the content
52 $this->assertContains('application/epub', $this->client->getResponse()->getContent()); 54 $this->assertContains('application/epub', $this->client->getResponse()->getContent());
53 $this->assertEquals('application/epub+zip', $this->client->getResponse()->headers->get('Content-Type')); 55 $this->assertSame('application/epub+zip', $this->client->getResponse()->headers->get('Content-Type'));
54 56
55 // re-auth client for mobi 57 // re-auth client for mobi
56 $client = $this->createAuthorizedClient(); 58 $client = $this->createAuthorizedClient();
57 $client->request('GET', '/api/entries/'.$entry->getId().'/export.mobi'); 59 $client->request('GET', '/api/entries/' . $entry->getId() . '/export.mobi');
58 $this->assertEquals(200, $client->getResponse()->getStatusCode()); 60 $this->assertSame(200, $client->getResponse()->getStatusCode());
59 61
60 $this->assertEquals('application/x-mobipocket-ebook', $client->getResponse()->headers->get('Content-Type')); 62 $this->assertSame('application/x-mobipocket-ebook', $client->getResponse()->headers->get('Content-Type'));
61 63
62 // re-auth client for pdf 64 // re-auth client for pdf
63 $client = $this->createAuthorizedClient(); 65 $client = $this->createAuthorizedClient();
64 $client->request('GET', '/api/entries/'.$entry->getId().'/export.pdf'); 66 $client->request('GET', '/api/entries/' . $entry->getId() . '/export.pdf');
65 $this->assertEquals(200, $client->getResponse()->getStatusCode()); 67 $this->assertSame(200, $client->getResponse()->getStatusCode());
66 68
67 $this->assertContains('PDF-', $client->getResponse()->getContent()); 69 $this->assertContains('PDF-', $client->getResponse()->getContent());
68 $this->assertEquals('application/pdf', $client->getResponse()->headers->get('Content-Type')); 70 $this->assertSame('application/pdf', $client->getResponse()->headers->get('Content-Type'));
69 71
70 // re-auth client for pdf 72 // re-auth client for pdf
71 $client = $this->createAuthorizedClient(); 73 $client = $this->createAuthorizedClient();
72 $client->request('GET', '/api/entries/'.$entry->getId().'/export.txt'); 74 $client->request('GET', '/api/entries/' . $entry->getId() . '/export.txt');
73 $this->assertEquals(200, $client->getResponse()->getStatusCode()); 75 $this->assertSame(200, $client->getResponse()->getStatusCode());
74 76
75 $this->assertContains('text/plain', $client->getResponse()->headers->get('Content-Type')); 77 $this->assertContains('text/plain', $client->getResponse()->headers->get('Content-Type'));
76 78
77 // re-auth client for pdf 79 // re-auth client for pdf
78 $client = $this->createAuthorizedClient(); 80 $client = $this->createAuthorizedClient();
79 $client->request('GET', '/api/entries/'.$entry->getId().'/export.csv'); 81 $client->request('GET', '/api/entries/' . $entry->getId() . '/export.csv');
80 $this->assertEquals(200, $client->getResponse()->getStatusCode()); 82 $this->assertSame(200, $client->getResponse()->getStatusCode());
81 83
82 $this->assertContains('application/csv', $client->getResponse()->headers->get('Content-Type')); 84 $this->assertContains('application/csv', $client->getResponse()->headers->get('Content-Type'));
83 } 85 }
@@ -93,26 +95,26 @@ class EntryRestControllerTest extends WallabagApiTestCase
93 $this->markTestSkipped('No content found in db.'); 95 $this->markTestSkipped('No content found in db.');
94 } 96 }
95 97
96 $this->client->request('GET', '/api/entries/'.$entry->getId().'.json'); 98 $this->client->request('GET', '/api/entries/' . $entry->getId() . '.json');
97 99
98 $this->assertEquals(403, $this->client->getResponse()->getStatusCode()); 100 $this->assertSame(403, $this->client->getResponse()->getStatusCode());
99 } 101 }
100 102
101 public function testGetEntries() 103 public function testGetEntries()
102 { 104 {
103 $this->client->request('GET', '/api/entries'); 105 $this->client->request('GET', '/api/entries');
104 106
105 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 107 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
106 108
107 $content = json_decode($this->client->getResponse()->getContent(), true); 109 $content = json_decode($this->client->getResponse()->getContent(), true);
108 110
109 $this->assertGreaterThanOrEqual(1, count($content)); 111 $this->assertGreaterThanOrEqual(1, count($content));
110 $this->assertNotEmpty($content['_embedded']['items']); 112 $this->assertNotEmpty($content['_embedded']['items']);
111 $this->assertGreaterThanOrEqual(1, $content['total']); 113 $this->assertGreaterThanOrEqual(1, $content['total']);
112 $this->assertEquals(1, $content['page']); 114 $this->assertSame(1, $content['page']);
113 $this->assertGreaterThanOrEqual(1, $content['pages']); 115 $this->assertGreaterThanOrEqual(1, $content['pages']);
114 116
115 $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type')); 117 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
116 } 118 }
117 119
118 public function testGetEntriesWithFullOptions() 120 public function testGetEntriesWithFullOptions()
@@ -126,17 +128,18 @@ class EntryRestControllerTest extends WallabagApiTestCase
126 'perPage' => 2, 128 'perPage' => 2,
127 'tags' => 'foo', 129 'tags' => 'foo',
128 'since' => 1443274283, 130 'since' => 1443274283,
131 'public' => 0,
129 ]); 132 ]);
130 133
131 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 134 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
132 135
133 $content = json_decode($this->client->getResponse()->getContent(), true); 136 $content = json_decode($this->client->getResponse()->getContent(), true);
134 137
135 $this->assertGreaterThanOrEqual(1, count($content)); 138 $this->assertGreaterThanOrEqual(1, count($content));
136 $this->assertArrayHasKey('items', $content['_embedded']); 139 $this->assertArrayHasKey('items', $content['_embedded']);
137 $this->assertGreaterThanOrEqual(0, $content['total']); 140 $this->assertGreaterThanOrEqual(0, $content['total']);
138 $this->assertEquals(1, $content['page']); 141 $this->assertSame(1, $content['page']);
139 $this->assertEquals(2, $content['limit']); 142 $this->assertSame(2, $content['limit']);
140 $this->assertGreaterThanOrEqual(1, $content['pages']); 143 $this->assertGreaterThanOrEqual(1, $content['pages']);
141 144
142 $this->assertArrayHasKey('_links', $content); 145 $this->assertArrayHasKey('_links', $content);
@@ -152,9 +155,56 @@ class EntryRestControllerTest extends WallabagApiTestCase
152 $this->assertContains('order=asc', $content['_links'][$link]['href']); 155 $this->assertContains('order=asc', $content['_links'][$link]['href']);
153 $this->assertContains('tags=foo', $content['_links'][$link]['href']); 156 $this->assertContains('tags=foo', $content['_links'][$link]['href']);
154 $this->assertContains('since=1443274283', $content['_links'][$link]['href']); 157 $this->assertContains('since=1443274283', $content['_links'][$link]['href']);
158 $this->assertContains('public=0', $content['_links'][$link]['href']);
155 } 159 }
156 160
157 $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type')); 161 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
162 }
163
164 public function testGetEntriesPublicOnly()
165 {
166 $entry = $this->client->getContainer()
167 ->get('doctrine.orm.entity_manager')
168 ->getRepository('WallabagCoreBundle:Entry')
169 ->findOneByUser(1);
170
171 if (!$entry) {
172 $this->markTestSkipped('No content found in db.');
173 }
174
175 // generate at least one public entry
176 $entry->generateUid();
177
178 $em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
179 $em->persist($entry);
180 $em->flush();
181
182 $this->client->request('GET', '/api/entries', [
183 'public' => 1,
184 ]);
185
186 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
187
188 $content = json_decode($this->client->getResponse()->getContent(), true);
189
190 $this->assertGreaterThanOrEqual(1, count($content));
191 $this->assertArrayHasKey('items', $content['_embedded']);
192 $this->assertGreaterThanOrEqual(1, $content['total']);
193 $this->assertSame(1, $content['page']);
194 $this->assertSame(30, $content['limit']);
195 $this->assertGreaterThanOrEqual(1, $content['pages']);
196
197 $this->assertArrayHasKey('_links', $content);
198 $this->assertArrayHasKey('self', $content['_links']);
199 $this->assertArrayHasKey('first', $content['_links']);
200 $this->assertArrayHasKey('last', $content['_links']);
201
202 foreach (['self', 'first', 'last'] as $link) {
203 $this->assertArrayHasKey('href', $content['_links'][$link]);
204 $this->assertContains('public=1', $content['_links'][$link]['href']);
205 }
206
207 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
158 } 208 }
159 209
160 public function testGetEntriesOnPageTwo() 210 public function testGetEntriesOnPageTwo()
@@ -164,27 +214,27 @@ class EntryRestControllerTest extends WallabagApiTestCase
164 'perPage' => 2, 214 'perPage' => 2,
165 ]); 215 ]);
166 216
167 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 217 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
168 218
169 $content = json_decode($this->client->getResponse()->getContent(), true); 219 $content = json_decode($this->client->getResponse()->getContent(), true);
170 220
171 $this->assertGreaterThanOrEqual(0, $content['total']); 221 $this->assertGreaterThanOrEqual(0, $content['total']);
172 $this->assertEquals(2, $content['page']); 222 $this->assertSame(2, $content['page']);
173 $this->assertEquals(2, $content['limit']); 223 $this->assertSame(2, $content['limit']);
174 } 224 }
175 225
176 public function testGetStarredEntries() 226 public function testGetStarredEntries()
177 { 227 {
178 $this->client->request('GET', '/api/entries', ['starred' => 1, 'sort' => 'updated']); 228 $this->client->request('GET', '/api/entries', ['starred' => 1, 'sort' => 'updated']);
179 229
180 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 230 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
181 231
182 $content = json_decode($this->client->getResponse()->getContent(), true); 232 $content = json_decode($this->client->getResponse()->getContent(), true);
183 233
184 $this->assertGreaterThanOrEqual(1, count($content)); 234 $this->assertGreaterThanOrEqual(1, count($content));
185 $this->assertNotEmpty($content['_embedded']['items']); 235 $this->assertNotEmpty($content['_embedded']['items']);
186 $this->assertGreaterThanOrEqual(1, $content['total']); 236 $this->assertGreaterThanOrEqual(1, $content['total']);
187 $this->assertEquals(1, $content['page']); 237 $this->assertSame(1, $content['page']);
188 $this->assertGreaterThanOrEqual(1, $content['pages']); 238 $this->assertGreaterThanOrEqual(1, $content['pages']);
189 239
190 $this->assertArrayHasKey('_links', $content); 240 $this->assertArrayHasKey('_links', $content);
@@ -198,21 +248,21 @@ class EntryRestControllerTest extends WallabagApiTestCase
198 $this->assertContains('sort=updated', $content['_links'][$link]['href']); 248 $this->assertContains('sort=updated', $content['_links'][$link]['href']);
199 } 249 }
200 250
201 $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type')); 251 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
202 } 252 }
203 253
204 public function testGetArchiveEntries() 254 public function testGetArchiveEntries()
205 { 255 {
206 $this->client->request('GET', '/api/entries', ['archive' => 1]); 256 $this->client->request('GET', '/api/entries', ['archive' => 1]);
207 257
208 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 258 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
209 259
210 $content = json_decode($this->client->getResponse()->getContent(), true); 260 $content = json_decode($this->client->getResponse()->getContent(), true);
211 261
212 $this->assertGreaterThanOrEqual(1, count($content)); 262 $this->assertGreaterThanOrEqual(1, count($content));
213 $this->assertNotEmpty($content['_embedded']['items']); 263 $this->assertNotEmpty($content['_embedded']['items']);
214 $this->assertGreaterThanOrEqual(1, $content['total']); 264 $this->assertGreaterThanOrEqual(1, $content['total']);
215 $this->assertEquals(1, $content['page']); 265 $this->assertSame(1, $content['page']);
216 $this->assertGreaterThanOrEqual(1, $content['pages']); 266 $this->assertGreaterThanOrEqual(1, $content['pages']);
217 267
218 $this->assertArrayHasKey('_links', $content); 268 $this->assertArrayHasKey('_links', $content);
@@ -225,23 +275,26 @@ class EntryRestControllerTest extends WallabagApiTestCase
225 $this->assertContains('archive=1', $content['_links'][$link]['href']); 275 $this->assertContains('archive=1', $content['_links'][$link]['href']);
226 } 276 }
227 277
228 $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type')); 278 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
229 } 279 }
230 280
231 public function testGetTaggedEntries() 281 public function testGetTaggedEntries()
232 { 282 {
233 $this->client->request('GET', '/api/entries', ['tags' => 'foo,bar']); 283 $this->client->request('GET', '/api/entries', ['tags' => 'foo,bar']);
234 284
235 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 285 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
236 286
237 $content = json_decode($this->client->getResponse()->getContent(), true); 287 $content = json_decode($this->client->getResponse()->getContent(), true);
238 288
239 $this->assertGreaterThanOrEqual(1, count($content)); 289 $this->assertGreaterThanOrEqual(1, count($content));
240 $this->assertNotEmpty($content['_embedded']['items']); 290 $this->assertNotEmpty($content['_embedded']['items']);
241 $this->assertGreaterThanOrEqual(1, $content['total']); 291 $this->assertGreaterThanOrEqual(1, $content['total']);
242 $this->assertEquals(1, $content['page']); 292 $this->assertSame(1, $content['page']);
243 $this->assertGreaterThanOrEqual(1, $content['pages']); 293 $this->assertGreaterThanOrEqual(1, $content['pages']);
244 294
295 $this->assertContains('foo', array_column($content['_embedded']['items'][0]['tags'], 'label'), 'Entries tags should have "foo" tag');
296 $this->assertContains('bar', array_column($content['_embedded']['items'][0]['tags'], 'label'), 'Entries tags should have "bar" tag');
297
245 $this->assertArrayHasKey('_links', $content); 298 $this->assertArrayHasKey('_links', $content);
246 $this->assertArrayHasKey('self', $content['_links']); 299 $this->assertArrayHasKey('self', $content['_links']);
247 $this->assertArrayHasKey('first', $content['_links']); 300 $this->assertArrayHasKey('first', $content['_links']);
@@ -249,24 +302,31 @@ class EntryRestControllerTest extends WallabagApiTestCase
249 302
250 foreach (['self', 'first', 'last'] as $link) { 303 foreach (['self', 'first', 'last'] as $link) {
251 $this->assertArrayHasKey('href', $content['_links'][$link]); 304 $this->assertArrayHasKey('href', $content['_links'][$link]);
252 $this->assertContains('tags='.urlencode('foo,bar'), $content['_links'][$link]['href']); 305 $this->assertContains('tags=' . urlencode('foo,bar'), $content['_links'][$link]['href']);
253 } 306 }
254 307
255 $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type')); 308 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
309 }
310
311 public function testGetTaggedEntriesWithBadParams()
312 {
313 $this->client->request('GET', '/api/entries', ['tags' => ['foo', 'bar']]);
314
315 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
256 } 316 }
257 317
258 public function testGetDatedEntries() 318 public function testGetDatedEntries()
259 { 319 {
260 $this->client->request('GET', '/api/entries', ['since' => 1443274283]); 320 $this->client->request('GET', '/api/entries', ['since' => 1443274283]);
261 321
262 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 322 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
263 323
264 $content = json_decode($this->client->getResponse()->getContent(), true); 324 $content = json_decode($this->client->getResponse()->getContent(), true);
265 325
266 $this->assertGreaterThanOrEqual(1, count($content)); 326 $this->assertGreaterThanOrEqual(1, count($content));
267 $this->assertNotEmpty($content['_embedded']['items']); 327 $this->assertNotEmpty($content['_embedded']['items']);
268 $this->assertGreaterThanOrEqual(1, $content['total']); 328 $this->assertGreaterThanOrEqual(1, $content['total']);
269 $this->assertEquals(1, $content['page']); 329 $this->assertSame(1, $content['page']);
270 $this->assertGreaterThanOrEqual(1, $content['pages']); 330 $this->assertGreaterThanOrEqual(1, $content['pages']);
271 331
272 $this->assertArrayHasKey('_links', $content); 332 $this->assertArrayHasKey('_links', $content);
@@ -279,7 +339,7 @@ class EntryRestControllerTest extends WallabagApiTestCase
279 $this->assertContains('since=1443274283', $content['_links'][$link]['href']); 339 $this->assertContains('since=1443274283', $content['_links'][$link]['href']);
280 } 340 }
281 341
282 $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type')); 342 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
283 } 343 }
284 344
285 public function testGetDatedSupEntries() 345 public function testGetDatedSupEntries()
@@ -287,15 +347,15 @@ class EntryRestControllerTest extends WallabagApiTestCase
287 $future = new \DateTime(date('Y-m-d H:i:s')); 347 $future = new \DateTime(date('Y-m-d H:i:s'));
288 $this->client->request('GET', '/api/entries', ['since' => $future->getTimestamp() + 1000]); 348 $this->client->request('GET', '/api/entries', ['since' => $future->getTimestamp() + 1000]);
289 349
290 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 350 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
291 351
292 $content = json_decode($this->client->getResponse()->getContent(), true); 352 $content = json_decode($this->client->getResponse()->getContent(), true);
293 353
294 $this->assertGreaterThanOrEqual(1, count($content)); 354 $this->assertGreaterThanOrEqual(1, count($content));
295 $this->assertEmpty($content['_embedded']['items']); 355 $this->assertEmpty($content['_embedded']['items']);
296 $this->assertEquals(0, $content['total']); 356 $this->assertSame(0, $content['total']);
297 $this->assertEquals(1, $content['page']); 357 $this->assertSame(1, $content['page']);
298 $this->assertEquals(1, $content['pages']); 358 $this->assertSame(1, $content['pages']);
299 359
300 $this->assertArrayHasKey('_links', $content); 360 $this->assertArrayHasKey('_links', $content);
301 $this->assertArrayHasKey('self', $content['_links']); 361 $this->assertArrayHasKey('self', $content['_links']);
@@ -304,10 +364,10 @@ class EntryRestControllerTest extends WallabagApiTestCase
304 364
305 foreach (['self', 'first', 'last'] as $link) { 365 foreach (['self', 'first', 'last'] as $link) {
306 $this->assertArrayHasKey('href', $content['_links'][$link]); 366 $this->assertArrayHasKey('href', $content['_links'][$link]);
307 $this->assertContains('since='.($future->getTimestamp() + 1000), $content['_links'][$link]['href']); 367 $this->assertContains('since=' . ($future->getTimestamp() + 1000), $content['_links'][$link]['href']);
308 } 368 }
309 369
310 $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type')); 370 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
311 } 371 }
312 372
313 public function testDeleteEntry() 373 public function testDeleteEntry()
@@ -315,25 +375,25 @@ class EntryRestControllerTest extends WallabagApiTestCase
315 $entry = $this->client->getContainer() 375 $entry = $this->client->getContainer()
316 ->get('doctrine.orm.entity_manager') 376 ->get('doctrine.orm.entity_manager')
317 ->getRepository('WallabagCoreBundle:Entry') 377 ->getRepository('WallabagCoreBundle:Entry')
318 ->findOneByUser(1); 378 ->findOneByUser(1, ['id' => 'asc']);
319 379
320 if (!$entry) { 380 if (!$entry) {
321 $this->markTestSkipped('No content found in db.'); 381 $this->markTestSkipped('No content found in db.');
322 } 382 }
323 383
324 $this->client->request('DELETE', '/api/entries/'.$entry->getId().'.json'); 384 $this->client->request('DELETE', '/api/entries/' . $entry->getId() . '.json');
325 385
326 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 386 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
327 387
328 $content = json_decode($this->client->getResponse()->getContent(), true); 388 $content = json_decode($this->client->getResponse()->getContent(), true);
329 389
330 $this->assertEquals($entry->getTitle(), $content['title']); 390 $this->assertSame($entry->getTitle(), $content['title']);
331 $this->assertEquals($entry->getUrl(), $content['url']); 391 $this->assertSame($entry->getUrl(), $content['url']);
332 392
333 // We'll try to delete this entry again 393 // We'll try to delete this entry again
334 $this->client->request('DELETE', '/api/entries/'.$entry->getId().'.json'); 394 $this->client->request('DELETE', '/api/entries/' . $entry->getId() . '.json');
335 395
336 $this->assertEquals(404, $this->client->getResponse()->getStatusCode()); 396 $this->assertSame(404, $this->client->getResponse()->getStatusCode());
337 } 397 }
338 398
339 public function testPostEntry() 399 public function testPostEntry()
@@ -342,38 +402,61 @@ class EntryRestControllerTest extends WallabagApiTestCase
342 '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', 402 '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',
343 'tags' => 'google', 403 'tags' => 'google',
344 'title' => 'New title for my article', 404 'title' => 'New title for my article',
405 'content' => 'my content',
406 'language' => 'de',
407 'published_at' => '2016-09-08T11:55:58+0200',
408 'authors' => 'bob,helen',
409 'public' => 1,
345 ]); 410 ]);
346 411
347 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 412 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
348 413
349 $content = json_decode($this->client->getResponse()->getContent(), true); 414 $content = json_decode($this->client->getResponse()->getContent(), true);
350 415
351 $this->assertGreaterThan(0, $content['id']); 416 $this->assertGreaterThan(0, $content['id']);
352 $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']); 417 $this->assertSame('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']);
353 $this->assertEquals(false, $content['is_archived']); 418 $this->assertSame(0, $content['is_archived']);
354 $this->assertEquals(false, $content['is_starred']); 419 $this->assertSame(0, $content['is_starred']);
355 $this->assertEquals('New title for my article', $content['title']); 420 $this->assertNull($content['starred_at']);
356 $this->assertEquals(1, $content['user_id']); 421 $this->assertSame('New title for my article', $content['title']);
357 $this->assertCount(1, $content['tags']); 422 $this->assertSame(1, $content['user_id']);
423 $this->assertCount(2, $content['tags']);
424 $this->assertSame('my content', $content['content']);
425 $this->assertSame('de', $content['language']);
426 $this->assertSame('2016-09-08T11:55:58+0200', $content['published_at']);
427 $this->assertCount(2, $content['published_by']);
428 $this->assertContains('bob', $content['published_by']);
429 $this->assertContains('helen', $content['published_by']);
430 $this->assertTrue($content['is_public'], 'A public link has been generated for that entry');
358 } 431 }
359 432
360 public function testPostSameEntry() 433 public function testPostSameEntry()
361 { 434 {
435 $em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
436 $entry = new Entry($em->getReference(User::class, 1));
437 $entry->setUrl('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');
438 $entry->setArchived(true);
439 $entry->addTag((new Tag())->setLabel('google'));
440 $entry->addTag((new Tag())->setLabel('apple'));
441 $em->persist($entry);
442 $em->flush();
443 $em->clear();
444
362 $this->client->request('POST', '/api/entries.json', [ 445 $this->client->request('POST', '/api/entries.json', [
363 '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', 446 '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',
364 'archive' => '1', 447 'archive' => '1',
365 'tags' => 'google, apple', 448 'tags' => 'google, apple',
366 ]); 449 ]);
367 450
368 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 451 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
369 452
370 $content = json_decode($this->client->getResponse()->getContent(), true); 453 $content = json_decode($this->client->getResponse()->getContent(), true);
371 454
372 $this->assertGreaterThan(0, $content['id']); 455 $this->assertGreaterThan(0, $content['id']);
373 $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']); 456 $this->assertSame('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']);
374 $this->assertEquals(true, $content['is_archived']); 457 $this->assertSame(1, $content['is_archived']);
375 $this->assertEquals(false, $content['is_starred']); 458 $this->assertSame(0, $content['is_starred']);
376 $this->assertCount(2, $content['tags']); 459 $this->assertCount(3, $content['tags']);
377 } 460 }
378 461
379 public function testPostEntryWhenFetchContentFails() 462 public function testPostEntryWhenFetchContentFails()
@@ -394,10 +477,10 @@ class EntryRestControllerTest extends WallabagApiTestCase
394 'url' => 'http://www.example.com/', 477 'url' => 'http://www.example.com/',
395 ]); 478 ]);
396 479
397 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 480 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
398 $content = json_decode($this->client->getResponse()->getContent(), true); 481 $content = json_decode($this->client->getResponse()->getContent(), true);
399 $this->assertGreaterThan(0, $content['id']); 482 $this->assertGreaterThan(0, $content['id']);
400 $this->assertEquals('http://www.example.com/', $content['url']); 483 $this->assertSame('http://www.example.com/', $content['url']);
401 } finally { 484 } finally {
402 // Remove the created entry to avoid side effects on other tests 485 // Remove the created entry to avoid side effects on other tests
403 if (isset($content['id'])) { 486 if (isset($content['id'])) {
@@ -411,21 +494,23 @@ class EntryRestControllerTest extends WallabagApiTestCase
411 494
412 public function testPostArchivedAndStarredEntry() 495 public function testPostArchivedAndStarredEntry()
413 { 496 {
497 $now = new \DateTime();
414 $this->client->request('POST', '/api/entries.json', [ 498 $this->client->request('POST', '/api/entries.json', [
415 'url' => 'http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html', 499 'url' => 'http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html',
416 'archive' => '1', 500 'archive' => '1',
417 'starred' => '1', 501 'starred' => '1',
418 ]); 502 ]);
419 503
420 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 504 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
421 505
422 $content = json_decode($this->client->getResponse()->getContent(), true); 506 $content = json_decode($this->client->getResponse()->getContent(), true);
423 507
424 $this->assertGreaterThan(0, $content['id']); 508 $this->assertGreaterThan(0, $content['id']);
425 $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']); 509 $this->assertSame('http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html', $content['url']);
426 $this->assertEquals(true, $content['is_archived']); 510 $this->assertSame(1, $content['is_archived']);
427 $this->assertEquals(true, $content['is_starred']); 511 $this->assertSame(1, $content['is_starred']);
428 $this->assertEquals(1, $content['user_id']); 512 $this->assertGreaterThanOrEqual($now->getTimestamp(), (new \DateTime($content['starred_at']))->getTimestamp());
513 $this->assertSame(1, $content['user_id']);
429 } 514 }
430 515
431 public function testPostArchivedAndStarredEntryWithoutQuotes() 516 public function testPostArchivedAndStarredEntryWithoutQuotes()
@@ -436,14 +521,14 @@ class EntryRestControllerTest extends WallabagApiTestCase
436 'starred' => 1, 521 'starred' => 1,
437 ]); 522 ]);
438 523
439 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 524 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
440 525
441 $content = json_decode($this->client->getResponse()->getContent(), true); 526 $content = json_decode($this->client->getResponse()->getContent(), true);
442 527
443 $this->assertGreaterThan(0, $content['id']); 528 $this->assertGreaterThan(0, $content['id']);
444 $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']); 529 $this->assertSame('http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html', $content['url']);
445 $this->assertEquals(false, $content['is_archived']); 530 $this->assertSame(0, $content['is_archived']);
446 $this->assertEquals(true, $content['is_starred']); 531 $this->assertSame(1, $content['is_starred']);
447 } 532 }
448 533
449 public function testPatchEntry() 534 public function testPatchEntry()
@@ -457,25 +542,35 @@ class EntryRestControllerTest extends WallabagApiTestCase
457 $this->markTestSkipped('No content found in db.'); 542 $this->markTestSkipped('No content found in db.');
458 } 543 }
459 544
460 // hydrate the tags relations 545 $this->client->request('PATCH', '/api/entries/' . $entry->getId() . '.json', [
461 $nbTags = count($entry->getTags());
462
463 $this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', [
464 'title' => 'New awesome title', 546 'title' => 'New awesome title',
465 'tags' => 'new tag '.uniqid(), 547 'tags' => 'new tag ' . uniqid(),
466 'starred' => '1', 548 'starred' => '1',
467 'archive' => '0', 549 'archive' => '0',
550 'language' => 'de_AT',
551 'preview_picture' => 'http://preview.io/picture.jpg',
552 'authors' => 'bob,sponge',
553 'content' => 'awesome',
554 'public' => 0,
555 'published_at' => 1488833381,
468 ]); 556 ]);
469 557
470 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 558 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
471 559
472 $content = json_decode($this->client->getResponse()->getContent(), true); 560 $content = json_decode($this->client->getResponse()->getContent(), true);
473 561
474 $this->assertEquals($entry->getId(), $content['id']); 562 $this->assertSame($entry->getId(), $content['id']);
475 $this->assertEquals($entry->getUrl(), $content['url']); 563 $this->assertSame($entry->getUrl(), $content['url']);
476 $this->assertEquals('New awesome title', $content['title']); 564 $this->assertSame('New awesome title', $content['title']);
477 $this->assertGreaterThan($nbTags, count($content['tags'])); 565 $this->assertGreaterThanOrEqual(1, count($content['tags']), 'We force only one tag');
478 $this->assertEquals(1, $content['user_id']); 566 $this->assertSame(1, $content['user_id']);
567 $this->assertSame('de_AT', $content['language']);
568 $this->assertSame('http://preview.io/picture.jpg', $content['preview_picture']);
569 $this->assertContains('sponge', $content['published_by']);
570 $this->assertContains('bob', $content['published_by']);
571 $this->assertSame('awesome', $content['content']);
572 $this->assertFalse($content['is_public'], 'Entry is no more shared');
573 $this->assertContains('2017-03-06', $content['published_at']);
479 } 574 }
480 575
481 public function testPatchEntryWithoutQuotes() 576 public function testPatchEntryWithoutQuotes()
@@ -489,24 +584,27 @@ class EntryRestControllerTest extends WallabagApiTestCase
489 $this->markTestSkipped('No content found in db.'); 584 $this->markTestSkipped('No content found in db.');
490 } 585 }
491 586
492 // hydrate the tags relations 587 $previousContent = $entry->getContent();
493 $nbTags = count($entry->getTags()); 588 $previousLanguage = $entry->getLanguage();
494 589
495 $this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', [ 590 $this->client->request('PATCH', '/api/entries/' . $entry->getId() . '.json', [
496 'title' => 'New awesome title', 591 'title' => 'New awesome title',
497 'tags' => 'new tag '.uniqid(), 592 'tags' => 'new tag ' . uniqid(),
498 'starred' => 1, 593 'starred' => 1,
499 'archive' => 0, 594 'archive' => 0,
595 'authors' => ['bob', 'sponge'],
500 ]); 596 ]);
501 597
502 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 598 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
503 599
504 $content = json_decode($this->client->getResponse()->getContent(), true); 600 $content = json_decode($this->client->getResponse()->getContent(), true);
505 601
506 $this->assertEquals($entry->getId(), $content['id']); 602 $this->assertSame($entry->getId(), $content['id']);
507 $this->assertEquals($entry->getUrl(), $content['url']); 603 $this->assertSame($entry->getUrl(), $content['url']);
508 $this->assertEquals('New awesome title', $content['title']); 604 $this->assertGreaterThanOrEqual(1, count($content['tags']), 'We force only one tag');
509 $this->assertGreaterThan($nbTags, count($content['tags'])); 605 $this->assertEmpty($content['published_by'], 'Authors were not saved because of an array instead of a string');
606 $this->assertSame($previousContent, $content['content'], 'Ensure content has not moved');
607 $this->assertSame($previousLanguage, $content['language'], 'Ensure language has not moved');
510 } 608 }
511 609
512 public function testGetTagsEntry() 610 public function testGetTagsEntry()
@@ -527,9 +625,9 @@ class EntryRestControllerTest extends WallabagApiTestCase
527 $tags[] = ['id' => $tag->getId(), 'label' => $tag->getLabel(), 'slug' => $tag->getSlug()]; 625 $tags[] = ['id' => $tag->getId(), 'label' => $tag->getLabel(), 'slug' => $tag->getSlug()];
528 } 626 }
529 627
530 $this->client->request('GET', '/api/entries/'.$entry->getId().'/tags'); 628 $this->client->request('GET', '/api/entries/' . $entry->getId() . '/tags');
531 629
532 $this->assertEquals(json_encode($tags, JSON_HEX_QUOT), $this->client->getResponse()->getContent()); 630 $this->assertSame(json_encode($tags, JSON_HEX_QUOT), $this->client->getResponse()->getContent());
533 } 631 }
534 632
535 public function testPostTagsOnEntry() 633 public function testPostTagsOnEntry()
@@ -547,14 +645,14 @@ class EntryRestControllerTest extends WallabagApiTestCase
547 645
548 $newTags = 'tag1,tag2,tag3'; 646 $newTags = 'tag1,tag2,tag3';
549 647
550 $this->client->request('POST', '/api/entries/'.$entry->getId().'/tags', ['tags' => $newTags]); 648 $this->client->request('POST', '/api/entries/' . $entry->getId() . '/tags', ['tags' => $newTags]);
551 649
552 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 650 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
553 651
554 $content = json_decode($this->client->getResponse()->getContent(), true); 652 $content = json_decode($this->client->getResponse()->getContent(), true);
555 653
556 $this->assertArrayHasKey('tags', $content); 654 $this->assertArrayHasKey('tags', $content);
557 $this->assertEquals($nbTags + 3, count($content['tags'])); 655 $this->assertSame($nbTags + 3, count($content['tags']));
558 656
559 $entryDB = $this->client->getContainer() 657 $entryDB = $this->client->getContainer()
560 ->get('doctrine.orm.entity_manager') 658 ->get('doctrine.orm.entity_manager')
@@ -587,14 +685,14 @@ class EntryRestControllerTest extends WallabagApiTestCase
587 $nbTags = count($entry->getTags()); 685 $nbTags = count($entry->getTags());
588 $tag = $entry->getTags()[0]; 686 $tag = $entry->getTags()[0];
589 687
590 $this->client->request('DELETE', '/api/entries/'.$entry->getId().'/tags/'.$tag->getId().'.json'); 688 $this->client->request('DELETE', '/api/entries/' . $entry->getId() . '/tags/' . $tag->getId() . '.json');
591 689
592 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 690 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
593 691
594 $content = json_decode($this->client->getResponse()->getContent(), true); 692 $content = json_decode($this->client->getResponse()->getContent(), true);
595 693
596 $this->assertArrayHasKey('tags', $content); 694 $this->assertArrayHasKey('tags', $content);
597 $this->assertEquals($nbTags - 1, count($content['tags'])); 695 $this->assertSame($nbTags - 1, count($content['tags']));
598 } 696 }
599 697
600 public function testSaveIsArchivedAfterPost() 698 public function testSaveIsArchivedAfterPost()
@@ -612,11 +710,11 @@ class EntryRestControllerTest extends WallabagApiTestCase
612 'url' => $entry->getUrl(), 710 'url' => $entry->getUrl(),
613 ]); 711 ]);
614 712
615 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 713 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
616 714
617 $content = json_decode($this->client->getResponse()->getContent(), true); 715 $content = json_decode($this->client->getResponse()->getContent(), true);
618 716
619 $this->assertEquals(true, $content['is_archived']); 717 $this->assertSame(1, $content['is_archived']);
620 } 718 }
621 719
622 public function testSaveIsStarredAfterPost() 720 public function testSaveIsStarredAfterPost()
@@ -634,11 +732,11 @@ class EntryRestControllerTest extends WallabagApiTestCase
634 'url' => $entry->getUrl(), 732 'url' => $entry->getUrl(),
635 ]); 733 ]);
636 734
637 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 735 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
638 736
639 $content = json_decode($this->client->getResponse()->getContent(), true); 737 $content = json_decode($this->client->getResponse()->getContent(), true);
640 738
641 $this->assertEquals(true, $content['is_starred']); 739 $this->assertSame(1, $content['is_starred']);
642 } 740 }
643 741
644 public function testSaveIsArchivedAfterPatch() 742 public function testSaveIsArchivedAfterPatch()
@@ -652,19 +750,23 @@ class EntryRestControllerTest extends WallabagApiTestCase
652 $this->markTestSkipped('No content found in db.'); 750 $this->markTestSkipped('No content found in db.');
653 } 751 }
654 752
655 $this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', [ 753 $previousTitle = $entry->getTitle();
656 'title' => $entry->getTitle().'++', 754
755 $this->client->request('PATCH', '/api/entries/' . $entry->getId() . '.json', [
756 'title' => $entry->getTitle() . '++',
657 ]); 757 ]);
658 758
659 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 759 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
660 760
661 $content = json_decode($this->client->getResponse()->getContent(), true); 761 $content = json_decode($this->client->getResponse()->getContent(), true);
662 762
663 $this->assertEquals(true, $content['is_archived']); 763 $this->assertSame(1, $content['is_archived']);
764 $this->assertSame($previousTitle . '++', $content['title']);
664 } 765 }
665 766
666 public function testSaveIsStarredAfterPatch() 767 public function testSaveIsStarredAfterPatch()
667 { 768 {
769 $now = new \DateTime();
668 $entry = $this->client->getContainer() 770 $entry = $this->client->getContainer()
669 ->get('doctrine.orm.entity_manager') 771 ->get('doctrine.orm.entity_manager')
670 ->getRepository('WallabagCoreBundle:Entry') 772 ->getRepository('WallabagCoreBundle:Entry')
@@ -673,60 +775,94 @@ class EntryRestControllerTest extends WallabagApiTestCase
673 if (!$entry) { 775 if (!$entry) {
674 $this->markTestSkipped('No content found in db.'); 776 $this->markTestSkipped('No content found in db.');
675 } 777 }
676 $this->client->request('PATCH', '/api/entries/'.$entry->getId().'.json', [ 778 $this->client->request('PATCH', '/api/entries/' . $entry->getId() . '.json', [
677 'title' => $entry->getTitle().'++', 779 'title' => $entry->getTitle() . '++',
678 ]); 780 ]);
679 781
680 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 782 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
681 783
682 $content = json_decode($this->client->getResponse()->getContent(), true); 784 $content = json_decode($this->client->getResponse()->getContent(), true);
683 785
684 $this->assertEquals(true, $content['is_starred']); 786 $this->assertSame(1, $content['is_starred']);
787 $this->assertGreaterThanOrEqual($now->getTimestamp(), (new \DateTime($content['starred_at']))->getTimestamp());
685 } 788 }
686 789
687 public function testGetEntriesExists() 790 public function dataForEntriesExistWithUrl()
688 { 791 {
689 $this->client->request('GET', '/api/entries/exists?url=http://0.0.0.0/entry2'); 792 return [
793 'with_id' => [
794 'url' => '/api/entries/exists?url=http://0.0.0.0/entry2&return_id=1',
795 'expectedValue' => 2,
796 ],
797 'without_id' => [
798 'url' => '/api/entries/exists?url=http://0.0.0.0/entry2',
799 'expectedValue' => true,
800 ],
801 ];
802 }
690 803
691 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 804 /**
805 * @dataProvider dataForEntriesExistWithUrl
806 */
807 public function testGetEntriesExists($url, $expectedValue)
808 {
809 $this->client->request('GET', $url);
810
811 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
692 812
693 $content = json_decode($this->client->getResponse()->getContent(), true); 813 $content = json_decode($this->client->getResponse()->getContent(), true);
694 814
695 $this->assertEquals(true, $content['exists']); 815 $this->assertSame($expectedValue, $content['exists']);
696 } 816 }
697 817
698 public function testGetEntriesExistsWithManyUrls() 818 public function testGetEntriesExistsWithManyUrls()
699 { 819 {
700 $url1 = 'http://0.0.0.0/entry2'; 820 $url1 = 'http://0.0.0.0/entry2';
701 $url2 = 'http://0.0.0.0/entry10'; 821 $url2 = 'http://0.0.0.0/entry10';
702 $this->client->request('GET', '/api/entries/exists?urls[]='.$url1.'&urls[]='.$url2); 822 $this->client->request('GET', '/api/entries/exists?urls[]=' . $url1 . '&urls[]=' . $url2 . '&return_id=1');
823
824 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
825
826 $content = json_decode($this->client->getResponse()->getContent(), true);
827
828 $this->assertArrayHasKey($url1, $content);
829 $this->assertArrayHasKey($url2, $content);
830 $this->assertSame(2, $content[$url1]);
831 $this->assertNull($content[$url2]);
832 }
833
834 public function testGetEntriesExistsWithManyUrlsReturnBool()
835 {
836 $url1 = 'http://0.0.0.0/entry2';
837 $url2 = 'http://0.0.0.0/entry10';
838 $this->client->request('GET', '/api/entries/exists?urls[]=' . $url1 . '&urls[]=' . $url2);
703 839
704 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 840 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
705 841
706 $content = json_decode($this->client->getResponse()->getContent(), true); 842 $content = json_decode($this->client->getResponse()->getContent(), true);
707 843
708 $this->assertArrayHasKey($url1, $content); 844 $this->assertArrayHasKey($url1, $content);
709 $this->assertArrayHasKey($url2, $content); 845 $this->assertArrayHasKey($url2, $content);
710 $this->assertEquals(true, $content[$url1]); 846 $this->assertTrue($content[$url1]);
711 $this->assertEquals(false, $content[$url2]); 847 $this->assertFalse($content[$url2]);
712 } 848 }
713 849
714 public function testGetEntriesExistsWhichDoesNotExists() 850 public function testGetEntriesExistsWhichDoesNotExists()
715 { 851 {
716 $this->client->request('GET', '/api/entries/exists?url=http://google.com/entry2'); 852 $this->client->request('GET', '/api/entries/exists?url=http://google.com/entry2');
717 853
718 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 854 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
719 855
720 $content = json_decode($this->client->getResponse()->getContent(), true); 856 $content = json_decode($this->client->getResponse()->getContent(), true);
721 857
722 $this->assertEquals(false, $content['exists']); 858 $this->assertSame(false, $content['exists']);
723 } 859 }
724 860
725 public function testGetEntriesExistsWithNoUrl() 861 public function testGetEntriesExistsWithNoUrl()
726 { 862 {
727 $this->client->request('GET', '/api/entries/exists?url='); 863 $this->client->request('GET', '/api/entries/exists?url=');
728 864
729 $this->assertEquals(403, $this->client->getResponse()->getStatusCode()); 865 $this->assertSame(403, $this->client->getResponse()->getStatusCode());
730 } 866 }
731 867
732 public function testReloadEntryErrorWhileFetching() 868 public function testReloadEntryErrorWhileFetching()
@@ -739,8 +875,8 @@ class EntryRestControllerTest extends WallabagApiTestCase
739 $this->markTestSkipped('No content found in db.'); 875 $this->markTestSkipped('No content found in db.');
740 } 876 }
741 877
742 $this->client->request('PATCH', '/api/entries/'.$entry->getId().'/reload.json'); 878 $this->client->request('PATCH', '/api/entries/' . $entry->getId() . '/reload.json');
743 $this->assertEquals(304, $this->client->getResponse()->getStatusCode()); 879 $this->assertSame(304, $this->client->getResponse()->getStatusCode());
744 } 880 }
745 881
746 public function testReloadEntry() 882 public function testReloadEntry()
@@ -755,13 +891,208 @@ class EntryRestControllerTest extends WallabagApiTestCase
755 891
756 $this->setUp(); 892 $this->setUp();
757 893
758 $this->client->request('PATCH', '/api/entries/'.$json['id'].'/reload.json'); 894 $this->client->request('PATCH', '/api/entries/' . $json['id'] . '/reload.json');
759 $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 895 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
760 896
761 $content = json_decode($this->client->getResponse()->getContent(), true); 897 $content = json_decode($this->client->getResponse()->getContent(), true);
762 898
763 $this->assertNotEmpty($content['title']); 899 $this->assertNotEmpty($content['title']);
764 900
765 $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type')); 901 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
902 }
903
904 public function testPostEntriesTagsListAction()
905 {
906 $entry = $this->client->getContainer()->get('doctrine.orm.entity_manager')
907 ->getRepository('WallabagCoreBundle:Entry')
908 ->findByUrlAndUserId('http://0.0.0.0/entry4', 1);
909
910 $tags = $entry->getTags();
911
912 $this->assertCount(2, $tags);
913
914 $list = [
915 [
916 'url' => 'http://0.0.0.0/entry4',
917 'tags' => 'new tag 1, new tag 2',
918 ],
919 ];
920
921 $this->client->request('POST', '/api/entries/tags/lists?list=' . json_encode($list));
922
923 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
924
925 $content = json_decode($this->client->getResponse()->getContent(), true);
926
927 $this->assertInternalType('int', $content[0]['entry']);
928 $this->assertSame('http://0.0.0.0/entry4', $content[0]['url']);
929
930 $entry = $this->client->getContainer()->get('doctrine.orm.entity_manager')
931 ->getRepository('WallabagCoreBundle:Entry')
932 ->findByUrlAndUserId('http://0.0.0.0/entry4', 1);
933
934 $tags = $entry->getTags();
935 $this->assertCount(4, $tags);
936 }
937
938 public function testPostEntriesTagsListActionNoList()
939 {
940 $this->client->request('POST', '/api/entries/tags/lists?list=' . json_encode([]));
941
942 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
943
944 $content = json_decode($this->client->getResponse()->getContent(), true);
945
946 $this->assertEmpty($content);
947 }
948
949 public function testDeleteEntriesTagsListAction()
950 {
951 $em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
952 $entry = new Entry($em->getReference(User::class, 1));
953 $entry->setUrl('http://0.0.0.0/test-entry');
954 $entry->addTag((new Tag())->setLabel('foo-tag'));
955 $entry->addTag((new Tag())->setLabel('bar-tag'));
956 $em->persist($entry);
957 $em->flush();
958
959 $em->clear();
960
961 $list = [
962 [
963 'url' => 'http://0.0.0.0/test-entry',
964 'tags' => 'foo-tag, bar-tag',
965 ],
966 ];
967
968 $this->client->request('DELETE', '/api/entries/tags/list?list=' . json_encode($list));
969 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
970
971 $entry = $em->getRepository('WallabagCoreBundle:Entry')->find($entry->getId());
972 $this->assertCount(0, $entry->getTags());
973 }
974
975 public function testDeleteEntriesTagsListActionNoList()
976 {
977 $this->client->request('DELETE', '/api/entries/tags/list?list=' . json_encode([]));
978
979 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
980
981 $content = json_decode($this->client->getResponse()->getContent(), true);
982
983 $this->assertEmpty($content);
984 }
985
986 public function testPostEntriesListAction()
987 {
988 $list = [
989 'http://www.lemonde.fr/musiques/article/2017/04/23/loin-de-la-politique-le-printemps-de-bourges-retombe-en-enfance_5115862_1654986.html',
990 'http://0.0.0.0/entry2',
991 ];
992
993 $this->client->request('POST', '/api/entries/lists?urls=' . json_encode($list));
994
995 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
996
997 $content = json_decode($this->client->getResponse()->getContent(), true);
998
999 $this->assertInternalType('int', $content[0]['entry']);
1000 $this->assertSame('http://www.lemonde.fr/musiques/article/2017/04/23/loin-de-la-politique-le-printemps-de-bourges-retombe-en-enfance_5115862_1654986.html', $content[0]['url']);
1001
1002 $this->assertInternalType('int', $content[1]['entry']);
1003 $this->assertSame('http://0.0.0.0/entry2', $content[1]['url']);
1004 }
1005
1006 public function testPostEntriesListActionWithNoUrls()
1007 {
1008 $this->client->request('POST', '/api/entries/lists?urls=' . json_encode([]));
1009
1010 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
1011
1012 $content = json_decode($this->client->getResponse()->getContent(), true);
1013
1014 $this->assertEmpty($content);
1015 }
1016
1017 public function testDeleteEntriesListAction()
1018 {
1019 $em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
1020 $em->persist((new Entry($em->getReference(User::class, 1)))->setUrl('http://0.0.0.0/test-entry1'));
1021
1022 $em->flush();
1023 $em->clear();
1024 $list = [
1025 'http://0.0.0.0/test-entry1',
1026 'http://0.0.0.0/test-entry-not-exist',
1027 ];
1028
1029 $this->client->request('DELETE', '/api/entries/list?urls=' . json_encode($list));
1030
1031 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
1032
1033 $content = json_decode($this->client->getResponse()->getContent(), true);
1034
1035 $this->assertTrue($content[0]['entry']);
1036 $this->assertSame('http://0.0.0.0/test-entry1', $content[0]['url']);
1037
1038 $this->assertFalse($content[1]['entry']);
1039 $this->assertSame('http://0.0.0.0/test-entry-not-exist', $content[1]['url']);
1040 }
1041
1042 public function testDeleteEntriesListActionWithNoUrls()
1043 {
1044 $this->client->request('DELETE', '/api/entries/list?urls=' . json_encode([]));
1045
1046 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
1047
1048 $content = json_decode($this->client->getResponse()->getContent(), true);
1049
1050 $this->assertEmpty($content);
1051 }
1052
1053 public function testLimitBulkAction()
1054 {
1055 $list = [
1056 'http://0.0.0.0/entry1',
1057 'http://0.0.0.0/entry1',
1058 'http://0.0.0.0/entry1',
1059 'http://0.0.0.0/entry1',
1060 'http://0.0.0.0/entry1',
1061 'http://0.0.0.0/entry1',
1062 'http://0.0.0.0/entry1',
1063 'http://0.0.0.0/entry1',
1064 'http://0.0.0.0/entry1',
1065 'http://0.0.0.0/entry1',
1066 'http://0.0.0.0/entry1',
1067 ];
1068
1069 $this->client->request('POST', '/api/entries/lists?urls=' . json_encode($list));
1070
1071 $this->assertSame(400, $this->client->getResponse()->getStatusCode());
1072 $this->assertContains('API limit reached', $this->client->getResponse()->getContent());
1073 }
1074
1075 public function testRePostEntryAndReUsePublishedAt()
1076 {
1077 $em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
1078 $entry = new Entry($em->getReference(User::class, 1));
1079 $entry->setTitle('Antoine de Caunes : « Je veux avoir le droit de tâtonner »');
1080 $entry->setContent('hihi');
1081 $entry->setUrl('http://www.lemonde.fr/m-perso/article/2017/06/25/antoine-de-caunes-je-veux-avoir-le-droit-de-tatonner_5150728_4497916.html');
1082 $entry->setPublishedAt(new \DateTime('2017-06-26T07:46:02+0200'));
1083 $em->persist($entry);
1084 $em->flush();
1085 $em->clear();
1086
1087 $this->client->request('POST', '/api/entries.json', [
1088 'url' => 'http://www.lemonde.fr/m-perso/article/2017/06/25/antoine-de-caunes-je-veux-avoir-le-droit-de-tatonner_5150728_4497916.html',
1089 ]);
1090
1091 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
1092
1093 $content = json_decode($this->client->getResponse()->getContent(), true);
1094
1095 $this->assertGreaterThan(0, $content['id']);
1096 $this->assertSame('http://www.lemonde.fr/m-perso/article/2017/06/25/antoine-de-caunes-je-veux-avoir-le-droit-de-tatonner_5150728_4497916.html', $content['url']);
766 } 1097 }
767} 1098}