create([ 'type' => DisplayVersionType::B2in, 'settings' => ['logo_url' => 'https://b2in.test/storage/display-media/2026/05/a.png'], ]); $item = DisplayVersionItem::factory()->create([ 'display_version_id' => $module->id, 'content' => ['media_url' => 'https://b2in.eu/storage/display-media/2026/03/b.mp4'], ]); $this->seed(\Database\Seeders\DisplayMediaUrlNormalizerSeeder::class); expect($module->fresh()->settings['logo_url'])->toBe('/storage/display-media/2026/05/a.png'); expect($item->fresh()->content['media_url'])->toBe('/storage/display-media/2026/03/b.mp4'); }); it('also covers the portal subdomain and qr codes', function () { $module = DisplayVersion::factory()->create([ 'type' => DisplayVersionType::VideoDisplay, 'settings' => ['qr_image_url' => 'https://portal.b2in.test/storage/display-qr-codes/x.svg'], ]); $this->seed(\Database\Seeders\DisplayMediaUrlNormalizerSeeder::class); expect($module->fresh()->settings['qr_image_url'])->toBe('/storage/display-qr-codes/x.svg'); }); it('leaves destination links absolute', function () { // Footer- und QR-Ziele sind Links, keine Assets – sie muessen absolut bleiben. $module = DisplayVersion::factory()->create([ 'type' => DisplayVersionType::B2in, 'settings' => [ 'qr_url' => 'https://cabinet-bielefeld.de', 'footer_url' => 'https://b2in.eu', 'link' => 'https://b2in.eu/immobilien', ], ]); $this->seed(\Database\Seeders\DisplayMediaUrlNormalizerSeeder::class); $settings = $module->fresh()->settings; expect($settings['qr_url'])->toBe('https://cabinet-bielefeld.de'); expect($settings['footer_url'])->toBe('https://b2in.eu'); expect($settings['link'])->toBe('https://b2in.eu/immobilien'); }); it('leaves external hosts alone', function () { $module = DisplayVersion::factory()->create([ 'type' => DisplayVersionType::B2in, 'settings' => ['logo_url' => 'https://example.com/storage/display-media/x.png'], ]); $this->seed(\Database\Seeders\DisplayMediaUrlNormalizerSeeder::class); expect($module->fresh()->settings['logo_url'])->toBe('https://example.com/storage/display-media/x.png'); }); it('reaches urls nested inside arrays', function () { $module = DisplayVersion::factory()->create([ 'type' => DisplayVersionType::Offers, 'settings' => ['slides' => [['image' => 'https://b2in.test/storage/display-media/deep.png']]], ]); $this->seed(\Database\Seeders\DisplayMediaUrlNormalizerSeeder::class); expect($module->fresh()->settings['slides'][0]['image'])->toBe('/storage/display-media/deep.png'); }); it('is idempotent', function () { $module = DisplayVersion::factory()->create([ 'type' => DisplayVersionType::B2in, 'settings' => ['logo_url' => 'https://b2in.test/storage/display-media/a.png'], ]); $this->seed(\Database\Seeders\DisplayMediaUrlNormalizerSeeder::class); $once = $module->fresh()->settings; $this->seed(\Database\Seeders\DisplayMediaUrlNormalizerSeeder::class); expect($module->fresh()->settings)->toBe($once); });