. */ declare(strict_types=1); namespace App\Tests\Services\InfoProviderSystem\DTOs; use App\Services\InfoProviderSystem\DTOs\BrowserSubmittedPage; use PHPUnit\Framework\TestCase; final class BrowserSubmittedPageTest extends TestCase { public function testTokenIsNonEmpty(): void { $page = new BrowserSubmittedPage('https://example.com', '', 'Test'); $this->assertNotEmpty($page->token); } public function testTokenIsDeterministic(): void { $page1 = new BrowserSubmittedPage('https://example.com', '', 'Title A'); $page2 = new BrowserSubmittedPage('https://example.com', '', 'Title B'); // Token is derived from URL + HTML only, title does not affect it $this->assertSame($page1->token, $page2->token); } public function testDifferentUrlProducesDifferentToken(): void { $page1 = new BrowserSubmittedPage('https://example.com/1', '', 'Test'); $page2 = new BrowserSubmittedPage('https://example.com/2', '', 'Test'); $this->assertNotSame($page1->token, $page2->token); } public function testDifferentHtmlProducesDifferentToken(): void { $page1 = new BrowserSubmittedPage('https://example.com', 'A', 'Test'); $page2 = new BrowserSubmittedPage('https://example.com', 'B', 'Test'); $this->assertNotSame($page1->token, $page2->token); } public function testTokenMatchesPageTokenProperty(): void { $page = new BrowserSubmittedPage('https://example.com', 'content', 'Test'); $expected = hash('xxh3', 'https://example.com|content'); $this->assertSame($expected, $page->token); } public function testDefaultSubmittedAtIsNow(): void { $before = new \DateTimeImmutable(); $page = new BrowserSubmittedPage('https://example.com', '', 'Test'); $after = new \DateTimeImmutable(); $this->assertGreaterThanOrEqual($before->getTimestamp(), $page->submittedAt->getTimestamp()); $this->assertLessThanOrEqual($after->getTimestamp(), $page->submittedAt->getTimestamp()); } public function testCustomSubmittedAt(): void { $dt = new \DateTimeImmutable('2025-01-01 12:00:00'); $page = new BrowserSubmittedPage('https://example.com', '', 'Test', $dt); $this->assertSame($dt, $page->submittedAt); } }