Forcing every call site to be explicit about admin status and password eliminates a class of bugs where an unintended isAdmin=false or empty passwordHash could silently slip through. The CreateUserTest case that asserted the isAdmin default is dropped since the default no longer exists.
95 lines
2.8 KiB
PHP
95 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit\User\UseCases;
|
|
|
|
use App\Exceptions\BadRequestException;
|
|
use App\Exceptions\UnauthorizedException;
|
|
use App\User\UseCases\AuthenticateUser;
|
|
use App\User\UseCases\AuthenticateUserRequest;
|
|
use App\User\UseCases\CreateUser;
|
|
use App\User\UseCases\CreateUserRequest;
|
|
use App\User\User;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Tests\Fakes\FakePasswordHasher;
|
|
use Tests\Fakes\FakeUserRepository;
|
|
|
|
class AuthenticateUserTest extends TestCase
|
|
{
|
|
private FakeUserRepository $userRepo;
|
|
private FakePasswordHasher $passwordHasher;
|
|
private AuthenticateUser $useCase;
|
|
|
|
public function setUp(): void
|
|
{
|
|
$this->userRepo = new FakeUserRepository();
|
|
$this->passwordHasher = new FakePasswordHasher();
|
|
$createUser = new CreateUser(
|
|
$this->userRepo,
|
|
$this->passwordHasher,
|
|
);
|
|
$createUser->execute(new CreateUserRequest(
|
|
email: 'test@test.com',
|
|
password: 'password1',
|
|
isAdmin: false,
|
|
));
|
|
$this->useCase = new AuthenticateUser(
|
|
$this->userRepo,
|
|
$this->passwordHasher,
|
|
);
|
|
}
|
|
|
|
public function test_returns_user_on_valid_credentials(): void
|
|
{
|
|
$user = $this->useCase->execute(new AuthenticateUserRequest(
|
|
email: 'test@test.com',
|
|
password: 'password1',
|
|
));
|
|
|
|
$this->assertInstanceOf(User::class, $user);
|
|
$this->assertEquals('test@test.com', $user->getEmail()->value());
|
|
}
|
|
|
|
public function test_throws_bad_request_when_email_null(): void
|
|
{
|
|
$this->expectException(BadRequestException::class);
|
|
$this->expectExceptionMessage('email is required');
|
|
|
|
$this->useCase->execute(new AuthenticateUserRequest(
|
|
email: null,
|
|
password: 'password1',
|
|
));
|
|
}
|
|
|
|
public function test_throws_bad_request_when_password_null(): void
|
|
{
|
|
$this->expectException(BadRequestException::class);
|
|
$this->expectExceptionMessage('password is required');
|
|
|
|
$this->useCase->execute(new AuthenticateUserRequest(
|
|
email: 'test@test.com',
|
|
password: null,
|
|
));
|
|
}
|
|
|
|
public function test_throws_unauthorized_on_wrong_password(): void
|
|
{
|
|
$this->expectException(UnauthorizedException::class);
|
|
$this->expectExceptionMessage('invalid credentials');
|
|
|
|
$this->useCase->execute(new AuthenticateUserRequest(
|
|
email: 'test@test.com',
|
|
password: 'wrongpassword',
|
|
));
|
|
}
|
|
|
|
public function test_throws_unauthorized_when_email_not_found(): void
|
|
{
|
|
$this->expectException(UnauthorizedException::class);
|
|
$this->expectExceptionMessage('invalid credentials');
|
|
|
|
$this->useCase->execute(new AuthenticateUserRequest(
|
|
email: 'missing@test.com',
|
|
password: 'password1',
|
|
));
|
|
}
|
|
}
|