toBeTrue(); }); it('skeleton template has animate-pulse + data-testid="page-skeleton"', function () { $tpl = file_get_contents(base_path('resources/views/components/skeleton/page.blade.php')); expect($tpl)->toContain('animate-pulse'); expect($tpl)->toContain('data-testid="page-skeleton"'); expect($tpl)->toContain('bg-line'); }); foreach ($pages as $pageClass) { it("{$pageClass} declares #[Lazy] attribute", function () use ($pageClass) { $ref = new ReflectionClass($pageClass); $attrs = $ref->getAttributes(Lazy::class); expect($attrs)->not->toBeEmpty("Class {$pageClass} must have #[Lazy] attribute"); }); it("{$pageClass} has placeholder() static method returning skeleton view", function () use ($pageClass) { $ref = new ReflectionClass($pageClass); expect($ref->hasMethod('placeholder'))->toBeTrue("Class {$pageClass} must define placeholder()"); $method = $ref->getMethod('placeholder'); expect($method->isStatic())->toBeTrue("{$pageClass}::placeholder() must be static"); $view = $pageClass::placeholder([]); expect($view)->toBeInstanceOf(Illuminate\Contracts\View\View::class); expect($view->getName())->toBe('components.skeleton.page'); }); }