now = new DateTimeImmutable( '2026-07-31T12:00:00', new DateTimeZone('UTC'), ); $this->sessionRepository = new FakeSessionRepository; $this->useCase = new CreateSession( $this->sessionRepository, new FakeTokenGenerator(['session-token']), new FakeClock($this->now), ); } public function test_creates_a_seven_day_session_with_generated_token(): void { $user = $this->user(); $session = $this->useCase->execute($user); $this->assertSame('session-token', $session->getToken()); $this->assertSame($user, $session->getUser()); $this->assertSame($this->now, $session->getCreatedAt()); $this->assertEquals( $this->now->modify('+7 days'), $session->getExpiresAt(), ); } public function test_created_session_is_findable_by_token(): void { $this->useCase->execute($this->user()); $session = $this->sessionRepository->findByToken('session-token'); $this->assertNotNull($session); $this->assertSame(7, $session->getUser()->getId()); } private function user(): User { return new User( id: 7, email: new EmailAddress('user@example.com'), passwordHash: 'hashed:correct-password', ); } }