Files
myep/tests/Service/CmsDataProviderTest.php

119 lines
4.9 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Tests\Service;
use App\Service\CmsDataProvider;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\HttpClient\MockHttpClient;
use Symfony\Component\HttpClient\Response\MockResponse;
class CmsDataProviderTest extends TestCase
{
public function testGetHotelDetailsMapsSnakeCaseFieldsToDto(): void
{
$client = new MockHttpClient(fn () => new MockResponse(json_encode([
'success' => true,
'name' => 'Hotel Alpin',
'address' => "Musterstraße 1\n1234 Musterort",
'description' => '<p>Beschreibung</p>',
'features' => '<p>Ausstattung</p>',
'room_types' => '<p>Zimmer</p>',
'additional_information' => '<p>Weitere Infos</p>',
'images' => ['resized' => ['l' => [['url' => 'l.jpg', 'alt' => 'Alt']]]],
'icons' => [
['icon' => 'bed', 'label' => '69 Betten'],
['icon' => 'wifi', 'label' => 'WiFi'],
['icon' => 'sauna', 'label' => false],
],
'region' => [
'name' => 'Alpenregion',
'latitude' => 47.1,
'longitude' => 11.2,
'webcam' => 'https://webcam.test',
'ski_area' => '<p>Skigebiet</p>',
'ski_area_extended' => '<p>Mehr Skigebiet</p>',
'description' => '<p>Region</p>',
'news' => '<p>News</p>',
'length' => '42',
'altitude' => '1800',
'lifts' => '5',
'images' => ['resized' => ['l' => []]],
'region_maps' => ['map1.jpg', 'map2.jpg'],
],
], JSON_THROW_ON_ERROR)));
$provider = new CmsDataProvider($client, new ArrayAdapter());
$data = $provider->getHotelDetails('HOTEL1');
self::assertNotNull($data);
self::assertSame('Hotel Alpin', $data->name);
self::assertSame("Musterstraße 1\n1234 Musterort", $data->address);
self::assertSame('<p>Zimmer</p>', $data->roomTypes);
self::assertSame('<p>Weitere Infos</p>', $data->additionalInformation);
self::assertSame([
['icon' => 'bed', 'label' => '69 Betten'],
['icon' => 'wifi', 'label' => 'WiFi'],
['icon' => 'sauna', 'label' => false],
], $data->icons);
self::assertNotNull($data->region);
self::assertSame('Alpenregion', $data->region->name);
self::assertSame('<p>Skigebiet</p>', $data->region->skiArea);
self::assertSame('<p>Mehr Skigebiet</p>', $data->region->skiAreaExtended);
self::assertSame(['map1.jpg', 'map2.jpg'], $data->region->regionMaps);
self::assertSame(42, $data->region->length);
self::assertSame(1800, $data->region->altitude);
self::assertSame(5, $data->region->lifts);
self::assertSame(47.1, $data->region->latitude);
self::assertSame(11.2, $data->region->longitude);
}
public function testGetHotelDetailsReturnsNullOnFailure(): void
{
$client = new MockHttpClient(fn () => new MockResponse('', ['http_code' => 500]));
$provider = new CmsDataProvider($client, new ArrayAdapter());
self::assertNull($provider->getHotelDetails('UNKNOWN'));
}
public function testFetchCalendarHotelsKeepsCodeAndName(): void
{
$client = new MockHttpClient(function (string $method, string $url) {
self::assertSame('https://cms.test/api/calendar-hotels', $url);
return new MockResponse(json_encode([
['code' => 'ASCGR', 'name' => 'Ahrntal - Gruppenhaus Christiler', 'products' => [['uid' => 710, 'name' => 'Gruppenhaus Christiler', 'season' => 'w']]],
['code' => 'DKI', 'name' => '', 'products' => []],
['code' => '', 'name' => 'No code'],
['name' => 'Missing code'],
], JSON_THROW_ON_ERROR));
}, 'https://cms.test/');
$hotels = (new CmsDataProvider($client, new ArrayAdapter()))->fetchCalendarHotels();
self::assertNotNull($hotels);
self::assertSame([['ASCGR', 'Ahrntal - Gruppenhaus Christiler'], ['DKI', 'DKI']], array_map(
static fn ($hotel) => [$hotel->code, $hotel->name],
$hotels,
));
}
public function testFetchCalendarHotelsIsNullOnAnErrorResponse(): void
{
$client = new MockHttpClient(new MockResponse('Forbidden', ['http_code' => 403]), 'https://cms.test/');
self::assertNull((new CmsDataProvider($client, new ArrayAdapter()))->fetchCalendarHotels());
}
public function testFetchCalendarHotelsIsNullWhenTheBodyIsNotAList(): void
{
$client = new MockHttpClient(new MockResponse('{"success":false}'), 'https://cms.test/');
self::assertNull((new CmsDataProvider($client, new ArrayAdapter()))->fetchCalendarHotels());
}
}