themesPath = base_path('themes'); if (! File::exists($this->themesPath)) { File::makeDirectory($this->themesPath); } if (! File::exists($this->themesPath . '/test-theme')) { File::makeDirectory($this->themesPath . '/test-theme'); } File::put($this->themesPath . '/test-theme/theme.md', "title: Test Theme"); \App\Models\Setting::set('active_theme', 'test-theme', 'cms'); Config::set('app.url', 'http://localhost'); } protected function tearDown(): void { File::deleteDirectory($this->themesPath . '/test-theme'); parent::tearDown(); } public function test_css_helper_generates_correct_tag(): void { $html = css('css/style.css', ['id' => 'main-css', 'media' => 'all']); $this->assertStringContainsString('assertStringContainsString('href="http://localhost/themes/test-theme/css/style.css"', $html); $this->assertStringContainsString('id="main-css"', $html); $this->assertStringContainsString('media="all"', $html); } public function test_js_helper_generates_correct_tag(): void { $html = js('js/app.js', ['defer' => true, 'async' => true]); $this->assertStringContainsString('', $html); } public function test_sw_file_generates_img_tag_for_images(): void { $html = sw_file('img/logo.png', ['alt' => 'Site Logo', 'class' => 'ui image']); $this->assertStringContainsString('assertStringContainsString('alt="Site Logo"', $html); $this->assertStringContainsString('class="ui image"', $html); } public function test_sw_file_handles_jit_parameters(): void { $html = sw_file('img/hero.jpg', ['w' => 800, 'h' => 400, 'fit' => 'crop', 'fm' => 'webp']); $this->assertStringContainsString('w=800', $html); $this->assertStringContainsString('h=400', $html); $this->assertStringContainsString('fit=crop', $html); $this->assertStringContainsString('fm=webp', $html); $this->assertStringContainsString('assertStringContainsString('controls', $video); $audio = sw_file('audio/podcast.mp3', ['autoplay' => false]); $this->assertStringContainsString('