86 lines
3.4 KiB
PHP
86 lines
3.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Controller\Api;
|
|
|
|
use App\BusProNet\ApiClient;
|
|
use App\BusProNet\Model\BaseData;
|
|
use App\BusProNet\Model\Notification;
|
|
use App\BusProNet\Model\Room;
|
|
use App\Controller\Api\TravelController;
|
|
use App\Service\TravelDataProvider;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Symfony\Component\DependencyInjection\Container;
|
|
use Symfony\Component\Serializer\Encoder\JsonEncoder;
|
|
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
|
|
use Symfony\Component\Serializer\Mapping\Loader\AttributeLoader;
|
|
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
|
|
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
|
|
use Symfony\Component\Serializer\Serializer;
|
|
|
|
class TravelControllerTest extends TestCase
|
|
{
|
|
public function testHotelAvailabilityOnlySerializesApiGroupFields(): void
|
|
{
|
|
$room = new Room();
|
|
$room->id = 1;
|
|
$room->label = 'Doppelzimmer';
|
|
$room->status = 'Frei';
|
|
$room->available = 2;
|
|
$room->price = 199.0;
|
|
// booking-only fields that must NOT appear in the API response
|
|
$room->dateFrom = new \DateTimeImmutable('2030-01-01');
|
|
$room->totalCount = 42;
|
|
$room->board = 'Halbpension';
|
|
|
|
$apiClient = $this->createMock(ApiClient::class);
|
|
$apiClient->expects($this->once())
|
|
->method('getHotelAvailability')
|
|
->willReturn(new BaseData([1 => $room]));
|
|
|
|
$controller = new TravelController($apiClient, $this->createMock(TravelDataProvider::class));
|
|
|
|
$classMetadataFactory = new ClassMetadataFactory(new AttributeLoader());
|
|
$serializer = new Serializer(
|
|
[new DateTimeNormalizer(), new ObjectNormalizer($classMetadataFactory)],
|
|
[new JsonEncoder()],
|
|
);
|
|
$container = new Container();
|
|
$container->set('serializer', $serializer);
|
|
$controller->setContainer($container);
|
|
|
|
$response = $controller->hotelAvailability(12345, 67890, new \DateTimeImmutable('2030-01-06'));
|
|
$payload = json_decode((string) $response->getContent(), true, 512, JSON_THROW_ON_ERROR);
|
|
|
|
$roomPayload = $payload['1'] ?? null;
|
|
$this->assertNotNull($roomPayload);
|
|
$this->assertSame('Frei', $roomPayload['status']);
|
|
$this->assertArrayNotHasKey('dateFrom', $roomPayload);
|
|
$this->assertArrayNotHasKey('totalCount', $roomPayload);
|
|
$this->assertArrayNotHasKey('board', $roomPayload);
|
|
}
|
|
|
|
public function testHotelAvailabilityReturnsErrorPayloadForApiNotification(): void
|
|
{
|
|
$apiClient = $this->createMock(ApiClient::class);
|
|
$apiClient->expects($this->once())
|
|
->method('getHotelAvailability')
|
|
->willReturn(new Notification(999, 'Hotel not found'));
|
|
|
|
$controller = new TravelController($apiClient, $this->createMock(TravelDataProvider::class));
|
|
|
|
$container = new Container();
|
|
$container->set('serializer', new Serializer(
|
|
[new ObjectNormalizer(new ClassMetadataFactory(new AttributeLoader()))],
|
|
[new JsonEncoder()],
|
|
));
|
|
$controller->setContainer($container);
|
|
|
|
$response = $controller->hotelAvailability(12345, 67890, new \DateTimeImmutable('2030-01-06'));
|
|
$payload = json_decode((string) $response->getContent(), true, 512, JSON_THROW_ON_ERROR);
|
|
|
|
$this->assertSame(['error' => 'Hotel not found', 'type' => 'api_error'], $payload);
|
|
}
|
|
}
|