feat: bpn as single source of truth for role and hotel code assignments
This commit is contained in:
@@ -38,7 +38,7 @@ class BpnAuthenticatorTest extends TestCase
|
||||
{
|
||||
$this->stubApiClient($this->createCrmAttributes());
|
||||
|
||||
$this->userDataHandler->method('collectRoles')->willReturn([]);
|
||||
$this->userDataHandler->method('collectClaimedRoles')->willReturn([]);
|
||||
$this->userDataHandler->method('findLocalUser')->willReturn(null);
|
||||
|
||||
$this->userDataHandler->expects($this->never())->method('createLocalUser');
|
||||
@@ -55,7 +55,7 @@ class BpnAuthenticatorTest extends TestCase
|
||||
|
||||
$this->stubApiClient($this->createCrmAttributes());
|
||||
|
||||
$this->userDataHandler->method('collectRoles')->willReturn([]);
|
||||
$this->userDataHandler->method('collectClaimedRoles')->willReturn([]);
|
||||
$this->userDataHandler->method('findLocalUser')->willReturn($user);
|
||||
|
||||
$this->userDataHandler->expects($this->never())->method('updateLocalUser');
|
||||
@@ -69,6 +69,11 @@ class BpnAuthenticatorTest extends TestCase
|
||||
$this->assertSame($user, $this->loadUser());
|
||||
}
|
||||
|
||||
/**
|
||||
* This guard is what stands between a degraded response and a mass revocation: with the
|
||||
* roles led by the CRM, a login that reached updateLocalUser() on an empty payload would
|
||||
* strip every role of every user logging in, one at a time.
|
||||
*/
|
||||
public function testResponseWithoutAttributeGroupsRefusesTheLoginWithoutBlocking(): void
|
||||
{
|
||||
$user = (new User())->setRoles(['ROLE_ADMIN']);
|
||||
@@ -76,14 +81,19 @@ class BpnAuthenticatorTest extends TestCase
|
||||
// an empty payload carries no roles either and must not read as a revocation
|
||||
$this->stubApiClient(new CrmAttributesResponse());
|
||||
|
||||
$this->userDataHandler->method('collectRoles')->willReturn([]);
|
||||
$this->userDataHandler->method('collectClaimedRoles')->willReturn([]);
|
||||
$this->userDataHandler->method('findLocalUser')->willReturn($user);
|
||||
|
||||
$this->userDataHandler->expects($this->never())->method('disableForRevokedCrmRoles');
|
||||
$this->userDataHandler->expects($this->never())->method('updateLocalUser');
|
||||
|
||||
$this->expectException(UserNotFoundException::class);
|
||||
try {
|
||||
$this->loadUser();
|
||||
$this->fail('Expected the login to be refused');
|
||||
} catch (UserNotFoundException) {
|
||||
}
|
||||
|
||||
$this->loadUser();
|
||||
$this->assertSame(['ROLE_ADMIN'], $user->getAssignedRoles());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -97,7 +107,7 @@ class BpnAuthenticatorTest extends TestCase
|
||||
|
||||
$this->stubApiClient($this->createCrmAttributes());
|
||||
|
||||
$this->userDataHandler->method('collectRoles')->willReturn(['ROLE_TEAMER']);
|
||||
$this->userDataHandler->method('collectClaimedRoles')->willReturn(['ROLE_TEAMER']);
|
||||
$this->userDataHandler->method('findLocalUser')->willReturn($user);
|
||||
|
||||
$this->userDataHandler->expects($this->never())->method('updateLocalUser');
|
||||
@@ -115,7 +125,7 @@ class BpnAuthenticatorTest extends TestCase
|
||||
|
||||
$this->stubApiClient($this->createCrmAttributes());
|
||||
|
||||
$this->userDataHandler->method('collectRoles')->willReturn([]);
|
||||
$this->userDataHandler->method('collectClaimedRoles')->willReturn([]);
|
||||
$this->userDataHandler->method('findLocalUser')->willReturn($user);
|
||||
|
||||
$this->userDataHandler->expects($this->never())->method('disableForRevokedCrmRoles');
|
||||
|
||||
@@ -110,9 +110,10 @@ class MyEpAuthenticatorTest extends TestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* A super admin's manual demotion has to survive the user's next SSO login.
|
||||
* A claimed administrative role is marked for approval, never granted - not even when
|
||||
* the identity provider reports it outright.
|
||||
*/
|
||||
public function testExistingGrantedRolesAreNeverOverwritten(): void
|
||||
public function testClaimedAdministrativeRolesAreNeverGrantedOnLogin(): void
|
||||
{
|
||||
$user = (new User())->setEmail('[email protected]')->setRoles(['ROLE_TEAMER']);
|
||||
$this->repository->method('findOneBy')->willReturn($user);
|
||||
@@ -130,7 +131,7 @@ class MyEpAuthenticatorTest extends TestCase
|
||||
/**
|
||||
* An already approved role must not be demoted back to a marker on the next login.
|
||||
*/
|
||||
public function testAnAlreadyGrantedAdministrativeRoleIsKept(): void
|
||||
public function testAnAlreadyGrantedAdministrativeRoleIsKeptWhileStillClaimed(): void
|
||||
{
|
||||
$user = (new User())->setEmail('[email protected]')->setRoles(['ROLE_ADMIN', 'ROLE_TEAMER']);
|
||||
$this->repository->method('findOneBy')->willReturn($user);
|
||||
@@ -141,6 +142,32 @@ class MyEpAuthenticatorTest extends TestCase
|
||||
$this->assertSame([], $user->getPendingRoles());
|
||||
}
|
||||
|
||||
/**
|
||||
* MyE&P leads exactly as BusPro does: a role it stops reporting is withdrawn on the
|
||||
* next login, and the hotel codes are re-imported with it.
|
||||
*/
|
||||
public function testGrantedRolesNoLongerClaimedAreRevoked(): void
|
||||
{
|
||||
$user = (new User())
|
||||
->setEmail('[email protected]')
|
||||
->setRoles(['ROLE_ADMIN', 'ROLE_TEAMER'])
|
||||
->setSuperAdmin(true)
|
||||
->setHotelCodes(['SSL'])
|
||||
;
|
||||
$this->repository->method('findOneBy')->willReturn($user);
|
||||
|
||||
$this->loadUser($this->createUserinfo(['ROLE_TEAMER']));
|
||||
|
||||
$this->assertSame(['ROLE_TEAMER'], $user->getAssignedRoles());
|
||||
$this->assertSame([], $user->getPendingRoles());
|
||||
|
||||
// the flag would otherwise outlive the role it depends on
|
||||
$this->assertFalse($user->isSuperAdmin());
|
||||
$this->assertNotContains('ROLE_SUPER_ADMIN', $user->getRoles());
|
||||
|
||||
$this->assertSame(['HOTEL'], $user->getHotelCodes());
|
||||
}
|
||||
|
||||
public function testTeamerRoleIsGrantedToAnExistingUser(): void
|
||||
{
|
||||
$user = (new User())->setEmail('[email protected]')->setRoles([User::PENDING_ROLES['ROLE_MANAGER']]);
|
||||
|
||||
Reference in New Issue
Block a user