]> git.immae.eu Git - github/wallabag/wallabag.git/blob - tests/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilderTest.php
Merge remote-tracking branch 'origin/master' into 2.4
[github/wallabag/wallabag.git] / tests / Wallabag / CoreBundle / GuzzleSiteAuthenticator / GrabySiteConfigBuilderTest.php
1 <?php
2
3 namespace Tests\Wallabag\CoreBundle\GuzzleSiteAuthenticator;
4
5 use Graby\SiteConfig\SiteConfig as GrabySiteConfig;
6 use Monolog\Handler\TestHandler;
7 use Monolog\Logger;
8 use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
9 use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
10 use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
11 use Wallabag\CoreBundle\GuzzleSiteAuthenticator\GrabySiteConfigBuilder;
12
13 class GrabySiteConfigBuilderTest extends WallabagCoreTestCase
14 {
15 public function testBuildConfigExists()
16 {
17 $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
18 ->disableOriginalConstructor()
19 ->getMock();
20
21 $grabySiteConfig = new GrabySiteConfig();
22 $grabySiteConfig->requires_login = true;
23 $grabySiteConfig->login_uri = 'http://api.example.com/login';
24 $grabySiteConfig->login_username_field = 'login';
25 $grabySiteConfig->login_password_field = 'password';
26 $grabySiteConfig->login_extra_fields = ['field=value'];
27 $grabySiteConfig->not_logged_in_xpath = '//div[@class="need-login"]';
28
29 $grabyConfigBuilderMock
30 ->method('buildForHost')
31 ->with('api.example.com')
32 ->willReturn($grabySiteConfig);
33
34 $logger = new Logger('foo');
35 $handler = new TestHandler();
36 $logger->pushHandler($handler);
37
38 $siteCrentialRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\SiteCredentialRepository')
39 ->disableOriginalConstructor()
40 ->getMock();
41 $siteCrentialRepo->expects($this->once())
42 ->method('findOneByHostsAndUser')
43 ->with(['api.example.com', '.example.com'], 1)
44 ->willReturn(['username' => 'foo', 'password' => 'bar']);
45
46 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
47 ->disableOriginalConstructor()
48 ->getMock();
49 $user->expects($this->once())
50 ->method('getId')
51 ->willReturn(1);
52
53 $token = new UsernamePasswordToken($user, 'pass', 'provider');
54
55 $tokenStorage = new TokenStorage();
56 $tokenStorage->setToken($token);
57
58 $builder = new GrabySiteConfigBuilder(
59 $grabyConfigBuilderMock,
60 $tokenStorage,
61 $siteCrentialRepo,
62 $logger
63 );
64
65 $config = $builder->buildForHost('api.example.com');
66
67 $this->assertSame('api.example.com', $config->getHost());
68 $this->assertTrue($config->requiresLogin());
69 $this->assertSame('http://api.example.com/login', $config->getLoginUri());
70 $this->assertSame('login', $config->getUsernameField());
71 $this->assertSame('password', $config->getPasswordField());
72 $this->assertSame(['field' => 'value'], $config->getExtraFields());
73 $this->assertSame('//div[@class="need-login"]', $config->getNotLoggedInXpath());
74 $this->assertSame('foo', $config->getUsername());
75 $this->assertSame('bar', $config->getPassword());
76
77 $records = $handler->getRecords();
78
79 $this->assertCount(1, $records, 'One log was recorded');
80 }
81
82 public function testBuildConfigDoesntExist()
83 {
84 $grabyConfigBuilderMock = $this->getMockBuilder('\Graby\SiteConfig\ConfigBuilder')
85 ->disableOriginalConstructor()
86 ->getMock();
87
88 $grabyConfigBuilderMock
89 ->method('buildForHost')
90 ->with('unknown.com')
91 ->willReturn(new GrabySiteConfig());
92
93 $logger = new Logger('foo');
94 $handler = new TestHandler();
95 $logger->pushHandler($handler);
96
97 $siteCrentialRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\SiteCredentialRepository')
98 ->disableOriginalConstructor()
99 ->getMock();
100 $siteCrentialRepo->expects($this->once())
101 ->method('findOneByHostsAndUser')
102 ->with(['unknown.com', '.com'], 1)
103 ->willReturn(null);
104
105 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
106 ->disableOriginalConstructor()
107 ->getMock();
108 $user->expects($this->once())
109 ->method('getId')
110 ->willReturn(1);
111
112 $token = new UsernamePasswordToken($user, 'pass', 'provider');
113
114 $tokenStorage = new TokenStorage();
115 $tokenStorage->setToken($token);
116
117 $builder = new GrabySiteConfigBuilder(
118 $grabyConfigBuilderMock,
119 $tokenStorage,
120 $siteCrentialRepo,
121 $logger
122 );
123
124 $config = $builder->buildForHost('unknown.com');
125
126 $this->assertFalse($config);
127
128 $records = $handler->getRecords();
129
130 $this->assertCount(1, $records, 'One log was recorded');
131 }
132
133 public function testBuildConfigWithBadExtraFields()
134 {
135 $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
136 ->disableOriginalConstructor()
137 ->getMock();
138
139 $grabySiteConfig = new GrabySiteConfig();
140 $grabySiteConfig->requires_login = true;
141 $grabySiteConfig->login_uri = 'http://www.example.com/login';
142 $grabySiteConfig->login_username_field = 'login';
143 $grabySiteConfig->login_password_field = 'password';
144 $grabySiteConfig->login_extra_fields = ['field'];
145 $grabySiteConfig->not_logged_in_xpath = '//div[@class="need-login"]';
146
147 $grabyConfigBuilderMock
148 ->method('buildForHost')
149 ->with('example.com')
150 ->willReturn($grabySiteConfig);
151
152 $logger = new Logger('foo');
153 $handler = new TestHandler();
154 $logger->pushHandler($handler);
155
156 $siteCrentialRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\SiteCredentialRepository')
157 ->disableOriginalConstructor()
158 ->getMock();
159 $siteCrentialRepo->expects($this->once())
160 ->method('findOneByHostAndUser')
161 ->with('example.com', 1)
162 ->willReturn(['username' => 'foo', 'password' => 'bar']);
163
164 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
165 ->disableOriginalConstructor()
166 ->getMock();
167 $user->expects($this->once())
168 ->method('getId')
169 ->willReturn(1);
170
171 $token = new UsernamePasswordToken($user, 'pass', 'provider');
172
173 $tokenStorage = new TokenStorage();
174 $tokenStorage->setToken($token);
175
176 $this->builder = new GrabySiteConfigBuilder(
177 $grabyConfigBuilderMock,
178 $tokenStorage,
179 $siteCrentialRepo,
180 $logger
181 );
182
183 $config = $this->builder->buildForHost('www.example.com');
184
185 $this->assertSame('example.com', $config->getHost());
186 $this->assertTrue($config->requiresLogin());
187 $this->assertSame('http://www.example.com/login', $config->getLoginUri());
188 $this->assertSame('login', $config->getUsernameField());
189 $this->assertSame('password', $config->getPasswordField());
190 $this->assertSame([], $config->getExtraFields());
191 $this->assertSame('//div[@class="need-login"]', $config->getNotLoggedInXpath());
192 $this->assertSame('foo', $config->getUsername());
193 $this->assertSame('bar', $config->getPassword());
194
195 $records = $handler->getRecords();
196
197 $this->assertCount(1, $records, 'One log was recorded');
198 }
199
200 public function testBuildConfigUserNotDefined()
201 {
202 $grabyConfigBuilderMock = $this->getMockBuilder('\Graby\SiteConfig\ConfigBuilder')
203 ->disableOriginalConstructor()
204 ->getMock();
205
206 $grabyConfigBuilderMock
207 ->method('buildForHost')
208 ->with('unknown.com')
209 ->willReturn(new GrabySiteConfig());
210
211 $logger = new Logger('foo');
212 $handler = new TestHandler();
213 $logger->pushHandler($handler);
214
215 $siteCrentialRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\SiteCredentialRepository')
216 ->disableOriginalConstructor()
217 ->getMock();
218
219 $tokenStorage = new TokenStorage();
220
221 $builder = new GrabySiteConfigBuilder(
222 $grabyConfigBuilderMock,
223 $tokenStorage,
224 $siteCrentialRepo,
225 $logger
226 );
227
228 $config = $builder->buildForHost('unknown.com');
229
230 $this->assertFalse($config);
231 }
232
233 public function dataProviderCredentials()
234 {
235 return [
236 [
237 'host' => 'example.com',
238 ],
239 [
240 'host' => 'other.example.com',
241 ],
242 [
243 'host' => 'paywall.example.com',
244 'expectedUsername' => 'paywall.example',
245 'expectedPassword' => 'bar',
246 ],
247 [
248 'host' => 'api.super.com',
249 'expectedUsername' => '.super',
250 'expectedPassword' => 'bar',
251 ],
252 [
253 'host' => '.super.com',
254 'expectedUsername' => '.super',
255 'expectedPassword' => 'bar',
256 ],
257 ];
258 }
259
260 /**
261 * @dataProvider dataProviderCredentials
262 */
263 public function testBuildConfigWithDbAccess($host, $expectedUsername = null, $expectedPassword = null)
264 {
265 $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
266 ->disableOriginalConstructor()
267 ->getMock();
268
269 $grabySiteConfig = new GrabySiteConfig();
270 $grabySiteConfig->requires_login = true;
271 $grabySiteConfig->login_uri = 'http://api.example.com/login';
272 $grabySiteConfig->login_username_field = 'login';
273 $grabySiteConfig->login_password_field = 'password';
274 $grabySiteConfig->login_extra_fields = ['field=value'];
275 $grabySiteConfig->not_logged_in_xpath = '//div[@class="need-login"]';
276
277 $grabyConfigBuilderMock
278 ->method('buildForHost')
279 ->with($host)
280 ->willReturn($grabySiteConfig);
281
282 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
283 ->disableOriginalConstructor()
284 ->getMock();
285 $user->expects($this->once())
286 ->method('getId')
287 ->willReturn(1);
288
289 $token = new UsernamePasswordToken($user, 'pass', 'provider');
290
291 $tokenStorage = new TokenStorage();
292 $tokenStorage->setToken($token);
293
294 $logger = new Logger('foo');
295 $handler = new TestHandler();
296 $logger->pushHandler($handler);
297
298 $builder = new GrabySiteConfigBuilder(
299 $grabyConfigBuilderMock,
300 $tokenStorage,
301 $this->getClient()->getContainer()->get('wallabag_core.site_credential_repository'),
302 $logger
303 );
304
305 $config = $builder->buildForHost($host);
306
307 if (null === $expectedUsername && null === $expectedPassword) {
308 $this->assertFalse($config);
309
310 return;
311 }
312
313 $this->assertSame($expectedUsername, $config->getUsername());
314 $this->assertSame($expectedPassword, $config->getPassword());
315 }
316 }