diff --git a/app/Livewire/NextSpeedtestBanner.php b/app/Livewire/NextSpeedtestBanner.php new file mode 100644 index 000000000..2e20874ac --- /dev/null +++ b/app/Livewire/NextSpeedtestBanner.php @@ -0,0 +1,22 @@ +getNextRunDate(timeZone: config('app.display_timezone'))); - } - - return null; - } - #[Computed] public function platformStats(): array { diff --git a/app/Services/ScheduledSpeedtestService.php b/app/Services/ScheduledSpeedtestService.php new file mode 100644 index 000000000..8f9b85fc6 --- /dev/null +++ b/app/Services/ScheduledSpeedtestService.php @@ -0,0 +1,29 @@ +getNextRunDate(timeZone: config('app.display_timezone')) + ); + } +} diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index e31a16ba8..e1b26abed 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -1,5 +1,7 @@
+ + @auth @endauth diff --git a/resources/views/filament/pages/dashboard.blade.php b/resources/views/filament/pages/dashboard.blade.php index 42eb6bbf5..42a849976 100644 --- a/resources/views/filament/pages/dashboard.blade.php +++ b/resources/views/filament/pages/dashboard.blade.php @@ -1,5 +1,7 @@
+ + diff --git a/resources/views/livewire/next-speedtest-banner.blade.php b/resources/views/livewire/next-speedtest-banner.blade.php new file mode 100644 index 000000000..ce65f81d7 --- /dev/null +++ b/resources/views/livewire/next-speedtest-banner.blade.php @@ -0,0 +1,17 @@ +
+ @if ($this->nextSpeedtest) +
+
+
+ +
+ +
+

+ Next scheduled test at {{ $this->nextSpeedtest->timezone(config('app.display_timezone'))->format('F jS, Y, g:i a') }}. +

+
+
+
+ @endif +
diff --git a/resources/views/livewire/platform-stats.blade.php b/resources/views/livewire/platform-stats.blade.php index c120845b6..567c1f31a 100644 --- a/resources/views/livewire/platform-stats.blade.php +++ b/resources/views/livewire/platform-stats.blade.php @@ -1,5 +1,5 @@
-
+

{{ __('general.statistics') }} @@ -23,25 +23,7 @@

--}} - @filled($this->nextSpeedtest) - - - Next Speedtest in - - -

{{ $this->nextSpeedtest->diffForHumans() }}

-
- @else - - - Next Speedtest in - - -

No scheduled speedtests

-
- @endfilled - - + Total tests @@ -49,7 +31,7 @@

{{ $this->platformStats['total'] }}

- + Total completed tests @@ -57,7 +39,7 @@

{{ $this->platformStats['completed'] }}

- + Total failed tests diff --git a/tests/Unit/Services/ScheduledSpeedtestServiceTest.php b/tests/Unit/Services/ScheduledSpeedtestServiceTest.php new file mode 100644 index 000000000..e8c4cc5af --- /dev/null +++ b/tests/Unit/Services/ScheduledSpeedtestServiceTest.php @@ -0,0 +1,67 @@ +set('speedtest.schedule', null); + + $result = ScheduledSpeedtestService::getNextScheduledTest(); + + expect($result)->toBeNull(); +}); + +test('returns null when schedule config is false', function () { + config()->set('speedtest.schedule', false); + + $result = ScheduledSpeedtestService::getNextScheduledTest(); + + expect($result)->toBeNull(); +}); + +test('returns null when schedule config is blank string', function () { + config()->set('speedtest.schedule', ''); + + $result = ScheduledSpeedtestService::getNextScheduledTest(); + + expect($result)->toBeNull(); +}); + +test('returns Carbon instance when schedule is configured', function () { + config()->set('speedtest.schedule', '*/5 * * * *'); // Every 5 minutes + + $result = ScheduledSpeedtestService::getNextScheduledTest(); + + expect($result)->toBeInstanceOf(Carbon::class); +}); + +test('returns correct next scheduled time for hourly cron', function () { + config()->set('speedtest.schedule', '0 * * * *'); // Every hour at minute 0 + config()->set('app.display_timezone', 'UTC'); + + $result = ScheduledSpeedtestService::getNextScheduledTest(); + + expect($result)->toBeInstanceOf(Carbon::class); + expect($result->minute)->toBe(0); +}); + +test('returns correct next scheduled time for daily cron', function () { + config()->set('speedtest.schedule', '0 0 * * *'); // Every day at midnight + config()->set('app.display_timezone', 'UTC'); + + $result = ScheduledSpeedtestService::getNextScheduledTest(); + + expect($result)->toBeInstanceOf(Carbon::class); + expect($result->hour)->toBe(0); + expect($result->minute)->toBe(0); +}); + +test('returns future date for next scheduled test', function () { + config()->set('speedtest.schedule', '*/5 * * * *'); // Every 5 minutes + config()->set('app.display_timezone', 'UTC'); + + $result = ScheduledSpeedtestService::getNextScheduledTest(); + + expect($result)->toBeInstanceOf(Carbon::class); + expect($result->isFuture())->toBeTrue(); +});