initital commit
This commit is contained in:
95
tests/Unit/Services/Remote/Mapper/OpenMeteoMapperTest.php
Normal file
95
tests/Unit/Services/Remote/Mapper/OpenMeteoMapperTest.php
Normal file
@@ -0,0 +1,95 @@
|
||||
<?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()
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user