189 lines
6.6 KiB
PHP
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;
|
|
}
|
|
}
|