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