forceRootUrl('https://'.$portalDomain); }); // ======================================== // DisplayVersionList // ======================================== test('display version list requires authentication', function () { $response = $this->get(route('admin.cms.display-versions')); $response->assertRedirect('/login'); }); test('display version list renders for authenticated users', function () { $user = User::factory()->create(); $this->actingAs($user); $response = $this->get(route('admin.cms.display-versions')); $response->assertSuccessful(); $response->assertSeeLivewire(DisplayVersionList::class); }); test('can create a display version', function () { $user = User::factory()->create(); Livewire::actingAs($user) ->test(DisplayVersionList::class) ->set('newName', 'Test Version') ->set('newType', 'b2in') ->call('createVersion'); expect(DisplayVersion::where('name', 'Test Version')->exists())->toBeTrue(); $version = DisplayVersion::where('name', 'Test Version')->first(); expect($version->type)->toBe(DisplayVersionType::B2in); expect($version->settings)->toBeArray(); expect($version->settings)->toHaveKey('theme'); }); test('create version validates required fields', function () { $user = User::factory()->create(); Livewire::actingAs($user) ->test(DisplayVersionList::class) ->set('newName', '') ->set('newType', '') ->call('createVersion') ->assertHasErrors(['newName', 'newType']); }); test('can delete a display version', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create(); Livewire::actingAs($user) ->test(DisplayVersionList::class) ->call('deleteVersion', $version->id); expect(DisplayVersion::find($version->id))->toBeNull(); }); test('can toggle display version active status', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create(['is_active' => true]); Livewire::actingAs($user) ->test(DisplayVersionList::class) ->call('toggleActive', $version->id); expect($version->fresh()->is_active)->toBeFalse(); }); // ======================================== // DisplayVersionEditor // ======================================== test('display version editor renders with correct version data', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create(['name' => 'My Version']); $this->actingAs($user); $response = $this->get(route('admin.cms.display-version-edit', $version)); $response->assertSuccessful(); $response->assertSeeLivewire(DisplayVersionEditor::class); }); test('can add a video item to video-display version', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create(['type' => 'video-display']); Livewire::actingAs($user) ->test(DisplayVersionEditor::class, ['displayVersion' => $version]) ->call('openItemModal', null, 'video') ->set('videoFilename', 'test.mp4') ->set('videoTitle', 'Test Video') ->set('videoPosition', 50) ->call('saveItem'); $item = DisplayVersionItem::where('display_version_id', $version->id)->first(); expect($item)->not->toBeNull(); expect($item->item_type)->toBe('video'); expect($item->content['filename'])->toBe('test.mp4'); expect($item->content['position'])->toBe(50); }); test('can add a media item to b2in version', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create(['type' => 'b2in']); Livewire::actingAs($user) ->test(DisplayVersionEditor::class, ['displayVersion' => $version]) ->call('openItemModal', null, 'media') ->set('mediaType', 'video') ->set('mediaCategory', 'immobilien') ->set('mediaUrl', '../assets/test.mp4') ->set('mediaHeadline', 'Test Headline') ->set('mediaSubline', 'Test Subline') ->call('saveItem'); $item = DisplayVersionItem::where('display_version_id', $version->id)->first(); expect($item)->not->toBeNull(); expect($item->item_type)->toBe('media'); expect($item->content['media_type'])->toBe('video'); expect($item->content['headline'])->toBe('Test Headline'); }); test('can edit an existing item', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create(['type' => 'video-display']); $item = DisplayVersionItem::factory()->create([ 'display_version_id' => $version->id, 'item_type' => 'video', 'content' => ['filename' => 'old.mp4', 'title' => 'Old', 'position' => 25], ]); Livewire::actingAs($user) ->test(DisplayVersionEditor::class, ['displayVersion' => $version]) ->call('openItemModal', $item->id) ->set('videoFilename', 'new.mp4') ->set('videoTitle', 'New Title') ->call('saveItem'); $item->refresh(); expect($item->content['filename'])->toBe('new.mp4'); expect($item->content['title'])->toBe('New Title'); }); test('can delete an item', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create(); $item = DisplayVersionItem::factory()->create(['display_version_id' => $version->id]); Livewire::actingAs($user) ->test(DisplayVersionEditor::class, ['displayVersion' => $version]) ->call('deleteItem', $item->id); expect(DisplayVersionItem::find($item->id))->toBeNull(); }); test('can toggle item active status', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create(); $item = DisplayVersionItem::factory()->create([ 'display_version_id' => $version->id, 'is_active' => true, ]); Livewire::actingAs($user) ->test(DisplayVersionEditor::class, ['displayVersion' => $version]) ->call('toggleItemStatus', $item->id); expect($item->fresh()->is_active)->toBeFalse(); }); test('can reorder items', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create(); $item1 = DisplayVersionItem::factory()->create([ 'display_version_id' => $version->id, 'item_type' => 'video', 'sort_order' => 0, ]); $item2 = DisplayVersionItem::factory()->create([ 'display_version_id' => $version->id, 'item_type' => 'video', 'sort_order' => 1, ]); Livewire::actingAs($user) ->test(DisplayVersionEditor::class, ['displayVersion' => $version]) ->call('moveItem', $item2->id, 'up'); expect($item1->fresh()->sort_order)->toBe(1); expect($item2->fresh()->sort_order)->toBe(0); }); test('can add a slide item to offers version', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create(['type' => 'offers']); Livewire::actingAs($user) ->test(DisplayVersionEditor::class, ['displayVersion' => $version]) ->call('openItemModal', null, 'slide') ->set('slideType', 'product-hero') ->set('slideDuration', 10000) ->set('slideImageUrl', '../assets/goya1.jpg') ->set('slideBadge', 'Einzelstück') ->set('slideEyebrow', 'Hersteller: Sudbrock') ->set('slideTitle', 'GOYA Sideboard') ->set('slidePrice', '489 €') ->set('slideOriginalPrice', 'statt 4.744 €') ->set('slideQrUrl', 'https://cabinet-bielefeld.de') ->set('slideQrTitle', 'Reservieren') ->set('slideContact', '0521 98620100') ->call('saveItem'); $item = DisplayVersionItem::where('display_version_id', $version->id)->first(); expect($item)->not->toBeNull(); expect($item->item_type)->toBe('slide'); expect($item->content['type'])->toBe('product-hero'); expect($item->content['title'])->toBe('GOYA Sideboard'); expect($item->content['price'])->toBe('489 €'); expect($item->content['image_url'])->toBe('../assets/goya1.jpg'); expect($item->content['qr_url'])->toBe('https://cabinet-bielefeld.de'); }); test('can add a slide with bullets to offers version', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create(['type' => 'offers']); Livewire::actingAs($user) ->test(DisplayVersionEditor::class, ['displayVersion' => $version]) ->call('openItemModal', null, 'slide') ->set('slideType', 'product-details') ->set('slideTitle', 'GOYA Sideboard') ->set('slideBullets', ['Einzelstück', 'Abholung möglich', 'Lieferung optional']) ->call('saveItem'); $item = DisplayVersionItem::where('display_version_id', $version->id)->first(); expect($item->content['bullets'])->toHaveCount(3); expect($item->content['bullets'][0])->toBe('Einzelstück'); }); test('can edit a slide item with new fields', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create(['type' => 'offers']); $item = DisplayVersionItem::factory()->create([ 'display_version_id' => $version->id, 'item_type' => 'slide', 'content' => [ 'type' => 'product-hero', 'duration' => 10000, 'image_url' => '../assets/old.jpg', 'badge_text' => 'Old Badge', 'eyebrow' => 'Old', 'title' => 'Old Title', 'subline' => '', 'price' => '100 €', 'original_price' => '', 'tag_text' => '', 'bullets' => [], 'disclaimer' => '', 'qr_url' => 'https://example.com', 'qr_title' => 'QR', 'contact' => '', 'show_brand_text' => false, 'brand_tagline' => '', ], ]); Livewire::actingAs($user) ->test(DisplayVersionEditor::class, ['displayVersion' => $version]) ->call('openItemModal', $item->id) ->set('slideTitle', 'New Title') ->set('slidePrice', '299 €') ->call('saveItem'); $item->refresh(); expect($item->content['title'])->toBe('New Title'); expect($item->content['price'])->toBe('299 €'); expect($item->content['image_url'])->toBe('../assets/old.jpg'); }); test('can save version settings', function () { $user = User::factory()->create(); $version = DisplayVersion::factory()->create([ 'type' => 'b2in', 'settings' => ['theme' => 'dark'], ]); Livewire::actingAs($user) ->test(DisplayVersionEditor::class, ['displayVersion' => $version]) ->call('openSettingsModal') ->set('settings.theme', 'light') ->call('saveSettings'); expect($version->fresh()->settings['theme'])->toBe('light'); });