Startseite und Heroes - Hero-Slideshow (11 Motive inkl. Febrü) mit Infokarte, Laufzeit-Linie, größeren Klickflächen, Goldrahmen und mobiler Karte unter dem Bild; Zeile über der Überschrift, neue Vertrauenspunkte - Hero-Stil auf Marken, Über uns und Kontakt übertragen, Breadcrumb entfernt - Gründer-Leiste, Vision-Box auf Ocker, Showroom-Display in Box mit „Größer ansehen“/Vollbild - Akzentfarbe #a8741f, größere Serif-Überschriften in der Interior-Welt - Marken: Bildpause mit Zitat; Vereine aktualisiert und verlinkt Inhalte - Lektorat aller angezeigten Texte, /about-Korrekturen, Rechtstexte (DDG, TDDDG, Hosting Hetzner) - Ablauf Maßanfertigung überall einheitlich, Magazin-Beitrag neu, alte Beiträge offline, deutsches Datum/Lesezeit, FAQ Projektausstattung, Otterpohl - Referenzen-Seite per CMS-Schalter ausblendbar CMS und Technik - Tote Sektionen, Felder, Seiten und Komponenten entfernt und archiviert (dev/2026-08-28/archiv-*) - Entwurf /entwurf, Farb-Schalter und /welcome entfernt; Test-Routen nur noch lokal - Seitenbaum-Beschreibungen geprüft, fehlende CMS-Felder ergänzt, Markenliste aus „Kernmarken“ - Admin-Bildvorschauen repariert, verwendete Bilder in die Mediathek übernommen - Seeder für das Deployment siehe dev/2026-08-28/entwicklungsplan.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
122 lines
4.6 KiB
PHP
122 lines
4.6 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
use App\Livewire\Web\Components\Ui\AnnouncementBar;
|
||
use Livewire\Livewire;
|
||
|
||
// Seit 01.10.2026 standardmäßig aus (B2IN_ANNOUNCEMENT_BAR) – hier geht es um die Leiste selbst.
|
||
beforeEach(function () {
|
||
config(['app.announcement_bar' => true]);
|
||
});
|
||
|
||
it('announcement bar is visible on homepage', function () {
|
||
$this->get('/')
|
||
->assertSuccessful()
|
||
->assertSee('Rotpunkt Küchen', false)
|
||
->assertSee('NEU');
|
||
});
|
||
|
||
it('announcement bar is visible on immobilien page', function () {
|
||
$this->get('/immobilien')
|
||
->assertSuccessful()
|
||
->assertSee('id="topbar"', false);
|
||
});
|
||
|
||
// ========================================
|
||
// Eine Meldung je Welt
|
||
// ========================================
|
||
|
||
it('carries the real estate topic in the real estate world and the interior topic elsewhere', function () {
|
||
$this->get('/immobilien')
|
||
->assertSuccessful()
|
||
->assertSee('Azizi Creek Views 4')
|
||
->assertSee('/immobilien/azizi-creek-views-4')
|
||
->assertDontSee('Rotpunkt Küchen neu bei B2in Interior', false);
|
||
|
||
$this->get('/')
|
||
->assertSuccessful()
|
||
->assertSee('Rotpunkt Küchen neu bei B2in Interior', false)
|
||
->assertDontSee('Azizi Creek Views 4');
|
||
});
|
||
|
||
it('shows the real estate topic on the real estate magazine and about pages too', function (string $path) {
|
||
$this->get($path)->assertSuccessful()->assertSee('Azizi Creek Views 4');
|
||
})->with(['/immobilien/magazin', '/immobilien/ueber-b2in', '/immobilien/faq']);
|
||
|
||
it('uses a separate dismiss key per world so closing one bar keeps the other visible', function () {
|
||
$interior = Livewire::test(AnnouncementBar::class)->get('dismissKey');
|
||
|
||
b2in_world_set('immobilien');
|
||
$immobilien = Livewire::test(AnnouncementBar::class)->get('dismissKey');
|
||
|
||
expect($immobilien)->not->toBe($interior);
|
||
});
|
||
|
||
it('takes the real estate bar from the CMS when one is stored', function () {
|
||
\FluxCms\Core\Models\CmsContent::create([
|
||
'group' => 'global',
|
||
'key' => 'announcement_bar_immobilien',
|
||
'type' => 'json',
|
||
'value' => ['de' => ['enabled' => true, 'id' => 'cms', 'text' => 'Neues Projekt aus dem CMS', 'link_text' => 'Mehr', 'link_url' => '/immobilien']],
|
||
'order' => 0,
|
||
]);
|
||
|
||
$this->get('/immobilien')->assertSuccessful()->assertSee('Neues Projekt aus dem CMS');
|
||
$this->get('/')->assertSuccessful()->assertDontSee('Neues Projekt aus dem CMS');
|
||
});
|
||
|
||
it('announcement bar carries an interior topic, not a dubai launch', function () {
|
||
$this->get('/')
|
||
->assertSuccessful()
|
||
->assertSee('Termin anfragen')
|
||
->assertDontSee('Azizi Creek Views 4')
|
||
->assertDontSee('NEW LAUNCH');
|
||
});
|
||
|
||
// ========================================
|
||
// Dismiss-Key
|
||
// ========================================
|
||
|
||
it('derives the dismiss key from the content, not just the id', function () {
|
||
// Gleiche id, anderer Text: Wiederkehrer muessen die neue Meldung wieder zu sehen bekommen.
|
||
$old = new \App\Livewire\Web\Components\Ui\AnnouncementBar;
|
||
$old->content = ['id' => 'launch', 'badge' => 'NEU', 'text' => 'Alter Text', 'link_url' => '/a'];
|
||
|
||
$new = new \App\Livewire\Web\Components\Ui\AnnouncementBar;
|
||
$new->content = ['id' => 'launch', 'badge' => 'NEU', 'text' => 'Neuer Text', 'link_url' => '/a'];
|
||
|
||
expect($old->dismissKey)->not->toBe($new->dismissKey);
|
||
});
|
||
|
||
it('keeps the dismiss key stable while the content is unchanged', function () {
|
||
$content = ['id' => 'launch', 'badge' => 'NEU', 'text' => 'Gleicher Text', 'link_url' => '/a'];
|
||
|
||
$first = new \App\Livewire\Web\Components\Ui\AnnouncementBar;
|
||
$first->content = $content;
|
||
|
||
$second = new \App\Livewire\Web\Components\Ui\AnnouncementBar;
|
||
$second->content = $content;
|
||
|
||
expect($first->dismissKey)->toBe($second->dismissKey);
|
||
});
|
||
|
||
it('does not hide itself behind x-cloak', function () {
|
||
// Livewire setzt global [x-cloak]{display:none!important}. Mit x-cloak an der Leiste
|
||
// haengt ihre Sichtbarkeit daran, dass Alpine das Attribut entfernt – tut es das nicht,
|
||
// ist die Leiste dauerhaft weg. Ohne Alpine muss sie sichtbar bleiben.
|
||
$html = $this->get('/')->assertSuccessful()->getContent();
|
||
|
||
$start = strpos($html, 'id="topbar"');
|
||
expect($start)->not->toBeFalse();
|
||
|
||
$barMarkup = substr($html, max(0, $start - 900), 900);
|
||
expect($barMarkup)->not->toContain('x-cloak');
|
||
});
|
||
|
||
it('survives a browser that blocks localStorage', function () {
|
||
// Ein Wurf im x-data wuerde die ganze Komponente lahmlegen.
|
||
$html = $this->get('/')->assertSuccessful()->getContent();
|
||
|
||
expect($html)->toContain('try { dismissed = localStorage.getItem(key)');
|
||
});
|