]> git.immae.eu Git - github/wallabag/wallabag.git/blob - tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
Added headers field in Entry
[github/wallabag/wallabag.git] / tests / Wallabag / CoreBundle / Controller / EntryControllerTest.php
1 <?php
2
3 namespace Tests\Wallabag\CoreBundle\Controller;
4
5 use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6 use Wallabag\CoreBundle\Entity\Config;
7 use Wallabag\CoreBundle\Entity\Entry;
8
9 class EntryControllerTest extends WallabagCoreTestCase
10 {
11 public $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';
12
13 public function testLogin()
14 {
15 $client = $this->getClient();
16
17 $client->request('GET', '/new');
18
19 $this->assertEquals(302, $client->getResponse()->getStatusCode());
20 $this->assertContains('login', $client->getResponse()->headers->get('location'));
21 }
22
23 public function testQuickstart()
24 {
25 $this->logInAs('empty');
26 $client = $this->getClient();
27
28 $client->request('GET', '/unread/list');
29 $crawler = $client->followRedirect();
30
31 $this->assertEquals(200, $client->getResponse()->getStatusCode());
32 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
33 $this->assertContains('quickstart.intro.title', $body[0]);
34
35 // Test if quickstart is disabled when user has 1 entry
36 $crawler = $client->request('GET', '/new');
37
38 $this->assertEquals(200, $client->getResponse()->getStatusCode());
39
40 $form = $crawler->filter('form[name=entry]')->form();
41
42 $data = [
43 'entry[url]' => $this->url,
44 ];
45
46 $client->submit($form, $data);
47 $this->assertEquals(302, $client->getResponse()->getStatusCode());
48 $client->followRedirect();
49
50 $crawler = $client->request('GET', '/unread/list');
51 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
52 $this->assertContains('entry.list.number_on_the_page', $body[0]);
53 }
54
55 public function testGetNew()
56 {
57 $this->logInAs('admin');
58 $client = $this->getClient();
59
60 $crawler = $client->request('GET', '/new');
61
62 $this->assertEquals(200, $client->getResponse()->getStatusCode());
63
64 $this->assertCount(1, $crawler->filter('input[type=url]'));
65 $this->assertCount(1, $crawler->filter('form[name=entry]'));
66 }
67
68 public function testPostNewViaBookmarklet()
69 {
70 $this->logInAs('admin');
71 $client = $this->getClient();
72
73 $crawler = $client->request('GET', '/');
74
75 $this->assertCount(4, $crawler->filter('div[class=entry]'));
76
77 // Good URL
78 $client->request('GET', '/bookmarklet', ['url' => $this->url]);
79 $this->assertEquals(302, $client->getResponse()->getStatusCode());
80 $client->followRedirect();
81 $crawler = $client->request('GET', '/');
82 $this->assertCount(5, $crawler->filter('div[class=entry]'));
83
84 $em = $client->getContainer()
85 ->get('doctrine.orm.entity_manager');
86 $entry = $em
87 ->getRepository('WallabagCoreBundle:Entry')
88 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
89 $em->remove($entry);
90 $em->flush();
91 }
92
93 public function testPostNewEmpty()
94 {
95 $this->logInAs('admin');
96 $client = $this->getClient();
97
98 $crawler = $client->request('GET', '/new');
99
100 $this->assertEquals(200, $client->getResponse()->getStatusCode());
101
102 $form = $crawler->filter('form[name=entry]')->form();
103
104 $crawler = $client->submit($form);
105
106 $this->assertEquals(200, $client->getResponse()->getStatusCode());
107 $this->assertCount(1, $alert = $crawler->filter('form ul li')->extract(['_text']));
108 $this->assertEquals('This value should not be blank.', $alert[0]);
109 }
110
111 /**
112 * This test will require an internet connection.
113 */
114 public function testPostNewOk()
115 {
116 $this->logInAs('admin');
117 $client = $this->getClient();
118
119 $crawler = $client->request('GET', '/new');
120
121 $this->assertEquals(200, $client->getResponse()->getStatusCode());
122
123 $form = $crawler->filter('form[name=entry]')->form();
124
125 $data = [
126 'entry[url]' => $this->url,
127 ];
128
129 $client->submit($form, $data);
130
131 $this->assertEquals(302, $client->getResponse()->getStatusCode());
132
133 $content = $client->getContainer()
134 ->get('doctrine.orm.entity_manager')
135 ->getRepository('WallabagCoreBundle:Entry')
136 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
137
138 $author = $content->getPublishedBy();
139
140 $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $content);
141 $this->assertEquals($this->url, $content->getUrl());
142 $this->assertContains('Google', $content->getTitle());
143 $this->assertEquals('2015-03-28 15:37:39', $content->getPublishedAt()->format('Y-m-d H:i:s'));
144 $this->assertEquals('Morgane Tual', $author[0]);
145 $this->assertArrayHasKey('x-varnish1', $content->getHeaders());
146 }
147
148 public function testPostWithMultipleAuthors()
149 {
150 $url = 'http://www.liberation.fr/planete/2017/04/05/donald-trump-et-xi-jinping-tentative-de-flirt-en-floride_1560768';
151 $this->logInAs('admin');
152 $client = $this->getClient();
153
154 $crawler = $client->request('GET', '/new');
155
156 $this->assertEquals(200, $client->getResponse()->getStatusCode());
157
158 $form = $crawler->filter('form[name=entry]')->form();
159
160 $data = [
161 'entry[url]' => $url,
162 ];
163
164 $client->submit($form, $data);
165
166 $this->assertEquals(302, $client->getResponse()->getStatusCode());
167
168 $content = $client->getContainer()
169 ->get('doctrine.orm.entity_manager')
170 ->getRepository('WallabagCoreBundle:Entry')
171 ->findByUrlAndUserId($url, $this->getLoggedInUserId());
172
173 $authors = $content->getPublishedBy();
174 $this->assertEquals('2017-04-05 19:26:13', $content->getPublishedAt()->format('Y-m-d H:i:s'));
175 $this->assertEquals('Raphaël Balenieri, correspondant à Pékin', $authors[0]);
176 $this->assertEquals('Frédéric Autran, correspondant à New York', $authors[1]);
177 }
178
179 public function testPostNewOkUrlExist()
180 {
181 $this->logInAs('admin');
182 $client = $this->getClient();
183
184 $crawler = $client->request('GET', '/new');
185
186 $this->assertEquals(200, $client->getResponse()->getStatusCode());
187
188 $form = $crawler->filter('form[name=entry]')->form();
189
190 $data = [
191 'entry[url]' => $this->url,
192 ];
193
194 $client->submit($form, $data);
195
196 $this->assertEquals(302, $client->getResponse()->getStatusCode());
197 $this->assertContains('/view/', $client->getResponse()->getTargetUrl());
198 }
199
200 public function testPostNewOkUrlExistWithAccent()
201 {
202 $this->logInAs('admin');
203 $client = $this->getClient();
204
205 $url = 'http://www.aritylabs.com/post/106091708292/des-contr%C3%B4leurs-optionnels-gr%C3%A2ce-%C3%A0-constmissing';
206
207 $crawler = $client->request('GET', '/new');
208
209 $this->assertEquals(200, $client->getResponse()->getStatusCode());
210
211 $form = $crawler->filter('form[name=entry]')->form();
212
213 $data = [
214 'entry[url]' => $url,
215 ];
216
217 $client->submit($form, $data);
218
219 $crawler = $client->request('GET', '/new');
220
221 $this->assertEquals(200, $client->getResponse()->getStatusCode());
222
223 $form = $crawler->filter('form[name=entry]')->form();
224
225 $data = [
226 'entry[url]' => $url,
227 ];
228
229 $client->submit($form, $data);
230
231 $this->assertEquals(302, $client->getResponse()->getStatusCode());
232 $this->assertContains('/view/', $client->getResponse()->getTargetUrl());
233
234 $em = $client->getContainer()
235 ->get('doctrine.orm.entity_manager');
236 $entry = $em
237 ->getRepository('WallabagCoreBundle:Entry')
238 ->findOneByUrl(urldecode($url));
239
240 $em->remove($entry);
241 $em->flush();
242 }
243
244 /**
245 * This test will require an internet connection.
246 */
247 public function testPostNewThatWillBeTagged()
248 {
249 $this->logInAs('admin');
250 $client = $this->getClient();
251
252 $crawler = $client->request('GET', '/new');
253
254 $this->assertEquals(200, $client->getResponse()->getStatusCode());
255
256 $form = $crawler->filter('form[name=entry]')->form();
257
258 $data = [
259 'entry[url]' => $url = 'https://github.com/wallabag/wallabag',
260 ];
261
262 $client->submit($form, $data);
263
264 $this->assertEquals(302, $client->getResponse()->getStatusCode());
265 $this->assertContains('/', $client->getResponse()->getTargetUrl());
266
267 $em = $client->getContainer()
268 ->get('doctrine.orm.entity_manager');
269 $entry = $em
270 ->getRepository('WallabagCoreBundle:Entry')
271 ->findOneByUrl($url);
272 $tags = $entry->getTags();
273
274 $this->assertCount(2, $tags);
275 $this->assertEquals('wallabag', $tags[0]->getLabel());
276
277 $em->remove($entry);
278 $em->flush();
279
280 // and now re-submit it to test the cascade persistence for tags after entry removal
281 // related https://github.com/wallabag/wallabag/issues/2121
282 $crawler = $client->request('GET', '/new');
283
284 $this->assertEquals(200, $client->getResponse()->getStatusCode());
285
286 $form = $crawler->filter('form[name=entry]')->form();
287
288 $data = [
289 'entry[url]' => $url = 'https://github.com/wallabag/wallabag/tree/master',
290 ];
291
292 $client->submit($form, $data);
293
294 $this->assertEquals(302, $client->getResponse()->getStatusCode());
295 $this->assertContains('/', $client->getResponse()->getTargetUrl());
296
297 $entry = $em
298 ->getRepository('WallabagCoreBundle:Entry')
299 ->findOneByUrl($url);
300
301 $tags = $entry->getTags();
302
303 $this->assertCount(2, $tags);
304 $this->assertEquals('wallabag', $tags[1]->getLabel());
305
306 $em->remove($entry);
307 $em->flush();
308 }
309
310 public function testArchive()
311 {
312 $this->logInAs('admin');
313 $client = $this->getClient();
314
315 $client->request('GET', '/archive/list');
316
317 $this->assertEquals(200, $client->getResponse()->getStatusCode());
318 }
319
320 public function testUntagged()
321 {
322 $this->logInAs('admin');
323 $client = $this->getClient();
324
325 $client->request('GET', '/untagged/list');
326
327 $this->assertEquals(200, $client->getResponse()->getStatusCode());
328 }
329
330 public function testStarred()
331 {
332 $this->logInAs('admin');
333 $client = $this->getClient();
334
335 $client->request('GET', '/starred/list');
336
337 $this->assertEquals(200, $client->getResponse()->getStatusCode());
338 }
339
340 public function testRangeException()
341 {
342 $this->logInAs('admin');
343 $client = $this->getClient();
344
345 $client->request('GET', '/all/list/900');
346
347 $this->assertEquals(302, $client->getResponse()->getStatusCode());
348 $this->assertEquals('/all/list', $client->getResponse()->getTargetUrl());
349 }
350
351 /**
352 * @depends testPostNewOk
353 */
354 public function testView()
355 {
356 $this->logInAs('admin');
357 $client = $this->getClient();
358
359 $content = $client->getContainer()
360 ->get('doctrine.orm.entity_manager')
361 ->getRepository('WallabagCoreBundle:Entry')
362 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
363
364 $crawler = $client->request('GET', '/view/'.$content->getId());
365
366 $this->assertEquals(200, $client->getResponse()->getStatusCode());
367 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
368 $this->assertContains($content->getTitle(), $body[0]);
369 }
370
371 /**
372 * @depends testPostNewOk
373 *
374 * This test will require an internet connection.
375 */
376 public function testReload()
377 {
378 $this->logInAs('admin');
379 $client = $this->getClient();
380
381 $em = $client->getContainer()
382 ->get('doctrine.orm.entity_manager');
383
384 $content = $em
385 ->getRepository('WallabagCoreBundle:Entry')
386 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
387
388 // empty content
389 $content->setContent('');
390 $em->persist($content);
391 $em->flush();
392
393 $client->request('GET', '/reload/'.$content->getId());
394
395 $this->assertEquals(302, $client->getResponse()->getStatusCode());
396
397 $content = $em
398 ->getRepository('WallabagCoreBundle:Entry')
399 ->find($content->getId());
400
401 $this->assertNotEmpty($content->getContent());
402 }
403
404 /**
405 * @depends testPostNewOk
406 */
407 public function testReloadWithFetchingFailed()
408 {
409 $this->logInAs('admin');
410 $client = $this->getClient();
411
412 $em = $client->getContainer()
413 ->get('doctrine.orm.entity_manager');
414
415 $content = $em
416 ->getRepository('WallabagCoreBundle:Entry')
417 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
418
419 // put a known failed url
420 $content->setUrl('http://0.0.0.0/failed.html');
421 $em->persist($content);
422 $em->flush();
423
424 $client->request('GET', '/reload/'.$content->getId());
425
426 $this->assertEquals(302, $client->getResponse()->getStatusCode());
427
428 // force EntityManager to clear previous entity
429 // otherwise, retrieve the same entity will retrieve change from the previous request :0
430 $em->clear();
431 $newContent = $em
432 ->getRepository('WallabagCoreBundle:Entry')
433 ->find($content->getId());
434
435 $newContent->setUrl($this->url);
436 $em->persist($newContent);
437 $em->flush();
438
439 $this->assertNotEquals($client->getContainer()->getParameter('wallabag_core.fetching_error_message'), $newContent->getContent());
440 }
441
442 public function testEdit()
443 {
444 $this->logInAs('admin');
445 $client = $this->getClient();
446
447 $content = $client->getContainer()
448 ->get('doctrine.orm.entity_manager')
449 ->getRepository('WallabagCoreBundle:Entry')
450 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
451
452 $crawler = $client->request('GET', '/edit/'.$content->getId());
453
454 $this->assertEquals(200, $client->getResponse()->getStatusCode());
455
456 $this->assertCount(1, $crawler->filter('input[id=entry_title]'));
457 $this->assertCount(1, $crawler->filter('button[id=entry_save]'));
458 }
459
460 public function testEditUpdate()
461 {
462 $this->logInAs('admin');
463 $client = $this->getClient();
464
465 $content = $client->getContainer()
466 ->get('doctrine.orm.entity_manager')
467 ->getRepository('WallabagCoreBundle:Entry')
468 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
469
470 $crawler = $client->request('GET', '/edit/'.$content->getId());
471
472 $this->assertEquals(200, $client->getResponse()->getStatusCode());
473
474 $form = $crawler->filter('button[type=submit]')->form();
475
476 $data = [
477 'entry[title]' => 'My updated title hehe :)',
478 ];
479
480 $client->submit($form, $data);
481
482 $this->assertEquals(302, $client->getResponse()->getStatusCode());
483
484 $crawler = $client->followRedirect();
485
486 $this->assertGreaterThan(1, $alert = $crawler->filter('div[id=article] h1')->extract(['_text']));
487 $this->assertContains('My updated title hehe :)', $alert[0]);
488 }
489
490 public function testToggleArchive()
491 {
492 $this->logInAs('admin');
493 $client = $this->getClient();
494
495 $content = $client->getContainer()
496 ->get('doctrine.orm.entity_manager')
497 ->getRepository('WallabagCoreBundle:Entry')
498 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
499
500 $client->request('GET', '/archive/'.$content->getId());
501
502 $this->assertEquals(302, $client->getResponse()->getStatusCode());
503
504 $res = $client->getContainer()
505 ->get('doctrine.orm.entity_manager')
506 ->getRepository('WallabagCoreBundle:Entry')
507 ->find($content->getId());
508
509 $this->assertEquals($res->isArchived(), true);
510 }
511
512 public function testToggleStar()
513 {
514 $this->logInAs('admin');
515 $client = $this->getClient();
516
517 $content = $client->getContainer()
518 ->get('doctrine.orm.entity_manager')
519 ->getRepository('WallabagCoreBundle:Entry')
520 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
521
522 $client->request('GET', '/star/'.$content->getId());
523
524 $this->assertEquals(302, $client->getResponse()->getStatusCode());
525
526 $res = $client->getContainer()
527 ->get('doctrine.orm.entity_manager')
528 ->getRepository('WallabagCoreBundle:Entry')
529 ->findOneById($content->getId());
530
531 $this->assertEquals($res->isStarred(), true);
532 }
533
534 public function testDelete()
535 {
536 $this->logInAs('admin');
537 $client = $this->getClient();
538
539 $content = $client->getContainer()
540 ->get('doctrine.orm.entity_manager')
541 ->getRepository('WallabagCoreBundle:Entry')
542 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
543
544 $client->request('GET', '/delete/'.$content->getId());
545
546 $this->assertEquals(302, $client->getResponse()->getStatusCode());
547
548 $client->request('GET', '/delete/'.$content->getId());
549
550 $this->assertEquals(404, $client->getResponse()->getStatusCode());
551 }
552
553 /**
554 * It will create a new entry.
555 * Browse to it.
556 * Then remove it.
557 *
558 * And it'll check that user won't be redirected to the view page of the content when it had been removed
559 */
560 public function testViewAndDelete()
561 {
562 $this->logInAs('admin');
563 $client = $this->getClient();
564
565 $em = $client->getContainer()
566 ->get('doctrine.orm.entity_manager');
567
568 // add a new content to be removed later
569 $user = $em
570 ->getRepository('WallabagUserBundle:User')
571 ->findOneByUserName('admin');
572
573 $content = new Entry($user);
574 $content->setUrl('http://1.1.1.1/entry');
575 $content->setReadingTime(12);
576 $content->setDomainName('domain.io');
577 $content->setMimetype('text/html');
578 $content->setTitle('test title entry');
579 $content->setContent('This is my content /o/');
580 $content->setArchived(true);
581 $content->setLanguage('fr');
582
583 $em->persist($content);
584 $em->flush();
585
586 $client->request('GET', '/view/'.$content->getId());
587 $this->assertEquals(200, $client->getResponse()->getStatusCode());
588
589 $client->request('GET', '/delete/'.$content->getId());
590 $this->assertEquals(302, $client->getResponse()->getStatusCode());
591
592 $client->followRedirect();
593 $this->assertEquals(200, $client->getResponse()->getStatusCode());
594 }
595
596 public function testViewOtherUserEntry()
597 {
598 $this->logInAs('admin');
599 $client = $this->getClient();
600
601 $content = $client->getContainer()
602 ->get('doctrine.orm.entity_manager')
603 ->getRepository('WallabagCoreBundle:Entry')
604 ->findOneByUsernameAndNotArchived('bob');
605
606 $client->request('GET', '/view/'.$content->getId());
607
608 $this->assertEquals(403, $client->getResponse()->getStatusCode());
609 }
610
611 public function testFilterOnReadingTime()
612 {
613 $this->logInAs('admin');
614 $client = $this->getClient();
615
616 $crawler = $client->request('GET', '/unread/list');
617
618 $form = $crawler->filter('button[id=submit-filter]')->form();
619
620 $data = [
621 'entry_filter[readingTime][right_number]' => 22,
622 'entry_filter[readingTime][left_number]' => 22,
623 ];
624
625 $crawler = $client->submit($form, $data);
626
627 $this->assertCount(1, $crawler->filter('div[class=entry]'));
628 }
629
630 public function testFilterOnReadingTimeOnlyUpper()
631 {
632 $this->logInAs('admin');
633 $client = $this->getClient();
634
635 $crawler = $client->request('GET', '/unread/list');
636
637 $form = $crawler->filter('button[id=submit-filter]')->form();
638
639 $data = [
640 'entry_filter[readingTime][right_number]' => 22,
641 ];
642
643 $crawler = $client->submit($form, $data);
644
645 $this->assertCount(3, $crawler->filter('div[class=entry]'));
646 }
647
648 public function testFilterOnReadingTimeOnlyLower()
649 {
650 $this->logInAs('admin');
651 $client = $this->getClient();
652
653 $crawler = $client->request('GET', '/unread/list');
654
655 $form = $crawler->filter('button[id=submit-filter]')->form();
656
657 $data = [
658 'entry_filter[readingTime][left_number]' => 22,
659 ];
660
661 $crawler = $client->submit($form, $data);
662
663 $this->assertCount(4, $crawler->filter('div[class=entry]'));
664 }
665
666 public function testFilterOnUnreadStatus()
667 {
668 $this->logInAs('admin');
669 $client = $this->getClient();
670
671 $crawler = $client->request('GET', '/all/list');
672
673 $form = $crawler->filter('button[id=submit-filter]')->form();
674
675 $data = [
676 'entry_filter[isUnread]' => true,
677 ];
678
679 $crawler = $client->submit($form, $data);
680
681 $this->assertCount(5, $crawler->filter('div[class=entry]'));
682 }
683
684 public function testFilterOnCreationDate()
685 {
686 $this->logInAs('admin');
687 $client = $this->getClient();
688
689 $crawler = $client->request('GET', '/unread/list');
690
691 $form = $crawler->filter('button[id=submit-filter]')->form();
692
693 $data = [
694 'entry_filter[createdAt][left_date]' => date('d/m/Y'),
695 'entry_filter[createdAt][right_date]' => date('d/m/Y', strtotime('+1 day')),
696 ];
697
698 $crawler = $client->submit($form, $data);
699
700 $this->assertCount(6, $crawler->filter('div[class=entry]'));
701
702 $data = [
703 'entry_filter[createdAt][left_date]' => date('d/m/Y'),
704 'entry_filter[createdAt][right_date]' => date('d/m/Y'),
705 ];
706
707 $crawler = $client->submit($form, $data);
708
709 $this->assertCount(6, $crawler->filter('div[class=entry]'));
710
711 $data = [
712 'entry_filter[createdAt][left_date]' => '01/01/1970',
713 'entry_filter[createdAt][right_date]' => '01/01/1970',
714 ];
715
716 $crawler = $client->submit($form, $data);
717
718 $this->assertCount(0, $crawler->filter('div[class=entry]'));
719 }
720
721 public function testPaginationWithFilter()
722 {
723 $this->logInAs('admin');
724 $client = $this->getClient();
725 $crawler = $client->request('GET', '/config');
726
727 $form = $crawler->filter('button[id=config_save]')->form();
728
729 $data = [
730 'config[items_per_page]' => '1',
731 ];
732
733 $client->submit($form, $data);
734
735 $parameters = '?entry_filter%5BreadingTime%5D%5Bleft_number%5D=&entry_filter%5BreadingTime%5D%5Bright_number%5D=';
736
737 $client->request('GET', 'unread/list'.$parameters);
738
739 $this->assertContains($parameters, $client->getResponse()->getContent());
740
741 // reset pagination
742 $crawler = $client->request('GET', '/config');
743 $form = $crawler->filter('button[id=config_save]')->form();
744 $data = [
745 'config[items_per_page]' => '12',
746 ];
747 $client->submit($form, $data);
748 }
749
750 public function testFilterOnDomainName()
751 {
752 $this->logInAs('admin');
753 $client = $this->getClient();
754
755 $crawler = $client->request('GET', '/unread/list');
756 $form = $crawler->filter('button[id=submit-filter]')->form();
757 $data = [
758 'entry_filter[domainName]' => 'domain',
759 ];
760
761 $crawler = $client->submit($form, $data);
762 $this->assertCount(5, $crawler->filter('div[class=entry]'));
763
764 $crawler = $client->request('GET', '/unread/list');
765 $form = $crawler->filter('button[id=submit-filter]')->form();
766 $data = [
767 'entry_filter[domainName]' => 'dOmain',
768 ];
769
770 $crawler = $client->submit($form, $data);
771 $this->assertCount(5, $crawler->filter('div[class=entry]'));
772
773 $form = $crawler->filter('button[id=submit-filter]')->form();
774 $data = [
775 'entry_filter[domainName]' => 'wallabag',
776 ];
777
778 $crawler = $client->submit($form, $data);
779 $this->assertCount(0, $crawler->filter('div[class=entry]'));
780 }
781
782 public function testFilterOnStatus()
783 {
784 $this->logInAs('admin');
785 $client = $this->getClient();
786
787 $crawler = $client->request('GET', '/unread/list');
788 $form = $crawler->filter('button[id=submit-filter]')->form();
789 $form['entry_filter[isArchived]']->tick();
790 $form['entry_filter[isStarred]']->untick();
791
792 $crawler = $client->submit($form);
793 $this->assertCount(1, $crawler->filter('div[class=entry]'));
794
795 $form = $crawler->filter('button[id=submit-filter]')->form();
796 $form['entry_filter[isArchived]']->untick();
797 $form['entry_filter[isStarred]']->tick();
798
799 $crawler = $client->submit($form);
800 $this->assertCount(1, $crawler->filter('div[class=entry]'));
801 }
802
803 public function testPreviewPictureFilter()
804 {
805 $this->logInAs('admin');
806 $client = $this->getClient();
807
808 $crawler = $client->request('GET', '/unread/list');
809 $form = $crawler->filter('button[id=submit-filter]')->form();
810 $form['entry_filter[previewPicture]']->tick();
811
812 $crawler = $client->submit($form);
813 $this->assertCount(2, $crawler->filter('div[class=entry]'));
814 }
815
816 public function testFilterOnLanguage()
817 {
818 $this->logInAs('admin');
819 $client = $this->getClient();
820
821 $crawler = $client->request('GET', '/unread/list');
822 $form = $crawler->filter('button[id=submit-filter]')->form();
823 $data = [
824 'entry_filter[language]' => 'fr',
825 ];
826
827 $crawler = $client->submit($form, $data);
828 $this->assertCount(3, $crawler->filter('div[class=entry]'));
829
830 $form = $crawler->filter('button[id=submit-filter]')->form();
831 $data = [
832 'entry_filter[language]' => 'en',
833 ];
834
835 $crawler = $client->submit($form, $data);
836 $this->assertCount(2, $crawler->filter('div[class=entry]'));
837 }
838
839 public function testShareEntryPublicly()
840 {
841 $this->logInAs('admin');
842 $client = $this->getClient();
843
844 $content = $client->getContainer()
845 ->get('doctrine.orm.entity_manager')
846 ->getRepository('WallabagCoreBundle:Entry')
847 ->findOneByUser($this->getLoggedInUserId());
848
849 // no uid
850 $client->request('GET', '/share/'.$content->getUid());
851 $this->assertEquals(404, $client->getResponse()->getStatusCode());
852
853 // generating the uid
854 $client->request('GET', '/share/'.$content->getId());
855 $this->assertEquals(302, $client->getResponse()->getStatusCode());
856
857 // follow link with uid
858 $crawler = $client->followRedirect();
859 $this->assertEquals(200, $client->getResponse()->getStatusCode());
860 $this->assertContains('max-age=25200', $client->getResponse()->headers->get('cache-control'));
861 $this->assertContains('public', $client->getResponse()->headers->get('cache-control'));
862 $this->assertContains('s-maxage=25200', $client->getResponse()->headers->get('cache-control'));
863 $this->assertNotContains('no-cache', $client->getResponse()->headers->get('cache-control'));
864 $this->assertContains('og:title', $client->getResponse()->getContent());
865 $this->assertContains('og:type', $client->getResponse()->getContent());
866 $this->assertContains('og:url', $client->getResponse()->getContent());
867 $this->assertContains('og:image', $client->getResponse()->getContent());
868
869 // sharing is now disabled
870 $client->getContainer()->get('craue_config')->set('share_public', 0);
871 $client->request('GET', '/share/'.$content->getUid());
872 $this->assertEquals(404, $client->getResponse()->getStatusCode());
873
874 $client->request('GET', '/view/'.$content->getId());
875 $this->assertContains('no-cache', $client->getResponse()->headers->get('cache-control'));
876
877 // removing the share
878 $client->request('GET', '/share/delete/'.$content->getId());
879 $this->assertEquals(302, $client->getResponse()->getStatusCode());
880
881 // share is now disable
882 $client->request('GET', '/share/'.$content->getUid());
883 $this->assertEquals(404, $client->getResponse()->getStatusCode());
884 }
885
886 public function testNewEntryWithDownloadImagesEnabled()
887 {
888 $this->logInAs('admin');
889 $client = $this->getClient();
890
891 $url = 'http://www.20minutes.fr/montpellier/1952003-20161030-video-car-tombe-panne-rugbymen-perpignan-improvisent-melee-route';
892 $client->getContainer()->get('craue_config')->set('download_images_enabled', 1);
893
894 $crawler = $client->request('GET', '/new');
895
896 $this->assertEquals(200, $client->getResponse()->getStatusCode());
897
898 $form = $crawler->filter('form[name=entry]')->form();
899
900 $data = [
901 'entry[url]' => $url,
902 ];
903
904 $client->submit($form, $data);
905
906 $this->assertEquals(302, $client->getResponse()->getStatusCode());
907
908 $em = $client->getContainer()
909 ->get('doctrine.orm.entity_manager');
910
911 $entry = $em
912 ->getRepository('WallabagCoreBundle:Entry')
913 ->findByUrlAndUserId($url, $this->getLoggedInUserId());
914
915 $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $entry);
916 $this->assertEquals($url, $entry->getUrl());
917 $this->assertContains('Perpignan', $entry->getTitle());
918 $this->assertContains('/d9bc0fcd.jpeg', $entry->getContent());
919
920 $client->getContainer()->get('craue_config')->set('download_images_enabled', 0);
921 }
922
923 /**
924 * @depends testNewEntryWithDownloadImagesEnabled
925 */
926 public function testRemoveEntryWithDownloadImagesEnabled()
927 {
928 $this->logInAs('admin');
929 $client = $this->getClient();
930
931 $url = 'http://www.20minutes.fr/montpellier/1952003-20161030-video-car-tombe-panne-rugbymen-perpignan-improvisent-melee-route';
932 $client->getContainer()->get('craue_config')->set('download_images_enabled', 1);
933
934 $content = $client->getContainer()
935 ->get('doctrine.orm.entity_manager')
936 ->getRepository('WallabagCoreBundle:Entry')
937 ->findByUrlAndUserId($url, $this->getLoggedInUserId());
938
939 $client->request('GET', '/delete/'.$content->getId());
940
941 $this->assertEquals(302, $client->getResponse()->getStatusCode());
942
943 $client->getContainer()->get('craue_config')->set('download_images_enabled', 0);
944 }
945
946 public function testRedirectToHomepage()
947 {
948 $this->logInAs('empty');
949 $client = $this->getClient();
950
951 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
952 $user = $em
953 ->getRepository('WallabagUserBundle:User')
954 ->find($this->getLoggedInUserId());
955
956 if (!$user) {
957 $this->markTestSkipped('No user found in db.');
958 }
959
960 // Redirect to homepage
961 $config = $user->getConfig();
962 $config->setActionMarkAsRead(Config::REDIRECT_TO_HOMEPAGE);
963 $em->persist($config);
964 $em->flush();
965
966 $content = $client->getContainer()
967 ->get('doctrine.orm.entity_manager')
968 ->getRepository('WallabagCoreBundle:Entry')
969 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
970
971 $client->request('GET', '/view/'.$content->getId());
972 $client->request('GET', '/archive/'.$content->getId());
973
974 $this->assertEquals(302, $client->getResponse()->getStatusCode());
975 $this->assertEquals('/', $client->getResponse()->headers->get('location'));
976 }
977
978 public function testRedirectToCurrentPage()
979 {
980 $this->logInAs('empty');
981 $client = $this->getClient();
982
983 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
984 $user = $em
985 ->getRepository('WallabagUserBundle:User')
986 ->find($this->getLoggedInUserId());
987
988 if (!$user) {
989 $this->markTestSkipped('No user found in db.');
990 }
991
992 // Redirect to current page
993 $config = $user->getConfig();
994 $config->setActionMarkAsRead(Config::REDIRECT_TO_CURRENT_PAGE);
995 $em->persist($config);
996 $em->flush();
997
998 $content = $client->getContainer()
999 ->get('doctrine.orm.entity_manager')
1000 ->getRepository('WallabagCoreBundle:Entry')
1001 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
1002
1003 $client->request('GET', '/view/'.$content->getId());
1004 $client->request('GET', '/archive/'.$content->getId());
1005
1006 $this->assertEquals(302, $client->getResponse()->getStatusCode());
1007 $this->assertContains('/view/'.$content->getId(), $client->getResponse()->headers->get('location'));
1008 }
1009
1010 public function testFilterOnHttpStatus()
1011 {
1012 $this->logInAs('admin');
1013 $client = $this->getClient();
1014
1015 $crawler = $client->request('GET', '/new');
1016 $form = $crawler->filter('form[name=entry]')->form();
1017
1018 $data = [
1019 'entry[url]' => 'http://www.lemonde.fr/incorrect-url/',
1020 ];
1021
1022 $client->submit($form, $data);
1023
1024 $crawler = $client->request('GET', '/all/list');
1025 $form = $crawler->filter('button[id=submit-filter]')->form();
1026
1027 $data = [
1028 'entry_filter[httpStatus]' => 404,
1029 ];
1030
1031 $crawler = $client->submit($form, $data);
1032
1033 $this->assertCount(1, $crawler->filter('div[class=entry]'));
1034
1035 $crawler = $client->request('GET', '/new');
1036 $form = $crawler->filter('form[name=entry]')->form();
1037
1038 $data = [
1039 'entry[url]' => 'http://www.nextinpact.com/news/101235-wallabag-alternative-libre-a-pocket-creuse-petit-a-petit-son-nid.htm',
1040 ];
1041
1042 $client->submit($form, $data);
1043
1044 $crawler = $client->request('GET', '/all/list');
1045 $form = $crawler->filter('button[id=submit-filter]')->form();
1046
1047 $data = [
1048 'entry_filter[httpStatus]' => 200,
1049 ];
1050
1051 $crawler = $client->submit($form, $data);
1052
1053 $this->assertCount(2, $crawler->filter('div[class=entry]'));
1054
1055 $crawler = $client->request('GET', '/all/list');
1056 $form = $crawler->filter('button[id=submit-filter]')->form();
1057
1058 $data = [
1059 'entry_filter[httpStatus]' => 1024,
1060 ];
1061
1062 $crawler = $client->submit($form, $data);
1063
1064 $this->assertCount(8, $crawler->filter('div[class=entry]'));
1065 }
1066
1067 public function testSearch()
1068 {
1069 $this->logInAs('admin');
1070 $client = $this->getClient();
1071
1072 // Search on unread list
1073 $crawler = $client->request('GET', '/unread/list');
1074
1075 $form = $crawler->filter('form[name=search]')->form();
1076 $data = [
1077 'search_entry[term]' => 'title',
1078 ];
1079
1080 $crawler = $client->submit($form, $data);
1081
1082 $this->assertCount(5, $crawler->filter('div[class=entry]'));
1083
1084 // Search on starred list
1085 $crawler = $client->request('GET', '/starred/list');
1086
1087 $form = $crawler->filter('form[name=search]')->form();
1088 $data = [
1089 'search_entry[term]' => 'title',
1090 ];
1091
1092 $crawler = $client->submit($form, $data);
1093
1094 $this->assertCount(1, $crawler->filter('div[class=entry]'));
1095
1096 // Added new article to test on archive list
1097 $crawler = $client->request('GET', '/new');
1098 $form = $crawler->filter('form[name=entry]')->form();
1099 $data = [
1100 'entry[url]' => $this->url,
1101 ];
1102 $client->submit($form, $data);
1103 $content = $client->getContainer()
1104 ->get('doctrine.orm.entity_manager')
1105 ->getRepository('WallabagCoreBundle:Entry')
1106 ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
1107 $client->request('GET', '/archive/'.$content->getId());
1108
1109 $crawler = $client->request('GET', '/archive/list');
1110
1111 $form = $crawler->filter('form[name=search]')->form();
1112 $data = [
1113 'search_entry[term]' => 'manège',
1114 ];
1115
1116 $crawler = $client->submit($form, $data);
1117
1118 $this->assertCount(1, $crawler->filter('div[class=entry]'));
1119 $client->request('GET', '/delete/'.$content->getId());
1120
1121 // test on list of all articles
1122 $crawler = $client->request('GET', '/all/list');
1123
1124 $form = $crawler->filter('form[name=search]')->form();
1125 $data = [
1126 'search_entry[term]' => 'wxcvbnqsdf', // a string not available in the database
1127 ];
1128
1129 $crawler = $client->submit($form, $data);
1130
1131 $this->assertCount(0, $crawler->filter('div[class=entry]'));
1132
1133 // test url search on list of all articles
1134 $crawler = $client->request('GET', '/all/list');
1135
1136 $form = $crawler->filter('form[name=search]')->form();
1137 $data = [
1138 'search_entry[term]' => 'domain', // the search will match an entry with 'domain' in its url
1139 ];
1140
1141 $crawler = $client->submit($form, $data);
1142
1143 $this->assertCount(1, $crawler->filter('div[class=entry]'));
1144
1145 // same as previous test but for case-sensitivity
1146 $crawler = $client->request('GET', '/all/list');
1147
1148 $form = $crawler->filter('form[name=search]')->form();
1149 $data = [
1150 'search_entry[term]' => 'doMain', // the search will match an entry with 'domain' in its url
1151 ];
1152
1153 $crawler = $client->submit($form, $data);
1154
1155 $this->assertCount(1, $crawler->filter('div[class=entry]'));
1156 }
1157 }