expectException(\InvalidArgumentException::class); Role::approve([Role::TEAMER], Role::ADMIN); } public function testEffectiveRolesExcludeNominationsAndTheImplicitRoleUser(): void { $roles = [Role::USER, Role::TEAMER, Role::pending(Role::ADMIN)]; self::assertSame([Role::TEAMER], Role::effectiveOnly($roles)); self::assertSame([Role::pending(Role::ADMIN)], Role::pendingOnly($roles)); self::assertSame([Role::ADMIN => 'Administration'], Role::nominatedFrom($roles)); } public function testEmployeeIsGrantedOutrightAndDisplacesTheCustomerFallback(): void { // The claim does not come from the CRM, but it travels the same path as one. self::assertSame([Role::EMPLOYEE], Role::sync([], [Role::EMPLOYEE])); } public function testEmployeeIsRevokedOnceItIsNoLongerClaimed(): void { // Somebody whose address left the staff domain: no claim, so the role goes, and with no // effective role left the fallback returns. self::assertSame([Role::CUSTOMER], Role::sync([Role::EMPLOYEE], [])); } public function testEmployeeDoesNotShortCircuitTheNominationOfAnAdministrativeRole(): void { self::assertSame( [Role::EMPLOYEE, Role::pending(Role::ADMIN)], Role::sync([], [Role::EMPLOYEE, Role::ADMIN]), ); } public function testEmployeeAndTeamerCoexist(): void { self::assertSame( [Role::TEAMER, Role::EMPLOYEE], Role::sync([], [Role::TEAMER, Role::EMPLOYEE]), ); } public function testEveryRoleAndNominationHasALabel(): void { $labels = Role::labels(); foreach (Role::ALL as $role) { self::assertArrayHasKey($role, $labels); } foreach (Role::ADMINISTRATIVE as $role) { self::assertArrayHasKey(Role::pending($role), $labels); } } }