Release 1.0.1: normalized userinfo and callback helper

This commit is contained in:
Andy Dixon
2026-02-26 09:07:11 +00:00
parent 1c7b7b6717
commit 94c85fc8d5
12 changed files with 403 additions and 45 deletions
+60
View File
@@ -147,4 +147,64 @@ final class AuthClientTest extends TestCase
$this->expectExceptionMessage('UserInfo endpoint error (401)');
$this->client->getUserInfo('expired-token');
}
public function testGetNormalizedUserInfoReturnsCanonicalFields(): void
{
$this->http->queueGet([
'status' => 200,
'body' => '{"email":"Admin@Example.com","claims":{"role":"admin"}}',
]);
$user = $this->client->getNormalizedUserInfo('access-4');
self::assertSame('admin@example.com', $user->email);
self::assertSame(1, $user->privilegeLevel);
self::assertSame('admin', $user->role);
}
public function testResolvePrivilegeLevelSupportsAliases(): void
{
self::assertSame(1, AuthClient::resolvePrivilegeLevel(['privilege_level' => 1]));
self::assertSame(2, AuthClient::resolvePrivilegeLevel(['claims' => ['role_level' => '2']]));
self::assertSame(1, AuthClient::resolvePrivilegeLevel(['role' => 'superadmin']));
self::assertSame(2, AuthClient::resolvePrivilegeLevel(['role' => 'tutor']));
self::assertNull(AuthClient::resolvePrivilegeLevel(['foo' => 'bar']));
}
public function testHandleCallbackReturnsCallbackResult(): void
{
$_SESSION['blackwall_oauth_state'] = 'state-1';
$_SESSION['blackwall_oauth_code_verifier'] = 'verifier-123';
$this->http->queuePost([
'status' => 200,
'body' => json_encode([
'access_token' => 'access-1',
'refresh_token' => 'refresh-1',
'token_type' => 'Bearer',
], JSON_THROW_ON_ERROR),
]);
$this->http->queueGet([
'status' => 200,
'body' => '{"email":"tutor@example.com","privilege_level":2}',
]);
$result = $this->client->handleCallback([
'code' => 'code-1',
'state' => 'state-1',
]);
self::assertSame('access-1', $result->tokens->accessToken);
self::assertSame('tutor@example.com', $result->user->email);
self::assertSame(2, $result->user->privilegeLevel);
self::assertArrayNotHasKey('blackwall_oauth_state', $_SESSION);
self::assertArrayNotHasKey('blackwall_oauth_code_verifier', $_SESSION);
}
public function testHandleCallbackThrowsOnMissingParams(): void
{
$this->expectException(UserInfoException::class);
$this->client->handleCallback(['state' => 'only-state']);
}
}
+33
View File
@@ -0,0 +1,33 @@
<?php
declare(strict_types=1);
namespace BlackWall\Auth\Tests;
use BlackWall\Auth\UserInfoNormalizer;
use BlackWall\Auth\Exception\UserInfoException;
use PHPUnit\Framework\TestCase;
final class UserInfoNormalizerTest extends TestCase
{
public function testNormalizesNestedClaimsAndRoleString(): void
{
$normalized = UserInfoNormalizer::normalize([
'email' => 'User@Example.com',
'claims' => [
'role' => 'admin',
],
]);
self::assertSame('user@example.com', $normalized->email);
self::assertSame(1, $normalized->privilegeLevel);
self::assertSame('admin', $normalized->role);
}
public function testThrowsWhenEmailMissing(): void
{
$this->expectException(UserInfoException::class);
UserInfoNormalizer::normalize(['sub' => '123']);
}
}