diff options
Diffstat (limited to 'tests/Wallabag/CoreBundle')
10 files changed, 350 insertions, 31 deletions
diff --git a/tests/Wallabag/CoreBundle/Command/CleanDuplicatesCommandTest.php b/tests/Wallabag/CoreBundle/Command/CleanDuplicatesCommandTest.php index 38e8dd07..5ca9785d 100644 --- a/tests/Wallabag/CoreBundle/Command/CleanDuplicatesCommandTest.php +++ b/tests/Wallabag/CoreBundle/Command/CleanDuplicatesCommandTest.php | |||
@@ -60,7 +60,7 @@ class CleanDuplicatesCommandTest extends WallabagCoreTestCase | |||
60 | 60 | ||
61 | public function testDuplicate() | 61 | public function testDuplicate() |
62 | { | 62 | { |
63 | $url = 'http://www.lemonde.fr/sport/visuel/2017/05/05/rondelle-prison-blanchissage-comprendre-le-hockey-sur-glace_5122587_3242.html'; | 63 | $url = 'https://www.lemonde.fr/sport/visuel/2017/05/05/rondelle-prison-blanchissage-comprendre-le-hockey-sur-glace_5122587_3242.html'; |
64 | $client = $this->getClient(); | 64 | $client = $this->getClient(); |
65 | $em = $client->getContainer()->get('doctrine.orm.entity_manager'); | 65 | $em = $client->getContainer()->get('doctrine.orm.entity_manager'); |
66 | 66 | ||
diff --git a/tests/Wallabag/CoreBundle/Command/ReloadEntryCommandTest.php b/tests/Wallabag/CoreBundle/Command/ReloadEntryCommandTest.php index 63c068b4..b13f6519 100644 --- a/tests/Wallabag/CoreBundle/Command/ReloadEntryCommandTest.php +++ b/tests/Wallabag/CoreBundle/Command/ReloadEntryCommandTest.php | |||
@@ -10,7 +10,7 @@ use Wallabag\CoreBundle\Entity\Entry; | |||
10 | 10 | ||
11 | class ReloadEntryCommandTest extends WallabagCoreTestCase | 11 | class ReloadEntryCommandTest extends WallabagCoreTestCase |
12 | { | 12 | { |
13 | 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'; | 13 | public $url = 'https://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'; |
14 | 14 | ||
15 | /** | 15 | /** |
16 | * @var entry | 16 | * @var entry |
diff --git a/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php b/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php index e4bf0998..e07c57dd 100644 --- a/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php | |||
@@ -742,7 +742,7 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
742 | $em->persist($tag); | 742 | $em->persist($tag); |
743 | 743 | ||
744 | $entry = new Entry($user); | 744 | $entry = new Entry($user); |
745 | $entry->setUrl('http://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html'); | 745 | $entry->setUrl('https://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html'); |
746 | $entry->setContent('Youhou'); | 746 | $entry->setContent('Youhou'); |
747 | $entry->setTitle('Youhou'); | 747 | $entry->setTitle('Youhou'); |
748 | $entry->addTag($tag); | 748 | $entry->addTag($tag); |
@@ -827,7 +827,7 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
827 | $em->persist($tag); | 827 | $em->persist($tag); |
828 | 828 | ||
829 | $entry = new Entry($user); | 829 | $entry = new Entry($user); |
830 | $entry->setUrl('http://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html'); | 830 | $entry->setUrl('https://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html'); |
831 | $entry->setContent('Youhou'); | 831 | $entry->setContent('Youhou'); |
832 | $entry->setTitle('Youhou'); | 832 | $entry->setTitle('Youhou'); |
833 | $entry->addTag($tag); | 833 | $entry->addTag($tag); |
@@ -845,7 +845,7 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
845 | $em->persist($tagArchived); | 845 | $em->persist($tagArchived); |
846 | 846 | ||
847 | $entryArchived = new Entry($user); | 847 | $entryArchived = new Entry($user); |
848 | $entryArchived->setUrl('http://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html'); | 848 | $entryArchived->setUrl('https://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html'); |
849 | $entryArchived->setContent('Youhou'); | 849 | $entryArchived->setContent('Youhou'); |
850 | $entryArchived->setTitle('Youhou'); | 850 | $entryArchived->setTitle('Youhou'); |
851 | $entryArchived->addTag($tagArchived); | 851 | $entryArchived->addTag($tagArchived); |
@@ -903,7 +903,7 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
903 | $em->persist($tag); | 903 | $em->persist($tag); |
904 | 904 | ||
905 | $entry = new Entry($user); | 905 | $entry = new Entry($user); |
906 | $entry->setUrl('http://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html'); | 906 | $entry->setUrl('https://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html'); |
907 | $entry->setContent('Youhou'); | 907 | $entry->setContent('Youhou'); |
908 | $entry->setTitle('Youhou'); | 908 | $entry->setTitle('Youhou'); |
909 | $entry->addTag($tag); | 909 | $entry->addTag($tag); |
diff --git a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php index 12788366..bf0068b4 100644 --- a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php | |||
@@ -11,9 +11,9 @@ use Wallabag\CoreBundle\Helper\ContentProxy; | |||
11 | 11 | ||
12 | class EntryControllerTest extends WallabagCoreTestCase | 12 | class EntryControllerTest extends WallabagCoreTestCase |
13 | { | 13 | { |
14 | const AN_URL_CONTAINING_AN_ARTICLE_WITH_IMAGE = 'http://www.lemonde.fr/judo/article/2017/11/11/judo-la-decima-de-teddy-riner_5213605_1556020.html'; | 14 | const AN_URL_CONTAINING_AN_ARTICLE_WITH_IMAGE = 'https://www.lemonde.fr/judo/article/2017/11/11/judo-la-decima-de-teddy-riner_5213605_1556020.html'; |
15 | public $downloadImagesEnabled = false; | 15 | public $downloadImagesEnabled = false; |
16 | 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'; | 16 | public $url = 'https://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'; |
17 | 17 | ||
18 | /** | 18 | /** |
19 | * @after | 19 | * @after |
@@ -174,7 +174,7 @@ class EntryControllerTest extends WallabagCoreTestCase | |||
174 | 174 | ||
175 | public function testPostWithMultipleAuthors() | 175 | public function testPostWithMultipleAuthors() |
176 | { | 176 | { |
177 | $url = 'http://www.liberation.fr/planete/2017/04/05/donald-trump-et-xi-jinping-tentative-de-flirt-en-floride_1560768'; | 177 | $url = 'https://www.liberation.fr/planete/2017/04/05/donald-trump-et-xi-jinping-tentative-de-flirt-en-floride_1560768'; |
178 | $this->logInAs('admin'); | 178 | $this->logInAs('admin'); |
179 | $client = $this->getClient(); | 179 | $client = $this->getClient(); |
180 | 180 | ||
@@ -197,6 +197,7 @@ class EntryControllerTest extends WallabagCoreTestCase | |||
197 | ->getRepository('WallabagCoreBundle:Entry') | 197 | ->getRepository('WallabagCoreBundle:Entry') |
198 | ->findByUrlAndUserId($url, $this->getLoggedInUserId()); | 198 | ->findByUrlAndUserId($url, $this->getLoggedInUserId()); |
199 | 199 | ||
200 | $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $content); | ||
200 | $authors = $content->getPublishedBy(); | 201 | $authors = $content->getPublishedBy(); |
201 | $this->assertSame('2017-04-05 19:26:13', $content->getPublishedAt()->format('Y-m-d H:i:s')); | 202 | $this->assertSame('2017-04-05 19:26:13', $content->getPublishedAt()->format('Y-m-d H:i:s')); |
202 | $this->assertSame('fr', $content->getLanguage()); | 203 | $this->assertSame('fr', $content->getLanguage()); |
@@ -524,7 +525,7 @@ class EntryControllerTest extends WallabagCoreTestCase | |||
524 | 525 | ||
525 | $this->assertGreaterThan(1, $title = $crawler->filter('div[id=article] h1')->extract(['_text'])); | 526 | $this->assertGreaterThan(1, $title = $crawler->filter('div[id=article] h1')->extract(['_text'])); |
526 | $this->assertContains('My updated title hehe :)', $title[0]); | 527 | $this->assertContains('My updated title hehe :)', $title[0]); |
527 | $this->assertSame(1, count($stats = $crawler->filter('div[class=tools] ul[class=stats] li a[class=tool]')->extract(['_text']))); | 528 | $this->assertSame(1, \count($stats = $crawler->filter('div[class=tools] ul[class=stats] li a[class=tool]')->extract(['_text']))); |
528 | $this->assertNotContains('example.io', trim($stats[0])); | 529 | $this->assertNotContains('example.io', trim($stats[0])); |
529 | } | 530 | } |
530 | 531 | ||
@@ -1143,7 +1144,7 @@ class EntryControllerTest extends WallabagCoreTestCase | |||
1143 | $client = $this->getClient(); | 1144 | $client = $this->getClient(); |
1144 | 1145 | ||
1145 | $entry = new Entry($this->getLoggedInUser()); | 1146 | $entry = new Entry($this->getLoggedInUser()); |
1146 | $entry->setUrl('http://www.lemonde.fr/incorrect-url/'); | 1147 | $entry->setUrl('https://www.lemonde.fr/incorrect-url/'); |
1147 | $entry->setHttpStatus(404); | 1148 | $entry->setHttpStatus(404); |
1148 | $this->getEntityManager()->persist($entry); | 1149 | $this->getEntityManager()->persist($entry); |
1149 | 1150 | ||
@@ -1309,12 +1310,12 @@ class EntryControllerTest extends WallabagCoreTestCase | |||
1309 | 'https://www.pravda.ru/world/09-06-2017/1337283-qatar-0/', | 1310 | 'https://www.pravda.ru/world/09-06-2017/1337283-qatar-0/', |
1310 | 'ru', | 1311 | 'ru', |
1311 | ], | 1312 | ], |
1312 | 'fr-FR' => [ | 1313 | 'fr' => [ |
1313 | 'https://www.zataz.com/90-des-dossiers-medicaux-des-coreens-du-sud-vendus-a-des-entreprises-privees/', | 1314 | 'https://fr.wikipedia.org/wiki/Wallabag', |
1314 | 'fr_FR', | 1315 | 'fr', |
1315 | ], | 1316 | ], |
1316 | 'de' => [ | 1317 | 'de' => [ |
1317 | 'http://www.bild.de/politik/ausland/theresa-may/wahlbeben-grossbritannien-analyse-52108924.bild.html', | 1318 | 'https://www.bild.de/politik/ausland/theresa-may/wahlbeben-grossbritannien-analyse-52108924.bild.html', |
1318 | 'de', | 1319 | 'de', |
1319 | ], | 1320 | ], |
1320 | 'it' => [ | 1321 | 'it' => [ |
@@ -1325,16 +1326,12 @@ class EntryControllerTest extends WallabagCoreTestCase | |||
1325 | 'http://www.hao123.com/shequ?__noscript__-=1', | 1326 | 'http://www.hao123.com/shequ?__noscript__-=1', |
1326 | 'zh_CN', | 1327 | 'zh_CN', |
1327 | ], | 1328 | ], |
1328 | 'de_AT' => [ | 1329 | 'ru' => [ |
1329 | 'https://buy.garmin.com/de-AT/AT/catalog/product/compareResult.ep?compareProduct=112885&compareProduct=36728', | 1330 | 'https://www.kp.ru/daily/26879.7/3921982/', |
1330 | 'de_AT', | 1331 | 'ru', |
1331 | ], | ||
1332 | 'ru_RU' => [ | ||
1333 | 'http://netler.ru/ikt/windows-error-reporting.htm', | ||
1334 | 'ru_RU', | ||
1335 | ], | 1332 | ], |
1336 | 'pt_BR' => [ | 1333 | 'pt_BR' => [ |
1337 | 'http://precodoscombustiveis.com.br/postos/cidade/4121/pr/maringa', | 1334 | 'https://politica.estadao.com.br/noticias/eleicoes,campanha-catatonica,70002491983', |
1338 | 'pt_BR', | 1335 | 'pt_BR', |
1339 | ], | 1336 | ], |
1340 | 'fucked_list_of_languages' => [ | 1337 | 'fucked_list_of_languages' => [ |
@@ -1342,8 +1339,8 @@ class EntryControllerTest extends WallabagCoreTestCase | |||
1342 | null, | 1339 | null, |
1343 | ], | 1340 | ], |
1344 | 'es-ES' => [ | 1341 | 'es-ES' => [ |
1345 | 'https://www.muylinux.com/2015/04/17/odf-reino-unido-microsoft-google/', | 1342 | 'https://www.20minutos.es/noticia/3360685/0/gobierno-sanchez-primero-historia-mas-mujeres-que-hombres/', |
1346 | 'es_ES', | 1343 | 'es', |
1347 | ], | 1344 | ], |
1348 | ]; | 1345 | ]; |
1349 | } | 1346 | } |
diff --git a/tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php b/tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php index ab7f23cc..6f3308e5 100644 --- a/tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php | |||
@@ -180,7 +180,7 @@ class ExportControllerTest extends WallabagCoreTestCase | |||
180 | 180 | ||
181 | $this->assertGreaterThan(1, $csv); | 181 | $this->assertGreaterThan(1, $csv); |
182 | // +1 for title line | 182 | // +1 for title line |
183 | $this->assertSame(count($contentInDB) + 1, count($csv)); | 183 | $this->assertSame(\count($contentInDB) + 1, \count($csv)); |
184 | $this->assertSame('Title;URL;Content;Tags;"MIME Type";Language;"Creation date"', $csv[0]); | 184 | $this->assertSame('Title;URL;Content;Tags;"MIME Type";Language;"Creation date"', $csv[0]); |
185 | $this->assertContains($contentInDB[0]['title'], $csv[1]); | 185 | $this->assertContains($contentInDB[0]['title'], $csv[1]); |
186 | $this->assertContains($contentInDB[0]['url'], $csv[1]); | 186 | $this->assertContains($contentInDB[0]['url'], $csv[1]); |
@@ -272,7 +272,7 @@ class ExportControllerTest extends WallabagCoreTestCase | |||
272 | 272 | ||
273 | $content = new \SimpleXMLElement($client->getResponse()->getContent()); | 273 | $content = new \SimpleXMLElement($client->getResponse()->getContent()); |
274 | $this->assertGreaterThan(0, $content->count()); | 274 | $this->assertGreaterThan(0, $content->count()); |
275 | $this->assertSame(count($contentInDB), $content->count()); | 275 | $this->assertSame(\count($contentInDB), $content->count()); |
276 | $this->assertNotEmpty('id', (string) $content->entry[0]->id); | 276 | $this->assertNotEmpty('id', (string) $content->entry[0]->id); |
277 | $this->assertNotEmpty('title', (string) $content->entry[0]->title); | 277 | $this->assertNotEmpty('title', (string) $content->entry[0]->title); |
278 | $this->assertNotEmpty('url', (string) $content->entry[0]->url); | 278 | $this->assertNotEmpty('url', (string) $content->entry[0]->url); |
diff --git a/tests/Wallabag/CoreBundle/Controller/SecurityControllerTest.php b/tests/Wallabag/CoreBundle/Controller/SecurityControllerTest.php index 2cf596d4..395208a2 100644 --- a/tests/Wallabag/CoreBundle/Controller/SecurityControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/SecurityControllerTest.php | |||
@@ -6,6 +6,16 @@ use Tests\Wallabag\CoreBundle\WallabagCoreTestCase; | |||
6 | 6 | ||
7 | class SecurityControllerTest extends WallabagCoreTestCase | 7 | class SecurityControllerTest extends WallabagCoreTestCase |
8 | { | 8 | { |
9 | public function testLoginWithEmail() | ||
10 | { | ||
11 | $this->logInAsUsingHttp('bigboss@wallabag.org'); | ||
12 | $client = $this->getClient(); | ||
13 | $client->followRedirects(); | ||
14 | |||
15 | $crawler = $client->request('GET', '/config'); | ||
16 | $this->assertContains('config.form_rss.description', $crawler->filter('body')->extract(['_text'])[0]); | ||
17 | } | ||
18 | |||
9 | public function testLoginWithout2Factor() | 19 | public function testLoginWithout2Factor() |
10 | { | 20 | { |
11 | $this->logInAs('admin'); | 21 | $this->logInAs('admin'); |
@@ -81,7 +91,7 @@ class SecurityControllerTest extends WallabagCoreTestCase | |||
81 | } | 91 | } |
82 | 92 | ||
83 | $client->followRedirects(); | 93 | $client->followRedirects(); |
84 | $crawler = $client->request('GET', '/register'); | 94 | $client->request('GET', '/register'); |
85 | $this->assertContains('registration.submit', $client->getResponse()->getContent()); | 95 | $this->assertContains('registration.submit', $client->getResponse()->getContent()); |
86 | } | 96 | } |
87 | } | 97 | } |
diff --git a/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php b/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php index 5a973a7e..768f4c07 100644 --- a/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php | |||
@@ -98,7 +98,7 @@ class TagControllerTest extends WallabagCoreTestCase | |||
98 | $tags[$key] = $tag->getLabel(); | 98 | $tags[$key] = $tag->getLabel(); |
99 | } | 99 | } |
100 | 100 | ||
101 | $this->assertGreaterThanOrEqual(2, count($tags)); | 101 | $this->assertGreaterThanOrEqual(2, \count($tags)); |
102 | $this->assertNotFalse(array_search('foo2', $tags, true), 'Tag foo2 is assigned to the entry'); | 102 | $this->assertNotFalse(array_search('foo2', $tags, true), 'Tag foo2 is assigned to the entry'); |
103 | $this->assertNotFalse(array_search('bar2', $tags, true), 'Tag bar2 is assigned to the entry'); | 103 | $this->assertNotFalse(array_search('bar2', $tags, true), 'Tag bar2 is assigned to the entry'); |
104 | } | 104 | } |
diff --git a/tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php b/tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php index 398592e1..3f3c60d0 100644 --- a/tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php +++ b/tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php | |||
@@ -11,7 +11,6 @@ use Symfony\Component\Validator\ConstraintViolation; | |||
11 | use Symfony\Component\Validator\ConstraintViolationList; | 11 | use Symfony\Component\Validator\ConstraintViolationList; |
12 | use Symfony\Component\Validator\Validator\RecursiveValidator; | 12 | use Symfony\Component\Validator\Validator\RecursiveValidator; |
13 | use Wallabag\CoreBundle\Entity\Entry; | 13 | use Wallabag\CoreBundle\Entity\Entry; |
14 | use Wallabag\CoreBundle\Entity\Tag; | ||
15 | use Wallabag\CoreBundle\Helper\ContentProxy; | 14 | use Wallabag\CoreBundle\Helper\ContentProxy; |
16 | use Wallabag\CoreBundle\Helper\RuleBasedTagger; | 15 | use Wallabag\CoreBundle\Helper\RuleBasedTagger; |
17 | use Wallabag\UserBundle\Entity\User; | 16 | use Wallabag\UserBundle\Entity\User; |
@@ -532,6 +531,250 @@ class ContentProxyTest extends TestCase | |||
532 | $this->assertSame('1.1.1.1', $entry->getDomainName()); | 531 | $this->assertSame('1.1.1.1', $entry->getDomainName()); |
533 | } | 532 | } |
534 | 533 | ||
534 | public function testWebsiteWithValidUTF8Title_doNothing() | ||
535 | { | ||
536 | // You can use https://www.online-toolz.com/tools/text-hex-convertor.php to convert UTF-8 text <=> hex | ||
537 | // See http://graphemica.com for more info about the characters | ||
538 | // '😻ℤz' (U+1F63B or F09F98BB; U+2124 or E284A4; U+007A or 7A) in hexadecimal and UTF-8 | ||
539 | $actualTitle = $this->hexToStr('F09F98BB' . 'E284A4' . '7A'); | ||
540 | |||
541 | $tagger = $this->getTaggerMock(); | ||
542 | $tagger->expects($this->once()) | ||
543 | ->method('tag'); | ||
544 | |||
545 | $graby = $this->getMockBuilder('Graby\Graby') | ||
546 | ->setMethods(['fetchContent']) | ||
547 | ->disableOriginalConstructor() | ||
548 | ->getMock(); | ||
549 | |||
550 | $graby->expects($this->any()) | ||
551 | ->method('fetchContent') | ||
552 | ->willReturn([ | ||
553 | 'html' => false, | ||
554 | 'title' => $actualTitle, | ||
555 | 'url' => '', | ||
556 | 'content_type' => 'text/html', | ||
557 | 'language' => '', | ||
558 | ]); | ||
559 | |||
560 | $proxy = new ContentProxy($graby, $tagger, $this->getValidator(), $this->getLogger(), $this->fetchingErrorMessage); | ||
561 | $entry = new Entry(new User()); | ||
562 | $proxy->updateEntry($entry, 'http://0.0.0.0'); | ||
563 | |||
564 | // '😻ℤz' (U+1F63B or F09F98BB; U+2124 or E284A4; U+007A or 7A) in hexadecimal and UTF-8 | ||
565 | $expectedTitle = 'F09F98BB' . 'E284A4' . '7A'; | ||
566 | $this->assertSame($expectedTitle, $this->strToHex($entry->getTitle())); | ||
567 | } | ||
568 | |||
569 | public function testWebsiteWithInvalidUTF8Title_removeInvalidCharacter() | ||
570 | { | ||
571 | // See http://graphemica.com for more info about the characters | ||
572 | // 'a€b' (61;80;62) in hexadecimal and WINDOWS-1252 - but 80 is a invalid UTF-8 character. | ||
573 | // The correct UTF-8 € character (U+20AC) is E282AC | ||
574 | $actualTitle = $this->hexToStr('61' . '80' . '62'); | ||
575 | |||
576 | $tagger = $this->getTaggerMock(); | ||
577 | $tagger->expects($this->once()) | ||
578 | ->method('tag'); | ||
579 | |||
580 | $graby = $this->getMockBuilder('Graby\Graby') | ||
581 | ->setMethods(['fetchContent']) | ||
582 | ->disableOriginalConstructor() | ||
583 | ->getMock(); | ||
584 | |||
585 | $graby->expects($this->any()) | ||
586 | ->method('fetchContent') | ||
587 | ->willReturn([ | ||
588 | 'html' => false, | ||
589 | 'title' => $actualTitle, | ||
590 | 'url' => '', | ||
591 | 'content_type' => 'text/html', | ||
592 | 'language' => '', | ||
593 | ]); | ||
594 | |||
595 | $proxy = new ContentProxy($graby, $tagger, $this->getValidator(), $this->getLogger(), $this->fetchingErrorMessage); | ||
596 | $entry = new Entry(new User()); | ||
597 | $proxy->updateEntry($entry, 'http://0.0.0.0'); | ||
598 | |||
599 | // 'ab' (61;62) because all invalid UTF-8 character (like 80) are removed | ||
600 | $expectedTitle = '61' . '62'; | ||
601 | $this->assertSame($expectedTitle, $this->strToHex($entry->getTitle())); | ||
602 | } | ||
603 | |||
604 | public function testPdfWithUTF16BETitle_convertToUTF8() | ||
605 | { | ||
606 | // See http://graphemica.com for more info about the characters | ||
607 | // '😻' (U+1F63B;D83DDE3B) in hexadecimal and as UTF16BE | ||
608 | $actualTitle = $this->hexToStr('D83DDE3B'); | ||
609 | |||
610 | $tagger = $this->getTaggerMock(); | ||
611 | $tagger->expects($this->once()) | ||
612 | ->method('tag'); | ||
613 | |||
614 | $graby = $this->getMockBuilder('Graby\Graby') | ||
615 | ->setMethods(['fetchContent']) | ||
616 | ->disableOriginalConstructor() | ||
617 | ->getMock(); | ||
618 | |||
619 | $graby->expects($this->any()) | ||
620 | ->method('fetchContent') | ||
621 | ->willReturn([ | ||
622 | 'html' => false, | ||
623 | 'title' => $actualTitle, | ||
624 | 'url' => '', | ||
625 | 'content_type' => 'application/pdf', | ||
626 | 'language' => '', | ||
627 | ]); | ||
628 | |||
629 | $proxy = new ContentProxy($graby, $tagger, $this->getValidator(), $this->getLogger(), $this->fetchingErrorMessage); | ||
630 | $entry = new Entry(new User()); | ||
631 | $proxy->updateEntry($entry, 'http://0.0.0.0'); | ||
632 | |||
633 | // '😻' (U+1F63B or F09F98BB) in hexadecimal and UTF-8 | ||
634 | $expectedTitle = 'F09F98BB'; | ||
635 | $this->assertSame($expectedTitle, $this->strToHex($entry->getTitle())); | ||
636 | } | ||
637 | |||
638 | public function testPdfWithUTF8Title_doNothing() | ||
639 | { | ||
640 | // See http://graphemica.com for more info about the characters | ||
641 | // '😻' (U+1F63B;D83DDE3B) in hexadecimal and as UTF8 | ||
642 | $actualTitle = $this->hexToStr('F09F98BB'); | ||
643 | |||
644 | $tagger = $this->getTaggerMock(); | ||
645 | $tagger->expects($this->once()) | ||
646 | ->method('tag'); | ||
647 | |||
648 | $graby = $this->getMockBuilder('Graby\Graby') | ||
649 | ->setMethods(['fetchContent']) | ||
650 | ->disableOriginalConstructor() | ||
651 | ->getMock(); | ||
652 | |||
653 | $graby->expects($this->any()) | ||
654 | ->method('fetchContent') | ||
655 | ->willReturn([ | ||
656 | 'html' => false, | ||
657 | 'title' => $actualTitle, | ||
658 | 'url' => '', | ||
659 | 'content_type' => 'application/pdf', | ||
660 | 'language' => '', | ||
661 | ]); | ||
662 | |||
663 | $proxy = new ContentProxy($graby, $tagger, $this->getValidator(), $this->getLogger(), $this->fetchingErrorMessage); | ||
664 | $entry = new Entry(new User()); | ||
665 | $proxy->updateEntry($entry, 'http://0.0.0.0'); | ||
666 | |||
667 | // '😻' (U+1F63B or F09F98BB) in hexadecimal and UTF-8 | ||
668 | $expectedTitle = 'F09F98BB'; | ||
669 | $this->assertSame($expectedTitle, $this->strToHex($entry->getTitle())); | ||
670 | } | ||
671 | |||
672 | public function testPdfWithWINDOWS1252Title_convertToUTF8() | ||
673 | { | ||
674 | // See http://graphemica.com for more info about the characters | ||
675 | // '€' (80) in hexadecimal and WINDOWS-1252 | ||
676 | $actualTitle = $this->hexToStr('80'); | ||
677 | |||
678 | $tagger = $this->getTaggerMock(); | ||
679 | $tagger->expects($this->once()) | ||
680 | ->method('tag'); | ||
681 | |||
682 | $graby = $this->getMockBuilder('Graby\Graby') | ||
683 | ->setMethods(['fetchContent']) | ||
684 | ->disableOriginalConstructor() | ||
685 | ->getMock(); | ||
686 | |||
687 | $graby->expects($this->any()) | ||
688 | ->method('fetchContent') | ||
689 | ->willReturn([ | ||
690 | 'html' => false, | ||
691 | 'title' => $actualTitle, | ||
692 | 'url' => '', | ||
693 | 'content_type' => 'application/pdf', | ||
694 | 'language' => '', | ||
695 | ]); | ||
696 | |||
697 | $proxy = new ContentProxy($graby, $tagger, $this->getValidator(), $this->getLogger(), $this->fetchingErrorMessage); | ||
698 | $entry = new Entry(new User()); | ||
699 | $proxy->updateEntry($entry, 'http://0.0.0.0'); | ||
700 | |||
701 | // '€' (U+20AC or E282AC) in hexadecimal and UTF-8 | ||
702 | $expectedTitle = 'E282AC'; | ||
703 | $this->assertSame($expectedTitle, $this->strToHex($entry->getTitle())); | ||
704 | } | ||
705 | |||
706 | public function testPdfWithInvalidCharacterInTitle_removeInvalidCharacter() | ||
707 | { | ||
708 | // See http://graphemica.com for more info about the characters | ||
709 | // '😻ℤ�z' (U+1F63B or F09F98BB; U+2124 or E284A4; invalid character 81; U+007A or 7A) in hexadecimal and UTF-8 | ||
710 | // 0x81 is not a valid character for UTF16, UTF8 and WINDOWS-1252 | ||
711 | $actualTitle = $this->hexToStr('F09F98BB' . 'E284A4' . '81' . '7A'); | ||
712 | |||
713 | $tagger = $this->getTaggerMock(); | ||
714 | $tagger->expects($this->once()) | ||
715 | ->method('tag'); | ||
716 | |||
717 | $graby = $this->getMockBuilder('Graby\Graby') | ||
718 | ->setMethods(['fetchContent']) | ||
719 | ->disableOriginalConstructor() | ||
720 | ->getMock(); | ||
721 | |||
722 | $graby->expects($this->any()) | ||
723 | ->method('fetchContent') | ||
724 | ->willReturn([ | ||
725 | 'html' => false, | ||
726 | 'title' => $actualTitle, | ||
727 | 'url' => '', | ||
728 | 'content_type' => 'application/pdf', | ||
729 | 'language' => '', | ||
730 | ]); | ||
731 | |||
732 | $proxy = new ContentProxy($graby, $tagger, $this->getValidator(), $this->getLogger(), $this->fetchingErrorMessage); | ||
733 | $entry = new Entry(new User()); | ||
734 | $proxy->updateEntry($entry, 'http://0.0.0.0'); | ||
735 | |||
736 | // '😻ℤz' (U+1F63B or F09F98BB; U+2124 or E284A4; U+007A or 7A) in hexadecimal and UTF-8 | ||
737 | // the 0x81 (represented by �) is invalid for UTF16, UTF8 and WINDOWS-1252 and is removed | ||
738 | $expectedTitle = 'F09F98BB' . 'E284A4' . '7A'; | ||
739 | $this->assertSame($expectedTitle, $this->strToHex($entry->getTitle())); | ||
740 | } | ||
741 | |||
742 | /** | ||
743 | * https://stackoverflow.com/a/18506801. | ||
744 | * | ||
745 | * @param $string | ||
746 | * | ||
747 | * @return string | ||
748 | */ | ||
749 | private function strToHex($string) | ||
750 | { | ||
751 | $hex = ''; | ||
752 | for ($i = 0; $i < \strlen($string); ++$i) { | ||
753 | $ord = \ord($string[$i]); | ||
754 | $hexCode = dechex($ord); | ||
755 | $hex .= substr('0' . $hexCode, -2); | ||
756 | } | ||
757 | |||
758 | return strtoupper($hex); | ||
759 | } | ||
760 | |||
761 | /** | ||
762 | * https://stackoverflow.com/a/18506801. | ||
763 | * | ||
764 | * @param $hex | ||
765 | * | ||
766 | * @return string | ||
767 | */ | ||
768 | private function hexToStr($hex) | ||
769 | { | ||
770 | $string = ''; | ||
771 | for ($i = 0; $i < \strlen($hex) - 1; $i += 2) { | ||
772 | $string .= \chr(hexdec($hex[$i] . $hex[$i + 1])); | ||
773 | } | ||
774 | |||
775 | return $string; | ||
776 | } | ||
777 | |||
535 | private function getTaggerMock() | 778 | private function getTaggerMock() |
536 | { | 779 | { |
537 | return $this->getMockBuilder(RuleBasedTagger::class) | 780 | return $this->getMockBuilder(RuleBasedTagger::class) |
diff --git a/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php b/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php index 0e1d296b..cda5f843 100644 --- a/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php +++ b/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php | |||
@@ -183,4 +183,73 @@ class DownloadImagesTest extends TestCase | |||
183 | $this->assertContains('http://wallabag.io/assets/images/9/b/9b0ead26/', $res, 'Content-Type was empty but data is ok for an image'); | 183 | $this->assertContains('http://wallabag.io/assets/images/9/b/9b0ead26/', $res, 'Content-Type was empty but data is ok for an image'); |
184 | $this->assertContains('DownloadImages: Checking extension (alternative)', $logHandler->getRecords()[3]['message']); | 184 | $this->assertContains('DownloadImages: Checking extension (alternative)', $logHandler->getRecords()[3]['message']); |
185 | } | 185 | } |
186 | |||
187 | public function testProcessImageWithSrcset() | ||
188 | { | ||
189 | $client = new Client(); | ||
190 | |||
191 | $mock = new Mock([ | ||
192 | new Response(200, ['content-type' => 'image/jpeg'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))), | ||
193 | new Response(200, ['content-type' => 'image/jpeg'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))), | ||
194 | new Response(200, ['content-type' => 'image/jpeg'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))), | ||
195 | ]); | ||
196 | |||
197 | $client->getEmitter()->attach($mock); | ||
198 | |||
199 | $logHandler = new TestHandler(); | ||
200 | $logger = new Logger('test', [$logHandler]); | ||
201 | |||
202 | $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); | ||
203 | $res = $download->processHtml(123, '<p><img class="alignnone wp-image-1153" src="http://piketty.blog.lemonde.fr/files/2017/10/F1FR-530x375.jpg" alt="" width="628" height="444" srcset="http://piketty.blog.lemonde.fr/files/2017/10/F1FR-530x375.jpg 530w, http://piketty.blog.lemonde.fr/files/2017/10/F1FR-768x543.jpg 768w, http://piketty.blog.lemonde.fr/files/2017/10/F1FR-900x636.jpg 900w" sizes="(max-width: 628px) 100vw, 628px" /></p>', 'http://piketty.blog.lemonde.fr/2017/10/12/budget-2018-la-jeunesse-sacrifiee/'); | ||
204 | |||
205 | $this->assertNotContains('http://piketty.blog.lemonde.fr/', $res, 'Image srcset attribute were not replaced'); | ||
206 | } | ||
207 | |||
208 | public function testProcessImageWithTrickySrcset() | ||
209 | { | ||
210 | $client = new Client(); | ||
211 | |||
212 | $mock = new Mock([ | ||
213 | new Response(200, ['content-type' => 'image/jpeg'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))), | ||
214 | new Response(200, ['content-type' => 'image/jpeg'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))), | ||
215 | new Response(200, ['content-type' => 'image/jpeg'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))), | ||
216 | ]); | ||
217 | |||
218 | $client->getEmitter()->attach($mock); | ||
219 | |||
220 | $logHandler = new TestHandler(); | ||
221 | $logger = new Logger('test', [$logHandler]); | ||
222 | |||
223 | $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); | ||
224 | $res = $download->processHtml(123, '<figure id="post-257260" class="align-none media-257260"><img src="https://cdn.css-tricks.com/wp-content/uploads/2017/08/the-critical-request.png" srcset="https://res.cloudinary.com/css-tricks/image/upload/c_scale,w_1000,f_auto,q_auto/v1501594717/the-critical-request_bqdfaa.png 1000w, https://res.cloudinary.com/css-tricks/image/upload/c_scale,w_200,f_auto,q_auto/v1501594717/the-critical-request_bqdfaa.png 200w" sizes="(min-width: 1850px) calc( (100vw - 555px) / 3 ) | ||
225 | (min-width: 1251px) calc( (100vw - 530px) / 2 ) | ||
226 | (min-width: 1086px) calc(100vw - 480px) | ||
227 | (min-width: 626px) calc(100vw - 335px) | ||
228 | calc(100vw - 30px)" alt="" /></figure>', 'https://css-tricks.com/the-critical-request/'); | ||
229 | |||
230 | $this->assertNotContains('f_auto,q_auto', $res, 'Image srcset attribute were not replaced'); | ||
231 | } | ||
232 | |||
233 | public function testProcessImageWithNullPath() | ||
234 | { | ||
235 | $client = new Client(); | ||
236 | |||
237 | $mock = new Mock([ | ||
238 | new Response(200, ['content-type' => null], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))), | ||
239 | ]); | ||
240 | |||
241 | $client->getEmitter()->attach($mock); | ||
242 | |||
243 | $logHandler = new TestHandler(); | ||
244 | $logger = new Logger('test', [$logHandler]); | ||
245 | |||
246 | $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); | ||
247 | |||
248 | $res = $download->processSingleImage( | ||
249 | 123, | ||
250 | null, | ||
251 | 'https://framablog.org/2018/06/30/engagement-atypique/' | ||
252 | ); | ||
253 | $this->assertFalse($res); | ||
254 | } | ||
186 | } | 255 | } |
diff --git a/tests/Wallabag/CoreBundle/Tools/UtilsTest.php b/tests/Wallabag/CoreBundle/Tools/UtilsTest.php index 347589dc..952d076d 100644 --- a/tests/Wallabag/CoreBundle/Tools/UtilsTest.php +++ b/tests/Wallabag/CoreBundle/Tools/UtilsTest.php | |||
@@ -13,7 +13,7 @@ class UtilsTest extends TestCase | |||
13 | */ | 13 | */ |
14 | public function testCorrectWordsCountForDifferentLanguages($text, $expectedCount) | 14 | public function testCorrectWordsCountForDifferentLanguages($text, $expectedCount) |
15 | { | 15 | { |
16 | static::assertEquals((float) $expectedCount, Utils::getReadingTime($text)); | 16 | static::assertSame((float) $expectedCount, Utils::getReadingTime($text)); |
17 | } | 17 | } |
18 | 18 | ||
19 | public function examples() | 19 | public function examples() |