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