fix: wyciek meta_title homepage na podstrony kategorii/artykulu/produktu (v0.351)
LayoutEngine::show() w 3 galeziach (category/article/product) nadpisywal tylko $page['language']['title'], a meta_title homepage zylo dalej i wygrywalo w substytucji [TITLE]. Wyodrebniono applyEntityMetaToPage() jako pure-function ktora zawsze nadpisuje meta_title/meta_keywords/meta_description encji (nawet pustym/null), eliminujac wyciek. 5 nowych testow w LayoutEngineMetaTagsTest. Suita 846 testow zielona. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
110
tests/Unit/front/LayoutEngineMetaTagsTest.php
Normal file
110
tests/Unit/front/LayoutEngineMetaTagsTest.php
Normal file
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
namespace Tests\Unit\Front;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
require_once __DIR__ . '/../../../autoload/front/LayoutEngine.php';
|
||||
|
||||
/**
|
||||
* Phase 19 — fix metatagów na stronach kategorii/produktu/artykułu.
|
||||
*
|
||||
* Bug: domyślne $page jest stroną główną. W gałęziach category/article/product
|
||||
* w LayoutEngine::show() nadpisywany był tylko title, a meta_title homepage
|
||||
* żył dalej w $page['language']['meta_title'] i wygrywał w substytucji [TITLE].
|
||||
*
|
||||
* Fix: applyEntityMetaToPage() zawsze nadpisuje meta_title/meta_keywords/
|
||||
* meta_description encji (nawet pustymi/null), żeby nic z homepage nie wyciekało.
|
||||
*/
|
||||
class LayoutEngineMetaTagsTest extends TestCase
|
||||
{
|
||||
public function testHomepageMetaTitleDoesNotLeakWhenEntityHasOwnMetaTitle()
|
||||
{
|
||||
$page = $this->homepagePage();
|
||||
$category = [
|
||||
'meta_title' => 'Sen i otulenie — kocyki minky',
|
||||
'meta_keywords' => 'kocyki, otulacze',
|
||||
'meta_description' => 'Najwyższej jakości kocyki minky',
|
||||
'title' => 'Sen i otulenie',
|
||||
];
|
||||
|
||||
$result = \front\LayoutEngine::applyEntityMetaToPage($page, $category, $category['title']);
|
||||
|
||||
$this->assertSame('Sen i otulenie — kocyki minky', $result['language']['meta_title']);
|
||||
$this->assertSame('Sen i otulenie', $result['language']['title']);
|
||||
$this->assertSame('kocyki, otulacze', $result['language']['meta_keywords']);
|
||||
$this->assertSame('Najwyższej jakości kocyki minky', $result['language']['meta_description']);
|
||||
}
|
||||
|
||||
public function testHomepageMetaTitleIsClearedWhenEntityHasNoMetaTitle()
|
||||
{
|
||||
$page = $this->homepagePage();
|
||||
$category = [
|
||||
'meta_title' => null,
|
||||
'meta_keywords' => 'description',
|
||||
'meta_description' => 'keywords',
|
||||
'title' => 'Sen i otulenie',
|
||||
];
|
||||
|
||||
$result = \front\LayoutEngine::applyEntityMetaToPage($page, $category, $category['title']);
|
||||
|
||||
$this->assertNull(
|
||||
$result['language']['meta_title'],
|
||||
'meta_title homepage nie może wyciekać gdy kategoria nie ma własnego'
|
||||
);
|
||||
$this->assertSame('Sen i otulenie', $result['language']['title']);
|
||||
}
|
||||
|
||||
public function testProductWithAllMetaNullClearsHomepageValues()
|
||||
{
|
||||
$page = $this->homepagePage();
|
||||
$productLang = [
|
||||
'meta_title' => null,
|
||||
'meta_keywords' => null,
|
||||
'meta_description' => null,
|
||||
'name' => 'Kocyk niemowlaka - Szczeniak z balonikiem - Fuksja',
|
||||
];
|
||||
|
||||
$result = \front\LayoutEngine::applyEntityMetaToPage($page, $productLang, $productLang['name']);
|
||||
|
||||
$this->assertNull($result['language']['meta_title']);
|
||||
$this->assertNull($result['language']['meta_keywords']);
|
||||
$this->assertNull($result['language']['meta_description']);
|
||||
$this->assertSame($productLang['name'], $result['language']['title']);
|
||||
}
|
||||
|
||||
public function testNullEntityLanguageDoesNotCrashAndClearsMeta()
|
||||
{
|
||||
$page = $this->homepagePage();
|
||||
|
||||
$result = \front\LayoutEngine::applyEntityMetaToPage($page, null, 'Fallback');
|
||||
|
||||
$this->assertSame('Fallback', $result['language']['title']);
|
||||
$this->assertNull($result['language']['meta_title']);
|
||||
$this->assertNull($result['language']['meta_keywords']);
|
||||
$this->assertNull($result['language']['meta_description']);
|
||||
}
|
||||
|
||||
public function testEmptyPageInputCreatesLanguageStructure()
|
||||
{
|
||||
$result = \front\LayoutEngine::applyEntityMetaToPage([], ['meta_title' => 'X'], 'T');
|
||||
|
||||
$this->assertIsArray($result);
|
||||
$this->assertIsArray($result['language']);
|
||||
$this->assertSame('X', $result['language']['meta_title']);
|
||||
$this->assertSame('T', $result['language']['title']);
|
||||
}
|
||||
|
||||
private function homepagePage()
|
||||
{
|
||||
return [
|
||||
'id' => 6,
|
||||
'language' => [
|
||||
'title' => 'Home',
|
||||
'meta_title' => 'Sklep z akcesoriami dla dzieci i niemowląt, kocyki minky, poduszki, ubranka',
|
||||
'meta_keywords' => '',
|
||||
'meta_description' => 'Marianek to sklep internetowy z artykułami dla dzieci...',
|
||||
'page_title' => null,
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user