208 lines
6.7 KiB
PHP
208 lines
6.7 KiB
PHP
<?php
|
||
|
||
use App\Models\CabinetTabletSetting;
|
||
use Illuminate\Support\Carbon;
|
||
|
||
test('current() creates a singleton settings row', function () {
|
||
expect(CabinetTabletSetting::count())->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();
|
||
});
|