forceRootUrl('https://'.$portalDomain); }); test('cabinet info tablet page requires authentication', function () { $response = $this->get(route('admin.cms.cabinet-tablet')); $response->assertRedirect('/login'); }); test('cabinet info tablet page renders for authenticated users', function () { $user = User::factory()->create(); $this->actingAs($user); $response = $this->get(route('admin.cms.cabinet-tablet')); $response->assertSuccessful(); $response->assertSeeLivewire(CabinetInfoTablet::class); }); test('component mounts with existing settings', function () { CabinetTabletSetting::factory()->create([ 'store_status' => 'notice', 'notice_headline' => 'Sonderverkauf', 'contact_phone' => '0521 12345', 'hours_monday_open' => '10:00', 'hours_monday_close' => '18:00', ]); $user = User::factory()->create(); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->assertSet('storeStatus', 'notice') ->assertSet('noticeHeadline', 'Sonderverkauf') ->assertSet('contactPhone', '0521 12345'); }); test('save persists settings to database', function () { $user = User::factory()->create(); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->set('storeStatus', 'notice') ->set('noticeHeadline', 'Winterpause') ->set('noticeSubtext', 'Bis 02.01. geschlossen') ->set('contactPhone', '0521 99999') ->set('contactEmail', 'test@example.com') ->call('save') ->assertHasNoErrors(); $settings = CabinetTabletSetting::current(); expect($settings->store_status)->toBe('notice'); expect($settings->notice_headline)->toBe('Winterpause'); expect($settings->contact_phone)->toBe('0521 99999'); }); test('save validates store status', function () { $user = User::factory()->create(); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->set('storeStatus', 'open') // 'open' is not a valid mode anymore ->call('save') ->assertHasErrors(['storeStatus']); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->set('storeStatus', 'warning') ->call('save') ->assertHasNoErrors(['storeStatus']); }); test('save validates override time format', function () { $user = User::factory()->create(); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->set('overrideOpenToday', 'abc') ->call('save') ->assertHasErrors(['overrideOpenToday']); }); test('save validates email format', function () { $user = User::factory()->create(); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->set('contactEmail', 'not-an-email') ->call('save') ->assertHasErrors(['contactEmail']); }); test('save validates headline max length', function () { $user = User::factory()->create(); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->set('noticeHeadline', str_repeat('A', 41)) ->call('save') ->assertHasErrors(['noticeHeadline']); }); test('save allows empty opening hours for closed days', function () { CabinetTabletSetting::factory()->create([ 'hours_monday_open' => '10:00', 'hours_monday_close' => '18:00', ]); $user = User::factory()->create(); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->set('hoursMondayOpen', '') ->set('hoursMondayClose', '') ->call('save') ->assertHasNoErrors(); $settings = CabinetTabletSetting::current(); expect($settings->hours_monday_open)->toBeNull(); expect($settings->hours_monday_close)->toBeNull(); }); test('clearOverrides resets override fields', function () { CabinetTabletSetting::factory()->create([ 'override_open_today' => '09:00', 'override_close_today' => '20:00', ]); $user = User::factory()->create(); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->assertSet('overrideOpenToday', '09:00') ->assertSet('overrideCloseToday', '20:00') ->call('clearOverrides') ->assertSet('overrideOpenToday', '') ->assertSet('overrideCloseToday', ''); $settings = CabinetTabletSetting::current(); expect($settings->override_open_today)->toBeNull(); expect($settings->override_close_today)->toBeNull(); }); // ======================================== // Zeit-Picker: Leeren per X (DOM-Payload) // ======================================== // // Der Flux-Zeit-Picker meldet das Leeren per X nicht zuverlaessig an wire:model. // Das Formular liest die Werte deshalb beim Absenden aus dem DOM und uebergibt sie // an save(). Diese Tests sichern genau diesen Pfad ab. test('save uses DOM values even when the livewire properties are still stale', function () { CabinetTabletSetting::factory()->create([ 'hours_monday_open' => '10:00', 'hours_monday_close' => '18:00', ]); $user = User::factory()->create(); // Properties bleiben auf dem alten Wert (wire:model hat das Leeren nicht mitbekommen), // das DOM meldet beide Felder als leer. Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->assertSet('hoursMondayOpen', '10:00') ->call('save', ['hoursMondayOpen' => '', 'hoursMondayClose' => '']) ->assertHasNoErrors(); $settings = CabinetTabletSetting::current(); expect($settings->hours_monday_open)->toBeNull(); expect($settings->hours_monday_close)->toBeNull(); }); test('save clears several days in one submit, not just the last one', function () { CabinetTabletSetting::factory()->create([ 'hours_monday_open' => '10:00', 'hours_monday_close' => '18:00', 'hours_tuesday_open' => '10:00', 'hours_tuesday_close' => '18:00', 'hours_wednesday_open' => '10:00', 'hours_wednesday_close' => '18:00', ]); $user = User::factory()->create(); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->call('save', [ 'hoursMondayOpen' => '', 'hoursMondayClose' => '', 'hoursTuesdayOpen' => '', 'hoursTuesdayClose' => '', 'hoursWednesdayOpen' => '10:00', 'hoursWednesdayClose' => '18:00', ]) ->assertHasNoErrors(); $settings = CabinetTabletSetting::current(); expect($settings->hours_monday_open)->toBeNull(); expect($settings->hours_monday_close)->toBeNull(); expect($settings->hours_tuesday_open)->toBeNull(); expect($settings->hours_tuesday_close)->toBeNull(); expect($settings->hours_wednesday_open)->toBe('10:00'); expect($settings->hours_wednesday_close)->toBe('18:00'); }); test('save clears only the open time and keeps the close time', function () { CabinetTabletSetting::factory()->create([ 'hours_friday_open' => '10:00', 'hours_friday_close' => '18:00', ]); $user = User::factory()->create(); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->call('save', ['hoursFridayOpen' => '', 'hoursFridayClose' => '18:00']) ->assertHasNoErrors(); $settings = CabinetTabletSetting::current(); expect($settings->hours_friday_open)->toBeNull(); expect($settings->hours_friday_close)->toBe('18:00'); }); test('save without a DOM payload falls back to the wire:model properties', function () { CabinetTabletSetting::factory()->create([ 'hours_saturday_open' => '10:00', 'hours_saturday_close' => '14:00', ]); $user = User::factory()->create(); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->set('hoursSaturdayOpen', '11:00') ->call('save') ->assertHasNoErrors(); $settings = CabinetTabletSetting::current(); expect($settings->hours_saturday_open)->toBe('11:00'); expect($settings->hours_saturday_close)->toBe('14:00'); }); test('the DOM payload cannot write non-time properties', function () { CabinetTabletSetting::factory()->create([ 'store_status' => 'notice', 'notice_headline' => 'Heute erst ab 11:00 Uhr', 'contact_email' => 'info@cabinet-bielefeld.de', ]); $user = User::factory()->create(); Livewire::actingAs($user) ->test(CabinetInfoTablet::class) ->call('save', [ 'hoursSundayOpen' => '12:00', 'storeStatus' => 'auto', 'contactEmail' => 'angreifer@example.com', ]) ->assertHasNoErrors(); $settings = CabinetTabletSetting::current(); expect($settings->hours_sunday_open)->toBe('12:00'); expect($settings->store_status)->toBe('notice'); expect($settings->contact_email)->toBe('info@cabinet-bielefeld.de'); });