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

189 lines
6.6 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Tests\Controller\Api;
use App\Controller\Api\ContingentController;
use App\Service\ContingentDataService;
use App\Service\TravelDataProvider;
use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
class ContingentControllerTest extends TestCase
{
public function testByDateQueryResolvesCodeReferences(): void
{
$contingentDataService = $this->createMock(ContingentDataService::class);
$travelDataProvider = $this->createMock(TravelDataProvider::class);
$travelDataProvider
->expects($this->once())
->method('mapHotelCodeToId')
->with('SBW-HOTEL')
->willReturn(157047);
$travelDataProvider
->expects($this->once())
->method('mapDateCodeToId')
->with('SBW131225')
->willReturn(11606);
$contingentDataService
->expects($this->once())
->method('getAvailableContingents')
->with(157047, 11606)
->willReturn([]);
$controller = $this->createController($contingentDataService, $travelDataProvider);
$request = Request::create('/api/contingents', 'GET', [
'hotelRef' => 'SBW-HOTEL',
'dateRef' => 'sbw-13/12/25',
]);
$response = $controller->byDate($request);
$this->assertSame(200, $response->getStatusCode());
}
public function testByDateQueryRequiresDateReference(): void
{
$contingentDataService = $this->createMock(ContingentDataService::class);
$travelDataProvider = $this->createMock(TravelDataProvider::class);
$controller = $this->createController($contingentDataService, $travelDataProvider);
$request = Request::create('/api/contingents', 'GET', [
'hotelRef' => '157047',
]);
$response = $controller->byDate($request);
$payload = json_decode((string) $response->getContent(), true);
$this->assertSame(400, $response->getStatusCode());
$this->assertSame('dateRef is required', $payload['error']);
}
public function testByDateQueryReturnsNotFoundForUnknownDateReference(): void
{
$contingentDataService = $this->createMock(ContingentDataService::class);
$travelDataProvider = $this->createMock(TravelDataProvider::class);
$travelDataProvider
->expects($this->once())
->method('mapHotelCodeToId')
->with('SBW-HOTEL')
->willReturn(157047);
$travelDataProvider
->expects($this->once())
->method('mapDateCodeToId')
->with('UNKNOWN')
->willReturn(null);
$contingentDataService
->expects($this->never())
->method('getAvailableContingents');
$controller = $this->createController($contingentDataService, $travelDataProvider);
$request = Request::create('/api/contingents', 'GET', [
'hotelRef' => 'SBW-HOTEL',
'dateRef' => 'unknown',
]);
$response = $controller->byDate($request);
$payload = json_decode((string) $response->getContent(), true);
$this->assertSame(404, $response->getStatusCode());
$this->assertSame('Not found', $payload['message']);
}
public function testRoomsQueryRequiresDateRange(): void
{
$contingentDataService = $this->createMock(ContingentDataService::class);
$travelDataProvider = $this->createMock(TravelDataProvider::class);
$controller = $this->createController($contingentDataService, $travelDataProvider);
$request = Request::create('/api/contingents/rooms', 'GET', [
'hotelRef' => '157047',
'dateRef' => '11606',
]);
$response = $controller->rooms($request);
$payload = json_decode((string) $response->getContent(), true);
$this->assertSame(400, $response->getStatusCode());
$this->assertSame('dateFrom and dateTo are required', $payload['error']);
}
public function testByDateQueryUsesNumericReferencesAsIdentifiers(): void
{
$contingentDataService = $this->createMock(ContingentDataService::class);
$travelDataProvider = $this->createMock(TravelDataProvider::class);
$travelDataProvider
->expects($this->never())
->method('mapHotelCodeToId');
$travelDataProvider
->expects($this->never())
->method('mapDateCodeToId');
$contingentDataService
->expects($this->once())
->method('getAvailableContingents')
->with(157047, 11606)
->willReturn([]);
$controller = $this->createController($contingentDataService, $travelDataProvider);
$request = Request::create('/api/contingents', 'GET', [
'hotelRef' => '157047',
'dateRef' => '11606',
]);
$response = $controller->byDate($request);
$this->assertSame(200, $response->getStatusCode());
}
public function testRoomsQueryForwardsOptionalMyEpUrl(): void
{
$contingentDataService = $this->createMock(ContingentDataService::class);
$travelDataProvider = $this->createMock(TravelDataProvider::class);
$contingentDataService
->expects($this->once())
->method('getAvailableRooms')
->with('2026-03-01', '2026-03-08', 157047, 11606, 'https://my.ep-reisen.de')
->willReturn([]);
$controller = $this->createController($contingentDataService, $travelDataProvider);
$request = Request::create('/api/contingents/rooms', 'GET', [
'hotelRef' => '157047',
'dateRef' => '11606',
'dateFrom' => '2026-03-01',
'dateTo' => '2026-03-08',
'my_ep_url' => 'https://my.ep-reisen.de',
]);
$response = $controller->rooms($request);
$this->assertSame(200, $response->getStatusCode());
}
private function createController(
ContingentDataService $contingentDataService,
TravelDataProvider $travelDataProvider,
): ContingentController {
$controller = new ContingentController($contingentDataService, $travelDataProvider);
$container = new Container();
$container->set('serializer', new Serializer([new ObjectNormalizer()], [new JsonEncoder()]));
$controller->setContainer($container);
return $controller;
}
}