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