b2in/tests/Feature/Models/CabinetTabletSettingTest.php
2026-04-10 17:18:17 +02:00

208 lines
6.7 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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();
});