toBe(0); $settings = CabinetTabletSetting::current(); expect($settings)->toBeInstanceOf(CabinetTabletSetting::class); expect($settings->id)->toBe(1); expect(CabinetTabletSetting::count())->toBe(1); }); test('current() returns the same row on subsequent calls', function () { $first = CabinetTabletSetting::current(); $second = CabinetTabletSetting::current(); expect($first->id)->toBe($second->id); expect(CabinetTabletSetting::count())->toBe(1); }); test('getHoursArray returns all seven days as display strings', function () { $settings = CabinetTabletSetting::factory()->create(); $hours = $settings->getHoursArray(); expect($hours)->toHaveKeys(['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']); expect($hours['monday'])->toBe('10:00 – 18:00'); expect($hours['sunday'])->toBe('Geschlossen'); }); test('getHoursArray shows Geschlossen for days with null times', function () { $settings = CabinetTabletSetting::factory()->create([ 'hours_wednesday_open' => null, 'hours_wednesday_close' => null, ]); expect($settings->getHoursArray()['wednesday'])->toBe('Geschlossen'); }); test('clearOverrides nulls both override fields', function () { $settings = CabinetTabletSetting::factory()->create([ 'override_open_today' => '09:00', 'override_close_today' => '20:00', ]); $settings->clearOverrides(); $settings->refresh(); expect($settings->override_open_today)->toBeNull(); expect($settings->override_close_today)->toBeNull(); }); test('next_appointment_date is cast to date', function () { $settings = CabinetTabletSetting::factory()->create([ 'next_appointment_date' => '2026-03-15', ]); expect($settings->next_appointment_date)->toBeInstanceOf(Carbon::class); expect($settings->next_appointment_date->format('Y-m-d'))->toBe('2026-03-15'); }); test('computeStatus returns open when within opening hours', function () { $settings = CabinetTabletSetting::factory()->create([ 'store_status' => 'auto', 'hours_thursday_open' => '10:00', 'hours_thursday_close' => '18:00', ]); // Thursday 12:00 Berlin time Carbon::setTestNow(Carbon::create(2026, 3, 5, 12, 0, 0, 'Europe/Berlin')); $result = $settings->computeStatus(); expect($result['status'])->toBe('open'); expect($result['today_close'])->toBe('18:00'); expect($result['next_open'])->toBeNull(); Carbon::setTestNow(); }); test('computeStatus returns closed before opening time', function () { $settings = CabinetTabletSetting::factory()->create([ 'store_status' => 'auto', 'hours_thursday_open' => '10:00', 'hours_thursday_close' => '18:00', ]); // Thursday 08:00 Berlin time Carbon::setTestNow(Carbon::create(2026, 3, 5, 8, 0, 0, 'Europe/Berlin')); $result = $settings->computeStatus(); expect($result['status'])->toBe('closed'); expect($result['next_open']['label'])->toBe('Heute'); expect($result['next_open']['time'])->toBe('10:00'); Carbon::setTestNow(); }); test('computeStatus returns closed after closing time with next day', function () { $settings = CabinetTabletSetting::factory()->create([ 'store_status' => 'auto', 'hours_thursday_open' => '10:00', 'hours_thursday_close' => '18:00', 'hours_friday_open' => '10:00', 'hours_friday_close' => '18:00', ]); // Thursday 20:00 Berlin time Carbon::setTestNow(Carbon::create(2026, 3, 5, 20, 0, 0, 'Europe/Berlin')); $result = $settings->computeStatus(); expect($result['status'])->toBe('closed'); expect($result['next_open']['label'])->toBe('Morgen'); expect($result['next_open']['time'])->toBe('10:00'); Carbon::setTestNow(); }); test('computeStatus returns notice when store_status is notice', function () { $settings = CabinetTabletSetting::factory()->create([ 'store_status' => 'notice', 'notice_headline' => 'Wir haben Urlaub', ]); $result = $settings->computeStatus(); expect($result['status'])->toBe('notice'); expect($result['next_open'])->toBeNull(); }); test('computeStatus returns warning when store_status is warning', function () { $settings = CabinetTabletSetting::factory()->create([ 'store_status' => 'warning', 'notice_headline' => 'Notfall', ]); $result = $settings->computeStatus(); expect($result['status'])->toBe('warning'); expect($result['next_open'])->toBeNull(); }); test('computeStatus returns closed when store_status is manually closed', function () { $settings = CabinetTabletSetting::factory()->create([ 'store_status' => 'closed', 'hours_friday_open' => '10:00', 'hours_friday_close' => '18:00', ]); // Thursday 12:00 (normally would be open, but manually closed) Carbon::setTestNow(Carbon::create(2026, 3, 5, 12, 0, 0, 'Europe/Berlin')); $result = $settings->computeStatus(); expect($result['status'])->toBe('closed'); expect($result['next_open']['label'])->toBe('Morgen'); Carbon::setTestNow(); }); test('computeStatus uses override times when set', function () { $settings = CabinetTabletSetting::factory()->create([ 'store_status' => 'auto', 'hours_thursday_open' => '10:00', 'hours_thursday_close' => '18:00', 'override_open_today' => '12:00', 'override_close_today' => '16:00', ]); // Thursday 11:00 – after regular open, but before override open Carbon::setTestNow(Carbon::create(2026, 3, 5, 11, 0, 0, 'Europe/Berlin')); $result = $settings->computeStatus(); expect($result['status'])->toBe('closed'); expect($result['next_open']['time'])->toBe('12:00'); Carbon::setTestNow(); }); test('computeStatus skips closed days when finding next open time', function () { $settings = CabinetTabletSetting::factory()->create([ 'store_status' => 'auto', 'hours_thursday_open' => '10:00', 'hours_thursday_close' => '18:00', 'hours_friday_open' => null, 'hours_friday_close' => null, 'hours_saturday_open' => '10:00', 'hours_saturday_close' => '14:00', 'hours_sunday_open' => null, 'hours_sunday_close' => null, ]); // Thursday 20:00 – after closing, Friday is closed Carbon::setTestNow(Carbon::create(2026, 3, 5, 20, 0, 0, 'Europe/Berlin')); $result = $settings->computeStatus(); expect($result['next_open']['label'])->toBe('Samstag'); expect($result['next_open']['time'])->toBe('10:00'); Carbon::setTestNow(); });