feat: add landing page templates and registration modal
- Implemented header and hero section in _header.html.twig and _hero_art.html.twig. - Created a pre-registration modal in _reg_modal.html.twig with form fields and validation. - Added page scripts for dynamic behavior and interaction in _page_scripts.html.twig. - Developed landing page structure in landing.html.twig, integrating header, footer, and modal. - Introduced tests for landing page rendering and registry validation in LandingPageTest.php and LandingRegistryTest.php.
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
namespace App\Tests\Shared;
|
||||
|
||||
use App\Shared\Landing\LandingPage;
|
||||
use App\Shared\Landing\LandingRegistry;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* قواعدی که اگر بشکنند، هفت صفحهٔ فرود بهجای کمک به رتبه، به هم آسیب میزنند:
|
||||
* عنوان یا h1 تکراری یعنی محتوای تکراری، و توضیحات بیرون از بازهٔ استاندارد در
|
||||
* نتایج جستجو بریده میشود.
|
||||
*/
|
||||
class LandingRegistryTest extends TestCase
|
||||
{
|
||||
private LandingRegistry $registry;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->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, 'اسلاگ نباید با خط تیره شروع یا تمام شود');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user