3 namespace Tests\Wallabag\CoreBundle\GuzzleSiteAuthenticator
;
5 use Graby\SiteConfig\SiteConfig
as GrabySiteConfig
;
6 use Monolog\Handler\TestHandler
;
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
;
13 class GrabySiteConfigBuilderTest
extends WallabagCoreTestCase
17 public function testBuildConfigExists()
19 $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
20 ->disableOriginalConstructor()
23 $grabySiteConfig = new GrabySiteConfig();
24 $grabySiteConfig->requires_login
= true;
25 $grabySiteConfig->login_uri
= 'http://api.example.com/login';
26 $grabySiteConfig->login_username_field
= 'login';
27 $grabySiteConfig->login_password_field
= 'password';
28 $grabySiteConfig->login_extra_fields
= ['field=value'];
29 $grabySiteConfig->not_logged_in_xpath
= '//div[@class="need-login"]';
31 $grabyConfigBuilderMock
32 ->method('buildForHost')
33 ->with('api.example.com')
34 ->willReturn($grabySiteConfig);
36 $logger = new Logger('foo');
37 $handler = new TestHandler();
38 $logger->pushHandler($handler);
40 $siteCrentialRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\SiteCredentialRepository')
41 ->disableOriginalConstructor()
43 $siteCrentialRepo->expects($this->once())
44 ->method('findOneByHostsAndUser')
45 ->with(['api.example.com', '.example.com'], 1)
46 ->willReturn(['username' => 'foo', 'password' => 'bar']);
48 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
49 ->disableOriginalConstructor()
51 $user->expects($this->once())
55 $token = new UsernamePasswordToken($user, 'pass', 'provider');
57 $tokenStorage = new TokenStorage();
58 $tokenStorage->setToken($token);
60 $builder = new GrabySiteConfigBuilder(
61 $grabyConfigBuilderMock,
67 $config = $builder->buildForHost('api.example.com');
69 $this->assertSame('api.example.com', $config->getHost());
70 $this->assertTrue($config->requiresLogin());
71 $this->assertSame('http://api.example.com/login', $config->getLoginUri());
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());
79 $records = $handler->getRecords();
81 $this->assertCount(1, $records, 'One log was recorded');
84 public function testBuildConfigDoesntExist()
86 $grabyConfigBuilderMock = $this->getMockBuilder('\Graby\SiteConfig\ConfigBuilder')
87 ->disableOriginalConstructor()
90 $grabyConfigBuilderMock
91 ->method('buildForHost')
93 ->willReturn(new GrabySiteConfig());
95 $logger = new Logger('foo');
96 $handler = new TestHandler();
97 $logger->pushHandler($handler);
99 $siteCrentialRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\SiteCredentialRepository')
100 ->disableOriginalConstructor()
102 $siteCrentialRepo->expects($this->once())
103 ->method('findOneByHostsAndUser')
104 ->with(['unknown.com', '.com'], 1)
107 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
108 ->disableOriginalConstructor()
110 $user->expects($this->once())
114 $token = new UsernamePasswordToken($user, 'pass', 'provider');
116 $tokenStorage = new TokenStorage();
117 $tokenStorage->setToken($token);
119 $builder = new GrabySiteConfigBuilder(
120 $grabyConfigBuilderMock,
126 $config = $builder->buildForHost('unknown.com');
128 $this->assertFalse($config);
130 $records = $handler->getRecords();
132 $this->assertCount(1, $records, 'One log was recorded');
135 public function testBuildConfigWithBadExtraFields()
137 $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
138 ->disableOriginalConstructor()
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"]';
149 $grabyConfigBuilderMock
150 ->method('buildForHost')
151 ->with('example.com')
152 ->willReturn($grabySiteConfig);
154 $logger = new Logger('foo');
155 $handler = new TestHandler();
156 $logger->pushHandler($handler);
158 $siteCrentialRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\SiteCredentialRepository')
159 ->disableOriginalConstructor()
161 $siteCrentialRepo->expects($this->once())
162 ->method('findOneByHostsAndUser')
163 ->with(['example.com', '.com'], 1)
164 ->willReturn(['username' => 'foo', 'password' => 'bar']);
166 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
167 ->disableOriginalConstructor()
169 $user->expects($this->once())
173 $token = new UsernamePasswordToken($user, 'pass', 'provider');
175 $tokenStorage = new TokenStorage();
176 $tokenStorage->setToken($token);
178 $this->builder
= new GrabySiteConfigBuilder(
179 $grabyConfigBuilderMock,
185 $config = $this->builder
->buildForHost('www.example.com');
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());
197 $records = $handler->getRecords();
199 $this->assertCount(1, $records, 'One log was recorded');
202 public function testBuildConfigUserNotDefined()
204 $grabyConfigBuilderMock = $this->getMockBuilder('\Graby\SiteConfig\ConfigBuilder')
205 ->disableOriginalConstructor()
208 $grabyConfigBuilderMock
209 ->method('buildForHost')
210 ->with('unknown.com')
211 ->willReturn(new GrabySiteConfig());
213 $logger = new Logger('foo');
214 $handler = new TestHandler();
215 $logger->pushHandler($handler);
217 $siteCrentialRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\SiteCredentialRepository')
218 ->disableOriginalConstructor()
221 $tokenStorage = new TokenStorage();
223 $builder = new GrabySiteConfigBuilder(
224 $grabyConfigBuilderMock,
230 $config = $builder->buildForHost('unknown.com');
232 $this->assertFalse($config);
235 public function dataProviderCredentials()
239 'host' => 'example.com',
242 'host' => 'other.example.com',
245 'host' => 'paywall.example.com',
246 'expectedUsername' => 'paywall.example',
247 'expectedPassword' => 'bar',
250 'host' => 'api.super.com',
251 'expectedUsername' => '.super',
252 'expectedPassword' => 'bar',
255 'host' => '.super.com',
256 'expectedUsername' => '.super',
257 'expectedPassword' => 'bar',
263 * @dataProvider dataProviderCredentials
265 public function testBuildConfigWithDbAccess($host, $expectedUsername = null, $expectedPassword = null)
267 $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
268 ->disableOriginalConstructor()
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"]';
279 $grabyConfigBuilderMock
280 ->method('buildForHost')
282 ->willReturn($grabySiteConfig);
284 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
285 ->disableOriginalConstructor()
287 $user->expects($this->once())
291 $token = new UsernamePasswordToken($user, 'pass', 'provider');
293 $tokenStorage = new TokenStorage();
294 $tokenStorage->setToken($token);
296 $logger = new Logger('foo');
297 $handler = new TestHandler();
298 $logger->pushHandler($handler);
300 $builder = new GrabySiteConfigBuilder(
301 $grabyConfigBuilderMock,
303 $this->getClient()->getContainer()->get('wallabag_core.site_credential_repository'),
307 $config = $builder->buildForHost($host);
309 if (null === $expectedUsername && null === $expectedPassword) {
310 $this->assertFalse($config);
315 $this->assertSame($expectedUsername, $config->getUsername());
316 $this->assertSame($expectedPassword, $config->getPassword());