queue(200, json_decode((string) file_get_contents(__DIR__ . '/fixtures/forecast.json'), true)); $daily = (new OpenMeteoClient($http))->dailyForecast(51.82, 6.55, 'Europe/Berlin'); self::assertCount(6, $daily['time']); self::assertSame('https://api.open-meteo.com/v1/forecast', $http->requests[0]['url']); self::assertSame([ 'latitude' => 51.82, 'longitude' => 6.55, 'daily' => 'weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max', 'timezone' => 'Europe/Berlin', 'forecast_days' => 6, ], $http->requests[0]['params']); } public function testErrorStatusIsUpstreamException(): void { $http = (new FakeHttp())->queue(429, ['reason' => 'rate limit']); $this->expectException(UpstreamException::class); (new OpenMeteoClient($http))->dailyForecast(1, 2, 'UTC'); } public function testMissingDailyIsUpstreamException(): void { $http = (new FakeHttp())->queue(200, ['hourly' => []]); $this->expectException(UpstreamException::class); (new OpenMeteoClient($http))->dailyForecast(1, 2, 'UTC'); } }