]>
Commit | Line | Data |
---|---|---|
1 | <?php | |
2 | ||
3 | namespace Tests\Wallabag\CoreBundle\Helper; | |
4 | ||
5 | use GuzzleHttp\Client; | |
6 | use GuzzleHttp\Message\Response; | |
7 | use GuzzleHttp\Stream\Stream; | |
8 | use GuzzleHttp\Subscriber\Mock; | |
9 | use Monolog\Handler\TestHandler; | |
10 | use Monolog\Logger; | |
11 | use Wallabag\CoreBundle\Helper\DownloadImages; | |
12 | ||
13 | class DownloadImagesTest extends \PHPUnit_Framework_TestCase | |
14 | { | |
15 | public function dataForSuccessImage() | |
16 | { | |
17 | return [ | |
18 | 'imgur' => [ | |
19 | '<div><img src="http://i.imgur.com/T9qgcHc.jpg" /></div>', | |
20 | 'http://imgur.com/gallery/WxtWY', | |
21 | ], | |
22 | 'image with &' => [ | |
23 | '<div><img src="https://i2.wp.com/www.tvaddons.ag/wp-content/uploads/2017/01/Screen-Shot-2017-01-07-at-10.17.40-PM.jpg?w=640&ssl=1" /></div>', | |
24 | 'https://www.tvaddons.ag/realdebrid-kodi-jarvis/', | |
25 | ], | |
26 | ]; | |
27 | } | |
28 | ||
29 | /** | |
30 | * @dataProvider dataForSuccessImage | |
31 | */ | |
32 | public function testProcessHtml($html, $url) | |
33 | { | |
34 | $client = new Client(); | |
35 | ||
36 | $mock = new Mock([ | |
37 | new Response(200, ['content-type' => 'image/png'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/unnamed.png'))), | |
38 | ]); | |
39 | ||
40 | $client->getEmitter()->attach($mock); | |
41 | ||
42 | $logHandler = new TestHandler(); | |
43 | $logger = new Logger('test', [$logHandler]); | |
44 | ||
45 | $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); | |
46 | ||
47 | $res = $download->processHtml(123, $html, $url); | |
48 | ||
49 | // this the base path of all image (since it's calculated using the entry id: 123) | |
50 | $this->assertContains('http://wallabag.io/assets/images/9/b/9b0ead26/', $res); | |
51 | } | |
52 | ||
53 | public function testProcessHtmlWithBadImage() | |
54 | { | |
55 | $client = new Client(); | |
56 | ||
57 | $mock = new Mock([ | |
58 | new Response(200, ['content-type' => 'application/json'], Stream::factory('')), | |
59 | ]); | |
60 | ||
61 | $client->getEmitter()->attach($mock); | |
62 | ||
63 | $logHandler = new TestHandler(); | |
64 | $logger = new Logger('test', [$logHandler]); | |
65 | ||
66 | $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); | |
67 | $res = $download->processHtml(123, '<div><img src="http://i.imgur.com/T9qgcHc.jpg" /></div>', 'http://imgur.com/gallery/WxtWY'); | |
68 | ||
69 | $this->assertContains('http://i.imgur.com/T9qgcHc.jpg', $res, 'Image were not replace because of content-type'); | |
70 | } | |
71 | ||
72 | public function singleImage() | |
73 | { | |
74 | return [ | |
75 | ['image/pjpeg', 'jpeg'], | |
76 | ['image/jpeg', 'jpeg'], | |
77 | ['image/png', 'png'], | |
78 | ['image/gif', 'gif'], | |
79 | ]; | |
80 | } | |
81 | ||
82 | /** | |
83 | * @dataProvider singleImage | |
84 | */ | |
85 | public function testProcessSingleImage($header, $extension) | |
86 | { | |
87 | $client = new Client(); | |
88 | ||
89 | $mock = new Mock([ | |
90 | new Response(200, ['content-type' => $header], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/unnamed.png'))), | |
91 | ]); | |
92 | ||
93 | $client->getEmitter()->attach($mock); | |
94 | ||
95 | $logHandler = new TestHandler(); | |
96 | $logger = new Logger('test', [$logHandler]); | |
97 | ||
98 | $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); | |
99 | $res = $download->processSingleImage(123, 'T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY'); | |
100 | ||
101 | $this->assertContains('/assets/images/9/b/9b0ead26/ebe60399.' . $extension, $res); | |
102 | } | |
103 | ||
104 | public function testProcessSingleImageWithBadUrl() | |
105 | { | |
106 | $client = new Client(); | |
107 | ||
108 | $mock = new Mock([ | |
109 | new Response(404, []), | |
110 | ]); | |
111 | ||
112 | $client->getEmitter()->attach($mock); | |
113 | ||
114 | $logHandler = new TestHandler(); | |
115 | $logger = new Logger('test', [$logHandler]); | |
116 | ||
117 | $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); | |
118 | $res = $download->processSingleImage(123, 'T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY'); | |
119 | ||
120 | $this->assertFalse($res, 'Image can not be found, so it will not be replaced'); | |
121 | } | |
122 | ||
123 | public function testProcessSingleImageWithBadImage() | |
124 | { | |
125 | $client = new Client(); | |
126 | ||
127 | $mock = new Mock([ | |
128 | new Response(200, ['content-type' => 'image/png'], Stream::factory('')), | |
129 | ]); | |
130 | ||
131 | $client->getEmitter()->attach($mock); | |
132 | ||
133 | $logHandler = new TestHandler(); | |
134 | $logger = new Logger('test', [$logHandler]); | |
135 | ||
136 | $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); | |
137 | $res = $download->processSingleImage(123, 'http://i.imgur.com/T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY'); | |
138 | ||
139 | $this->assertFalse($res, 'Image can not be loaded, so it will not be replaced'); | |
140 | } | |
141 | ||
142 | public function testProcessSingleImageFailAbsolute() | |
143 | { | |
144 | $client = new Client(); | |
145 | ||
146 | $mock = new Mock([ | |
147 | new Response(200, ['content-type' => 'image/png'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/unnamed.png'))), | |
148 | ]); | |
149 | ||
150 | $client->getEmitter()->attach($mock); | |
151 | ||
152 | $logHandler = new TestHandler(); | |
153 | $logger = new Logger('test', [$logHandler]); | |
154 | ||
155 | $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); | |
156 | $res = $download->processSingleImage(123, '/i.imgur.com/T9qgcHc.jpg', 'imgur.com/gallery/WxtWY'); | |
157 | ||
158 | $this->assertFalse($res, 'Absolute image can not be determined, so it will not be replaced'); | |
159 | } | |
160 | ||
161 | public function testProcessRealImage() | |
162 | { | |
163 | $client = new Client(); | |
164 | ||
165 | $mock = new Mock([ | |
166 | new Response(200, ['content-type' => null], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))), | |
167 | ]); | |
168 | ||
169 | $client->getEmitter()->attach($mock); | |
170 | ||
171 | $logHandler = new TestHandler(); | |
172 | $logger = new Logger('test', [$logHandler]); | |
173 | ||
174 | $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); | |
175 | ||
176 | $res = $download->processSingleImage( | |
177 | 123, | |
178 | 'https://cdn.theconversation.com/files/157200/article/width926/gsj2rjp2-1487348607.jpg', | |
179 | 'https://theconversation.com/conversation-avec-gerald-bronner-ce-nest-pas-la-post-verite-qui-nous-menace-mais-lextension-de-notre-credulite-73089' | |
180 | ); | |
181 | ||
182 | $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('DownloadImages: Checking extension (alternative)', $logHandler->getRecords()[3]['message']); | |
184 | } | |
185 | } |