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