no need to test concrete implementations
This commit is contained in:
parent
a65c9259fa
commit
2fe41a5fe7
3 changed files with 3 additions and 120 deletions
|
|
@ -20,6 +20,9 @@ Code patterns to follow:
|
||||||
- Entities: constructor with properties, getters
|
- Entities: constructor with properties, getters
|
||||||
- DTOs: simple data containers for creation
|
- DTOs: simple data containers for creation
|
||||||
- Repositories: interfaces that define data access
|
- Repositories: interfaces that define data access
|
||||||
|
- Do not write unit tests for concrete repository implementations
|
||||||
|
(e.g., Doctrine/persistence-backed). They are exercised by e2e
|
||||||
|
tests. Use cases are tested with fake repositories.
|
||||||
- Use cases: business logic with Request objects
|
- Use cases: business logic with Request objects
|
||||||
- When throwing exceptions, add @throws docblock
|
- When throwing exceptions, add @throws docblock
|
||||||
- Fakes: in-memory implementations for testing
|
- Fakes: in-memory implementations for testing
|
||||||
|
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Tests\Unit\Auth;
|
|
||||||
|
|
||||||
use App\Auth\CreateSessionDto;
|
|
||||||
use App\Auth\Session;
|
|
||||||
use DateTimeImmutable;
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
use Tests\Fakes\FakeSessionRepository;
|
|
||||||
|
|
||||||
class FakeSessionRepositoryTest extends TestCase
|
|
||||||
{
|
|
||||||
private FakeSessionRepository $sessionRepo;
|
|
||||||
|
|
||||||
public function setUp(): void
|
|
||||||
{
|
|
||||||
$this->sessionRepo = new FakeSessionRepository();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test_create_and_find_by_token(): void
|
|
||||||
{
|
|
||||||
$this->sessionRepo->create(new CreateSessionDto(
|
|
||||||
token: 'abc123',
|
|
||||||
userId: 0,
|
|
||||||
createdAt: new DateTimeImmutable('2025-01-01'),
|
|
||||||
expiresAt: new DateTimeImmutable('2025-01-08'),
|
|
||||||
));
|
|
||||||
|
|
||||||
$session = $this->sessionRepo->findByToken('abc123');
|
|
||||||
|
|
||||||
$this->assertInstanceOf(Session::class, $session);
|
|
||||||
$this->assertEquals('abc123', $session->getToken());
|
|
||||||
$this->assertEquals(0, $session->getUserId());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test_find_by_token_returns_null_when_missing(): void
|
|
||||||
{
|
|
||||||
$this->assertNull($this->sessionRepo->findByToken('nope'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test_find_by_token_returns_fresh_instance(): void
|
|
||||||
{
|
|
||||||
$created = $this->sessionRepo->create(new CreateSessionDto(
|
|
||||||
token: 'abc123',
|
|
||||||
userId: 0,
|
|
||||||
createdAt: new DateTimeImmutable('2025-01-01'),
|
|
||||||
expiresAt: new DateTimeImmutable('2025-01-08'),
|
|
||||||
));
|
|
||||||
|
|
||||||
$fetched = $this->sessionRepo->findByToken('abc123');
|
|
||||||
|
|
||||||
$this->assertNotSame($created, $fetched);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test_delete_by_token(): void
|
|
||||||
{
|
|
||||||
$this->sessionRepo->create(new CreateSessionDto(
|
|
||||||
token: 'abc123',
|
|
||||||
userId: 0,
|
|
||||||
createdAt: new DateTimeImmutable('2025-01-01'),
|
|
||||||
expiresAt: new DateTimeImmutable('2025-01-08'),
|
|
||||||
));
|
|
||||||
|
|
||||||
$this->sessionRepo->deleteByToken('abc123');
|
|
||||||
|
|
||||||
$this->assertNull($this->sessionRepo->findByToken('abc123'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Tests\Unit\User;
|
|
||||||
|
|
||||||
use App\User\UseCases\CreateUserDto;
|
|
||||||
use App\User\User;
|
|
||||||
use App\ValueObjects\EmailAddress;
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
use Tests\Fakes\FakeUserRepository;
|
|
||||||
|
|
||||||
class FakeUserRepositoryTest extends TestCase
|
|
||||||
{
|
|
||||||
public function test_find_by_email_returns_user(): void
|
|
||||||
{
|
|
||||||
$userRepo = new FakeUserRepository();
|
|
||||||
$userRepo->create(new CreateUserDto(
|
|
||||||
email: new EmailAddress('test@test.com'),
|
|
||||||
passwordHash: '',
|
|
||||||
));
|
|
||||||
|
|
||||||
$user = $userRepo->findByEmail(new EmailAddress('test@test.com'));
|
|
||||||
|
|
||||||
$this->assertInstanceOf(User::class, $user);
|
|
||||||
$this->assertEquals('test@test.com', $user->getEmail()->value());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test_find_by_email_returns_null_when_not_found(): void
|
|
||||||
{
|
|
||||||
$userRepo = new FakeUserRepository();
|
|
||||||
|
|
||||||
$user = $userRepo->findByEmail(
|
|
||||||
new EmailAddress('missing@test.com')
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->assertNull($user);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test_find_by_email_returns_fresh_instance(): void
|
|
||||||
{
|
|
||||||
$userRepo = new FakeUserRepository();
|
|
||||||
$created = $userRepo->create(new CreateUserDto(
|
|
||||||
email: new EmailAddress('test@test.com'),
|
|
||||||
passwordHash: '',
|
|
||||||
));
|
|
||||||
|
|
||||||
$fetched = $userRepo->findByEmail(
|
|
||||||
new EmailAddress('test@test.com')
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->assertNotSame($created, $fetched);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue