b2in/tests/Feature/AnnouncementBarTest.php
Kevin Adametz fcb10be120 Interior-Feinschliff: Hero-Slideshow, Lektorat, Rechtstexte, Aufräumen und Korrekturen 08.10.
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>
2026-10-08 14:00:15 +00:00

122 lines
4.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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)');
});