registry = new LandingRegistry(); } public function testEverySlugIsRegistered(): void { $slugs = array_keys($this->registry->all()); self::assertCount(7, $slugs); self::assertContains(LandingRegistry::BEAUTY, $slugs); self::assertContains(LandingRegistry::CRM, $slugs); } public function testUnknownSlugReturnsNull(): void { self::assertNull($this->registry->find('یک-اسلاگ-ناموجود')); } public function testFindReturnsTheMatchingPage(): void { $page = $this->registry->find(LandingRegistry::DENTAL); self::assertInstanceOf(LandingPage::class, $page); self::assertSame(LandingRegistry::DENTAL, $page->slug); } public function testTitlesAndHeadingsAreUnique(): void { $titles = array_map(static fn (LandingPage $p): string => $p->metaTitle, $this->registry->all()); $h1s = array_map(static fn (LandingPage $p): string => $p->h1, $this->registry->all()); self::assertCount(7, array_unique($titles), 'عنوان تکراری یعنی محتوای تکراری'); self::assertCount(7, array_unique($h1s), 'h1 تکراری یعنی محتوای تکراری'); } /** توضیحات کوتاه‌تر از ۱۲۰ فرصت را هدر می‌دهد و بلندتر از ۱۷۰ در نتایج بریده می‌شود. */ public function testMetaDescriptionLengthIsWithinSearchLimits(): void { foreach ($this->registry->all() as $slug => $page) { $length = mb_strlen($page->metaDescription); self::assertGreaterThanOrEqual(120, $length, "توضیحات «{$slug}» کوتاه است"); self::assertLessThanOrEqual(170, $length, "توضیحات «{$slug}» بلند است"); } } public function testEveryPageHasContentToRender(): void { foreach ($this->registry->all() as $slug => $page) { self::assertNotSame('', trim($page->lead), "lead «{$slug}» خالی است"); self::assertGreaterThanOrEqual(4, count($page->features), "امکانات «{$slug}» کم است"); self::assertGreaterThanOrEqual(3, count($page->faq), "پرسش‌های «{$slug}» کم است"); } } /** لینک داخلی به اسلاگی که وجود ندارد یعنی ۴۰۴ داخل خود سایت. */ public function testRelatedLinksPointAtRealPages(): void { $known = array_keys($this->registry->all()); foreach ($this->registry->all() as $slug => $page) { self::assertNotContains($slug, $page->related, "«{$slug}» به خودش لینک داده"); foreach ($page->related as $target) { self::assertContains($target, $known, "«{$slug}» به «{$target}» لینک داده که وجود ندارد"); } } } public function testSlugsCarryTheKeywordAndNoSpaces(): void { foreach (array_keys($this->registry->all()) as $slug) { self::assertStringNotContainsString(' ', $slug, 'اسلاگ نباید فاصله داشته باشد'); self::assertSame(trim($slug, '-'), $slug, 'اسلاگ نباید با خط تیره شروع یا تمام شود'); } } }