diff --git a/backend/tests/Unit/Auth/UseCases/CreateSessionTest.php b/backend/tests/Unit/Auth/UseCases/CreateSessionTest.php new file mode 100644 index 0000000..d08c05c --- /dev/null +++ b/backend/tests/Unit/Auth/UseCases/CreateSessionTest.php @@ -0,0 +1,102 @@ +sessionRepo = new FakeSessionRepository(); + $this->tokenGenerator = new FakeTokenGenerator([ + 'token-1', + ]); + $this->clock = new FakeClock( + new DateTimeImmutable('2026-05-16 12:00:00'), + ); + $this->useCase = new CreateSession( + $this->sessionRepo, + $this->tokenGenerator, + $this->clock, + ); + + $userRepo = new FakeUserRepository(); + $this->user = $userRepo->create(new CreateUserDto( + email: new EmailAddress('user@example.com'), + passwordHash: 'hashed:password', + )); + } + + public function testCreatesSessionWithGivenToken(): void + { + $session = $this->useCase->execute($this->user); + + $this->assertSame('token-1', $session->getToken()); + } + + public function testCreatesSessionWithUser(): void + { + $session = $this->useCase->execute($this->user); + + $this->assertSame( + $this->user->getId(), + $session->getUser()->getId(), + ); + } + + public function testCreatesSessionWithCreatedAtFromClock(): void + { + $session = $this->useCase->execute($this->user); + + $this->assertEquals( + new DateTimeImmutable('2026-05-16 12:00:00'), + $session->getCreatedAt(), + ); + } + + public function testCreatesSessionWithExpirySevenDaysLater(): void + { + $session = $this->useCase->execute($this->user); + + $this->assertEquals( + new DateTimeImmutable('2026-05-23 12:00:00'), + $session->getExpiresAt(), + ); + } + + public function testPersistsSessionInRepository(): void + { + $session = $this->useCase->execute($this->user); + + $found = $this->sessionRepo->findByToken('token-1'); + + $this->assertNotNull($found); + $this->assertSame($session->getToken(), $found->getToken()); + } + + public function testFreshInstanceReturnedOnEachCall(): void + { + $session = $this->useCase->execute($this->user); + + $this->assertNotSame( + $session, + $this->sessionRepo->findByToken('token-1'), + ); + } +}