createService(); $data = $service->mapResponseIntoTimePoints($json, 'daily'); $this->assertEquals("2025-01-26", $data[0]->date->format('Y-m-d')); $this->assertEquals(3.1, $data[0]->min); $this->assertEquals(9.1, $data[0]->max); $this->assertEquals("2025-01-27", $data[1]->date->format('Y-m-d')); $this->assertEquals(2.3, $data[1]->min); $this->assertEquals(8.3, $data[1]->max); } #[DataProvider('invalidDataGenerator')] public function testDailyInvalidDataTimeFormat(string $json): void { $this->expectException(\InvalidArgumentException::class); $json = json_decode($json, true); $service = $this->createService(); $service->mapResponseIntoTimePoints($json, 'daily'); } /** * @return array> */ public static function invalidDataGenerator(): array { return [ // invalid date format (no iso) ['{"latitude":50.08,"longitude":14.439999,"generationtime_ms":0.027298927307128906,"utc_offset_seconds":3600,"timezone":"Europe/Prague","timezone_abbreviation":"GMT+1","elevation":219.0,"daily_units":{"time":"iso86013","temperature_2m_max":"°C","temperature_2m_min":"°C"},"daily":{"time":["2025-01-26","2025-01-27"],"temperature_2m_max":[9.1,8.3],"temperature_2m_min":[3.1,2.3]}}'], // invalid temp format (from) ['{"latitude":50.08,"longitude":14.439999,"generationtime_ms":0.027298927307128906,"utc_offset_seconds":3600,"timezone":"Europe/Prague","timezone_abbreviation":"GMT+1","elevation":219.0,"daily_units":{"time":"iso8601","temperature_2m_max":"°C","temperature_2m_min":"°C"},"daily":{"time":["2025-01-26","2025-01-27"],"temperature_2m_max":[9.1,8.3],"temperature_2m_min":[3.1,"fff"]}}'], // invalid temp format (to) ['{"latitude":50.08,"longitude":14.439999,"generationtime_ms":0.027298927307128906,"utc_offset_seconds":3600,"timezone":"Europe/Prague","timezone_abbreviation":"GMT+1","elevation":219.0,"daily_units":{"time":"iso8601","temperature_2m_max":"°C","temperature_2m_min":"°C"},"daily":{"time":["2025-01-26","2025-01-27"],"temperature_2m_max":["fff",8.3],"temperature_2m_min":[3.1,2.3]}}'], // missing daily units ['{"latitude":50.08,"longitude":14.439999,"generationtime_ms":0.027298927307128906,"utc_offset_seconds":3600,"timezone":"Europe/Prague","timezone_abbreviation":"GMT+1","elevation":219.0,"daily":{"time":["2025-01-26","2025-01-27"],"temperature_2m_max":[9.1,8.3],"temperature_2m_min":[3.1,2.3]}}'], // missing tempature min ['{"latitude":50.08,"longitude":14.439999,"generationtime_ms":0.027298927307128906,"utc_offset_seconds":3600,"timezone":"Europe/Prague","timezone_abbreviation":"GMT+1","elevation":219.0,"daily_units":{"time":"iso8601","temperature_2m_max":"°C","temperature_2m_min":"°C"},"daily":{"time":["2025-01-26","2025-01-27"],"temperature_2m_max":[9.1,8.3]}}'], // different units ['{"latitude":50.08,"longitude":14.439999,"generationtime_ms":0.027298927307128906,"utc_offset_seconds":3600,"timezone":"Europe/Prague","timezone_abbreviation":"GMT+1","elevation":219.0,"daily_units":{"time":"iso8601","temperature_2m_max":"°K","temperature_2m_min":"°K"},"daily":{"time":["2025-01-26","2025-01-27"],"temperature_2m_max":[9.1,8.3],"temperature_2m_min":[3.1,2.3]}}'] ]; } private function createService(): OpenMeteoMapper { $mock = \Mockery::mock(WeatherAtTimePointFactory::class); $firstDate = \DateTimeImmutable::createFromFormat('Y-m-d', '2025-01-26'); $secondDate = \DateTimeImmutable::createFromFormat('Y-m-d', '2025-01-27'); if ($firstDate === false || $secondDate === false) { $this->fail('Can\'t create date'); } // @phpstan-ignore-next-line method.notFound $mock->shouldReceive('createFromUntrustedWithDateYYYYmmdd')->with('2025-01-26', '3.1', '9.1', null)->andReturn( new WeatherAtTimePoint( $firstDate, 3.1, 9.1, null ) ); // @phpstan-ignore-next-line method.notFound $mock->shouldReceive('createFromUntrustedWithDateYYYYmmdd')->with('2025-01-27', '2.3', '8.3', null)->andReturn( new WeatherAtTimePoint( $secondDate, 2.3, 8.3, null ) ); return new OpenMeteoMapper( $mock, // @phpstan-ignore argument.type Validation::createValidator() ); } }