Files
myep/tests/Controller/Api/TravelControllerTest.php
T

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);
}
}