]>
Commit | Line | Data |
---|---|---|
4cf3564d A |
1 | <?php |
2 | ||
3 | declare(strict_types=1); | |
4 | ||
5 | namespace Shaarli\Http; | |
6 | ||
7 | use PHPUnit\Framework\TestCase; | |
8 | use Shaarli\Config\ConfigManager; | |
9 | ||
10 | class MetadataRetrieverTest extends TestCase | |
11 | { | |
12 | /** @var MetadataRetriever */ | |
13 | protected $retriever; | |
14 | ||
15 | /** @var ConfigManager */ | |
16 | protected $conf; | |
17 | ||
18 | /** @var HttpAccess */ | |
19 | protected $httpAccess; | |
20 | ||
21 | public function setUp(): void | |
22 | { | |
23 | $this->conf = $this->createMock(ConfigManager::class); | |
24 | $this->httpAccess = $this->createMock(HttpAccess::class); | |
25 | $this->retriever = new MetadataRetriever($this->conf, $this->httpAccess); | |
26 | ||
27 | $this->conf->method('get')->willReturnCallback(function (string $param, $default) { | |
28 | return $default === null ? $param : $default; | |
29 | }); | |
30 | } | |
31 | ||
32 | /** | |
33 | * Test metadata retrieve() with values returned | |
34 | */ | |
35 | public function testFullRetrieval(): void | |
36 | { | |
37 | $url = 'https://domain.tld/link'; | |
38 | $remoteTitle = 'Remote Title '; | |
39 | $remoteDesc = 'Sometimes the meta description is relevant.'; | |
40 | $remoteTags = 'abc def'; | |
5334090b | 41 | $remoteCharset = 'utf-8'; |
4cf3564d A |
42 | |
43 | $expectedResult = [ | |
44 | 'title' => $remoteTitle, | |
45 | 'description' => $remoteDesc, | |
46 | 'tags' => $remoteTags, | |
47 | ]; | |
48 | ||
5334090b A |
49 | $this->httpAccess |
50 | ->expects(static::once()) | |
51 | ->method('getCurlHeaderCallback') | |
52 | ->willReturnCallback( | |
53 | function (&$charset) use ( | |
54 | $remoteCharset | |
55 | ): callable { | |
56 | return function () use ( | |
57 | &$charset, | |
58 | $remoteCharset | |
59 | ): void { | |
60 | $charset = $remoteCharset; | |
61 | }; | |
62 | } | |
63 | ) | |
64 | ; | |
4cf3564d A |
65 | $this->httpAccess |
66 | ->expects(static::once()) | |
67 | ->method('getCurlDownloadCallback') | |
68 | ->willReturnCallback( | |
69 | function (&$charset, &$title, &$description, &$tags) use ( | |
5334090b | 70 | $remoteCharset, |
4cf3564d A |
71 | $remoteTitle, |
72 | $remoteDesc, | |
73 | $remoteTags | |
74 | ): callable { | |
75 | return function () use ( | |
76 | &$charset, | |
77 | &$title, | |
78 | &$description, | |
79 | &$tags, | |
5334090b | 80 | $remoteCharset, |
4cf3564d A |
81 | $remoteTitle, |
82 | $remoteDesc, | |
83 | $remoteTags | |
84 | ): void { | |
5334090b A |
85 | static::assertSame($remoteCharset, $charset); |
86 | ||
4cf3564d A |
87 | $title = $remoteTitle; |
88 | $description = $remoteDesc; | |
89 | $tags = $remoteTags; | |
90 | }; | |
91 | } | |
92 | ) | |
93 | ; | |
94 | $this->httpAccess | |
95 | ->expects(static::once()) | |
96 | ->method('getHttpResponse') | |
97 | ->with($url, 30, 4194304) | |
5334090b A |
98 | ->willReturnCallback(function($url, $timeout, $maxBytes, $headerCallback, $dlCallback): void { |
99 | $headerCallback(); | |
100 | $dlCallback(); | |
4cf3564d A |
101 | }) |
102 | ; | |
103 | ||
104 | $result = $this->retriever->retrieve($url); | |
105 | ||
106 | static::assertSame($expectedResult, $result); | |
107 | } | |
108 | ||
109 | /** | |
110 | * Test metadata retrieve() without any value | |
111 | */ | |
112 | public function testEmptyRetrieval(): void | |
113 | { | |
114 | $url = 'https://domain.tld/link'; | |
115 | ||
116 | $expectedResult = [ | |
117 | 'title' => null, | |
118 | 'description' => null, | |
119 | 'tags' => null, | |
120 | ]; | |
121 | ||
122 | $this->httpAccess | |
123 | ->expects(static::once()) | |
124 | ->method('getCurlDownloadCallback') | |
125 | ->willReturnCallback( | |
5334090b A |
126 | function (): callable { |
127 | return function (): void {}; | |
128 | } | |
129 | ) | |
130 | ; | |
131 | $this->httpAccess | |
132 | ->expects(static::once()) | |
133 | ->method('getCurlHeaderCallback') | |
134 | ->willReturnCallback( | |
135 | function (): callable { | |
136 | return function (): void {}; | |
4cf3564d A |
137 | } |
138 | ) | |
139 | ; | |
140 | $this->httpAccess | |
141 | ->expects(static::once()) | |
142 | ->method('getHttpResponse') | |
143 | ->with($url, 30, 4194304) | |
5334090b A |
144 | ->willReturnCallback(function($url, $timeout, $maxBytes, $headerCallback, $dlCallback): void { |
145 | $headerCallback(); | |
146 | $dlCallback(); | |
4cf3564d A |
147 | }) |
148 | ; | |
149 | ||
150 | $result = $this->retriever->retrieve($url); | |
151 | ||
152 | static::assertSame($expectedResult, $result); | |
153 | } | |
154 | } |