Skip to content

Commit 50f1abe

Browse files
committed
Add symfony 5.3 build matrix and refactor tests to test against real implementations
1 parent 04d6fad commit 50f1abe

File tree

2 files changed

+47
-98
lines changed

2 files changed

+47
-98
lines changed

.github/workflows/ci.yml

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,21 @@ on:
77

88
jobs:
99
test:
10-
name: 'Test ${{ matrix.deps }} on PHP ${{ matrix.php }}'
10+
name: 'Test ${{ matrix.deps }}${{ matrix.symfony }} on PHP ${{ matrix.php }}'
1111
runs-on: ubuntu-latest
1212

1313
strategy:
1414
fail-fast: false
1515
matrix:
1616
php: ['7.2.5', '7.3', '7.4', '8.0', '8.1']
17+
symfony: ['']
1718
include:
1819
- php: '7.4'
1920
deps: lowest
2021
deprecations: max[self]=0
22+
composer-flags: '--prefer-lowest'
23+
- php: '7.4'
24+
symfony: '5.3.*'
2125
- php: '8.0'
2226
deps: highest
2327

@@ -29,16 +33,27 @@ jobs:
2933
uses: shivammathur/setup-php@v2
3034
with:
3135
php-version: '${{ matrix.php }}'
36+
tools: 'flex'
3237
coverage: none
3338

39+
- name: Get Composer Cache Directory
40+
id: composer-cache
41+
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
42+
43+
- uses: actions/cache@v2
44+
with:
45+
path: ${{ steps.composer-cache.outputs.dir }}
46+
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
47+
restore-keys: ${{ runner.os }}-composer-
48+
3449
- name: Configure composer
3550
if: "${{ matrix.deps == 'highest' }}"
3651
run: composer config minimum-stability dev
3752

38-
- name: Composer install
39-
uses: ramsey/composer-install@v1
40-
with:
41-
dependency-versions: '${{ matrix.deps }}'
53+
- name: Install Composer Dependencies
54+
run: composer update --prefer-dist --no-progress ${{ matrix.composer-flags }}
55+
env:
56+
SYMFONY_REQUIRE: '${{ matrix.symfony }}'
4257

4358
- name: Install PHPUnit
4459
run: vendor/bin/simple-phpunit install

Tests/Domain/SecurityIdentityRetrievalStrategyTest.php

Lines changed: 27 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,16 @@
1616
use Symfony\Component\Security\Acl\Domain\SecurityIdentityRetrievalStrategy;
1717
use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
1818
use Symfony\Component\Security\Acl\Tests\Fixtures\Account;
19+
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver;
1920
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverInterface;
2021
use Symfony\Component\Security\Core\Authentication\Token\AbstractToken;
2122
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
2223
use Symfony\Component\Security\Core\Authentication\Token\NullToken;
24+
use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
25+
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
26+
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
2327
use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;
28+
use Symfony\Component\Security\Core\Authorization\Voter\CacheableVoterInterface;
2429
use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
2530
use Symfony\Component\Security\Core\User\UserInterface;
2631

@@ -31,33 +36,12 @@ class SecurityIdentityRetrievalStrategyTest extends TestCase
3136
*/
3237
public function testGetSecurityIdentities($user, array $roles, string $authenticationStatus, array $sids)
3338
{
34-
$token = class_exists(NullToken::class) ? new NullToken() : new AnonymousToken('', '');
35-
if ('anonymous' !== $authenticationStatus) {
36-
$class = '';
37-
if (\is_string($user)) {
38-
$class = 'MyCustomTokenImpl';
39-
}
40-
41-
$token = $this->getMockBuilder(AbstractToken::class)
42-
->setMockClassName($class)
43-
->getMock();
44-
45-
$token
46-
->expects($this->once())
47-
->method('getRoleNames')
48-
->willReturn(['foo'])
49-
;
50-
51-
$token
52-
->expects($this->once())
53-
->method('getUser')
54-
->willReturn($user)
55-
;
56-
}
57-
39+
$token = $this->getToken($user, $authenticationStatus, $roles);
5840
$strategy = $this->getStrategy($roles, $authenticationStatus);
5941
$extractedSids = $strategy->getSecurityIdentities($token);
6042

43+
$this->assertEquals($sids, $extractedSids);
44+
6145
foreach ($extractedSids as $index => $extractedSid) {
6246
if (!isset($sids[$index])) {
6347
$this->fail(sprintf('Expected SID at index %d, but there was none.', $index));
@@ -97,26 +81,25 @@ public function testDeprecatedGetSecurityIdentities($user, array $roles, string
9781
$strategy = $this->getStrategy($roles, $authenticationStatus);
9882

9983
$token
100-
->expects($this->once())
10184
->method('getRoleNames')
10285
->willReturn(['foo'])
10386
;
10487

10588
if ('anonymous' === $authenticationStatus) {
10689
$token
107-
->expects($this->never())
10890
->method('getUser')
10991
;
11092
} else {
11193
$token
112-
->expects($this->once())
11394
->method('getUser')
11495
->willReturn($user)
11596
;
11697
}
11798

11899
$extractedSids = $strategy->getSecurityIdentities($token);
119100

101+
$this->assertEquals($sids, $extractedSids);
102+
120103
foreach ($extractedSids as $index => $extractedSid) {
121104
if (!isset($sids[$index])) {
122105
$this->fail(sprintf('Expected SID at index %d, but there was none.', $index));
@@ -143,7 +126,7 @@ public function getSecurityIdentityRetrievalTests(): array
143126
new RoleSecurityIdentity('IS_AUTHENTICATED_FULLY'),
144127
new RoleSecurityIdentity('IS_AUTHENTICATED_REMEMBERED'),
145128
], $anonymousRoles)],
146-
[new CustomUserImpl('johannes'), ['ROLE_FOO'], 'fullFledged', array_merge([
129+
[new CustomUserImpl('johannes', ['ROLE_FOO']), ['ROLE_FOO'], 'fullFledged', array_merge([
147130
new UserSecurityIdentity('johannes', CustomUserImpl::class),
148131
new RoleSecurityIdentity('ROLE_FOO'),
149132
new RoleSecurityIdentity('IS_AUTHENTICATED_FULLY'),
@@ -194,83 +177,34 @@ public function getReachableRoleNames(array $roles): array
194177
}
195178
};
196179

197-
$trustResolverMockBuild = $this->getMockBuilder(AuthenticationTrustResolverInterface::class);
198-
if (\defined('\Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter::PUBLIC_ACCESS')) {
199-
if (method_exists(AuthenticationTrustResolverInterface::class, 'isAuthenticated')) {
200-
$trustResolver = $trustResolverMockBuild->getMock();
201-
} else {
202-
$trustResolver = $trustResolverMockBuild
203-
->onlyMethods(['isAnonymous', 'isRememberMe', 'isFullFledged'])
204-
->addMethods(['isAuthenticated'])
205-
->getMock()
206-
;
207-
}
208-
$trustResolver
209-
->method('isAuthenticated')
210-
->willReturn('anonymous' !== $authenticationStatus);
211-
} else {
212-
$trustResolver = $trustResolverMockBuild->getMock();
213-
$trustResolver
214-
->method('isAnonymous')
215-
->willReturn('anonymous' === $authenticationStatus);
216-
}
180+
return new SecurityIdentityRetrievalStrategy($roleHierarchy, new AuthenticationTrustResolver());
181+
}
217182

218-
if ('fullFledged' === $authenticationStatus) {
219-
$trustResolver
220-
->expects($this->once())
221-
->method('isFullFledged')
222-
->willReturn(true)
223-
;
224-
$trustResolver
225-
->expects($this->never())
226-
->method('isRememberMe')
227-
;
228-
} elseif ('rememberMe' === $authenticationStatus) {
229-
$trustResolver
230-
->expects($this->once())
231-
->method('isFullFledged')
232-
->willReturn(false)
233-
;
234-
$trustResolver
235-
->expects($this->once())
236-
->method('isRememberMe')
237-
->willReturn(true)
238-
;
239-
} else {
240-
if (method_exists(AuthenticationTrustResolverInterface::class, 'isAuthenticated')) {
241-
$trustResolver
242-
->method('isAuthenticated')
243-
->willReturn(false)
244-
;
245-
} else {
246-
$trustResolver
247-
->method('isAnonymous')
248-
->willReturn(true);
249-
}
183+
private function getToken($user, string $authenticationStatus, array $roles): TokenInterface
184+
{
185+
if ('anonymous' === $authenticationStatus) {
186+
return class_exists(NullToken::class) ? new NullToken() : new AnonymousToken('', '');
187+
}
250188

251-
$trustResolver
252-
->expects($this->once())
253-
->method('isFullFledged')
254-
->willReturn(false)
255-
;
256-
$trustResolver
257-
->expects($this->once())
258-
->method('isRememberMe')
259-
->willReturn(false)
260-
;
189+
if ('rememberMe' === $authenticationStatus) {
190+
return new RememberMeToken($user, 'main', 'secret');
261191
}
262192

263-
return new SecurityIdentityRetrievalStrategy($roleHierarchy, $trustResolver);
193+
$args = interface_exists(CacheableVoterInterface::class) ? [$user, 'main', $roles] : [$user, 'password', 'main', $roles];
194+
195+
return new UsernamePasswordToken(...$args);
264196
}
265197
}
266198

267199
class CustomUserImpl implements UserInterface
268200
{
269201
protected $name;
202+
protected $roles = [];
270203

271-
public function __construct($name)
204+
public function __construct($name, $roles)
272205
{
273206
$this->name = $name;
207+
$this->roles = $roles;
274208
}
275209

276210
public function __toString()
@@ -280,7 +214,7 @@ public function __toString()
280214

281215
public function getRoles(): array
282216
{
283-
return [];
217+
return $this->roles;
284218
}
285219

286220
public function eraseCredentials()

0 commit comments

Comments
 (0)