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:
2026-05-13 22:38:02 +02:00
parent 255456dcc5
commit 6c924ae542
11 changed files with 741 additions and 35 deletions

View 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,
],
];
}
}