userRepo = new FakeUserRepository(); $this->passwordHasher = new FakePasswordHasher(); $createUser = new CreateUser( $this->userRepo, $this->passwordHasher, ); $createUser->execute(new CreateUserRequest( email: 'test@test.com', password: 'password1', )); $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', (string) $user->getEmail()); } 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', )); } }