Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
48d68b86fa | ||
|
|
b6f4836b12 |
@@ -123,11 +123,18 @@ final class DashboardService
|
|||||||
return ['days' => [], 'stale' => true];
|
return ['days' => [], 'stale' => true];
|
||||||
}
|
}
|
||||||
$result = $this->fetch('forecast', fn() => $this->source->forecast($lat, $lon, $tz->getName()), self::ERR_FORECAST);
|
$result = $this->fetch('forecast', fn() => $this->source->forecast($lat, $lon, $tz->getName()), self::ERR_FORECAST);
|
||||||
if ($result['data'] === null) {
|
$daily = is_array($result['data']['daily'] ?? null) ? $result['data']['daily'] : null;
|
||||||
return ['days' => [], 'stale' => $result['stale']];
|
if ($daily === null) {
|
||||||
|
// Data ontbreekt (echte storing, al gemeld door fetch()), of de cache staat nog in een ouder
|
||||||
|
// formaat na een deploy dat de opgeslagen vorm wijzigde. In beide gevallen liever zichtbaar
|
||||||
|
// niets tonen dan stil een lege verwachting zonder foutmelding.
|
||||||
|
if ($result['data'] !== null) {
|
||||||
|
$this->addError(self::ERR_FORECAST);
|
||||||
|
}
|
||||||
|
return ['days' => [], 'stale' => true];
|
||||||
}
|
}
|
||||||
|
|
||||||
$days = ForecastMapper::map($result['data']['daily'] ?? []);
|
$days = ForecastMapper::map($daily);
|
||||||
$hourlyByDate = HourlyForecastMapper::mapByDate($result['data']['hourly'] ?? [], $tz);
|
$hourlyByDate = HourlyForecastMapper::mapByDate($result['data']['hourly'] ?? [], $tz);
|
||||||
foreach ($days as &$day) {
|
foreach ($days as &$day) {
|
||||||
$day['hourly'] = $hourlyByDate[$day['date']] ?? [];
|
$day['hourly'] = $hourlyByDate[$day['date']] ?? [];
|
||||||
|
|||||||
@@ -182,6 +182,22 @@ final class DashboardServiceTest extends TestCase
|
|||||||
self::assertSame(16.4, $p['outdoor']['temp']);
|
self::assertSame(16.4, $p['outdoor']['temp']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testLegacyCachedForecastShapeIsTreatedAsUnavailableNotSilentlyEmpty(): void
|
||||||
|
{
|
||||||
|
// Vóór 2026-09-13 cachete DashboardService het platte "daily"-blok direct onder de sleutel
|
||||||
|
// "forecast". Na de uitbreiding met uurdata verwacht de code {daily, hourly}. Een nog niet
|
||||||
|
// verlopen cache in het oude formaat mag niet stil een lege verwachting zonder foutmelding geven.
|
||||||
|
$legacyDailyOnly = json_decode((string) file_get_contents(__DIR__ . '/fixtures/forecast.json'), true)['daily'];
|
||||||
|
(new Cache($this->dir))->write('forecast', $legacyDailyOnly, (new \DateTimeImmutable('2026-09-11 12:30:00 UTC'))->getTimestamp());
|
||||||
|
|
||||||
|
$p = $this->service()->build();
|
||||||
|
|
||||||
|
self::assertSame([], $p['forecast']);
|
||||||
|
self::assertTrue($p['forecast_stale']);
|
||||||
|
self::assertSame(['forecast_unavailable'], $p['errors']);
|
||||||
|
self::assertSame(0, $this->source->calls['forecast'], 'de cache was nog vers, dus geen live call verwacht');
|
||||||
|
}
|
||||||
|
|
||||||
public function testSecondBuildWithinTtlUsesCache(): void
|
public function testSecondBuildWithinTtlUsesCache(): void
|
||||||
{
|
{
|
||||||
$this->service()->build();
|
$this->service()->build();
|
||||||
|
|||||||
Reference in New Issue
Block a user