balikobot-api/tests/Unit/Services/Remote/Mapper/OpenMeteoMapperTest.php

96 lines
5.4 KiB
PHP
Raw Normal View History

2025-01-26 21:17:23 +01:00
<?php
declare(strict_types=1);
namespace App\Tests\Unit\Services\Remote\Mapper;
use App\DTO\Factory\WeatherAtTimePointFactory;
use App\DTO\WeatherAtTimePoint;
use App\Services\Remote\Mapper\OpenMeteoMapper;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Validation;
class OpenMeteoMapperTest extends TestCase
{
public function testDailyData(): void
{
$data = '{"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,2.3]}}';
$json = json_decode($data, true);
$service = $this->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<int, array<int, string>>
*/
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()
);
}
}