feat: new service category 'VEG'
This commit is contained in:
@@ -0,0 +1,215 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Tests\Form\Service;
|
||||
|
||||
use App\BusProNet\Constants;
|
||||
use App\BusProNet\Model\Service;
|
||||
use App\BusProNet\Model\Travel;
|
||||
use App\Form\Model\BookingDto;
|
||||
use App\Form\Model\ParticipantDto;
|
||||
use App\Form\Service\ParticipantVegFieldHandler;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class ParticipantVegFieldHandlerTest extends TestCase
|
||||
{
|
||||
private ParticipantVegFieldHandler $handler;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->handler = new ParticipantVegFieldHandler();
|
||||
}
|
||||
|
||||
public function testGetFieldName(): void
|
||||
{
|
||||
$this->assertEquals('veg', $this->handler->getFieldName());
|
||||
}
|
||||
|
||||
public function testGetDependencies(): void
|
||||
{
|
||||
$dependencies = $this->handler->getDependencies();
|
||||
|
||||
$this->assertEquals(['dateOfBirth'], $dependencies);
|
||||
}
|
||||
|
||||
public function testShouldProcessAlwaysReturnsTrue(): void
|
||||
{
|
||||
// Should always process to handle deselection cases
|
||||
$this->assertTrue($this->handler->shouldProcess([], BookingDto::MODE_CREATE, 0));
|
||||
$this->assertTrue($this->handler->shouldProcess([], BookingDto::MODE_EDIT, 0));
|
||||
$this->assertTrue($this->handler->shouldProcess(['veg' => '123'], BookingDto::MODE_CREATE, 0));
|
||||
}
|
||||
|
||||
public function testProcessFieldDoesNothingWhenNoParticipant(): void
|
||||
{
|
||||
$bookingDto = $this->createMockBookingDto();
|
||||
$bookingDto->method('getParticipants')->willReturn([]);
|
||||
|
||||
$this->handler->processField(['veg' => '123'], $bookingDto, 0);
|
||||
|
||||
// No assertions needed - just ensure no exceptions are thrown
|
||||
$this->addToAssertionCount(1);
|
||||
}
|
||||
|
||||
public function testProcessFieldClearsVegWhenNullSelection(): void
|
||||
{
|
||||
$participant = new ParticipantDto();
|
||||
$participant->veg = $this->createService(123);
|
||||
|
||||
$travel = $this->createMockTravel([]);
|
||||
$bookingDto = $this->createMockBookingDto($travel);
|
||||
$bookingDto->method('getParticipants')->willReturn([$participant]);
|
||||
|
||||
$this->handler->processField(['veg' => null], $bookingDto, 0);
|
||||
|
||||
$this->assertNull($participant->veg);
|
||||
}
|
||||
|
||||
public function testProcessFieldClearsVegWhenEmptyStringSelection(): void
|
||||
{
|
||||
$participant = new ParticipantDto();
|
||||
$participant->veg = $this->createService(123);
|
||||
|
||||
$travel = $this->createMockTravel([]);
|
||||
$bookingDto = $this->createMockBookingDto($travel);
|
||||
$bookingDto->method('getParticipants')->willReturn([$participant]);
|
||||
|
||||
$this->handler->processField(['veg' => ''], $bookingDto, 0);
|
||||
|
||||
$this->assertNull($participant->veg);
|
||||
}
|
||||
|
||||
public function testProcessFieldClearsVegWhenMissingFromData(): void
|
||||
{
|
||||
$participant = new ParticipantDto();
|
||||
$participant->veg = $this->createService(123);
|
||||
|
||||
$travel = $this->createMockTravel([]);
|
||||
$bookingDto = $this->createMockBookingDto($travel);
|
||||
$bookingDto->method('getParticipants')->willReturn([$participant]);
|
||||
|
||||
$this->handler->processField([], $bookingDto, 0);
|
||||
|
||||
$this->assertNull($participant->veg);
|
||||
}
|
||||
|
||||
public function testProcessFieldClearsVegWhenNotFoundInAvailableServices(): void
|
||||
{
|
||||
$participant = new ParticipantDto();
|
||||
$otherService = $this->createService(456);
|
||||
|
||||
$travel = $this->createMockTravel([$otherService]);
|
||||
$bookingDto = $this->createMockBookingDto($travel);
|
||||
$bookingDto->method('getParticipants')->willReturn([$participant]);
|
||||
|
||||
$this->handler->processField(['veg' => '123'], $bookingDto, 0);
|
||||
|
||||
$this->assertNull($participant->veg);
|
||||
}
|
||||
|
||||
public function testProcessFieldSetsVegWhenAvailable(): void
|
||||
{
|
||||
$vegService = $this->createService(123);
|
||||
$participant = new ParticipantDto();
|
||||
|
||||
$travel = $this->createMockTravel([$vegService]);
|
||||
$bookingDto = $this->createMockBookingDto($travel);
|
||||
$bookingDto->method('getParticipants')->willReturn([$participant]);
|
||||
|
||||
$this->handler->processField(['veg' => '123'], $bookingDto, 0);
|
||||
|
||||
$this->assertSame($vegService, $participant->veg);
|
||||
}
|
||||
|
||||
public function testProcessFieldWorksWithStringAndIntegerIds(): void
|
||||
{
|
||||
$vegService = $this->createService(123); // Integer ID
|
||||
$participant = new ParticipantDto();
|
||||
|
||||
$travel = $this->createMockTravel([$vegService]);
|
||||
$bookingDto = $this->createMockBookingDto($travel);
|
||||
$bookingDto->method('getParticipants')->willReturn([$participant]);
|
||||
|
||||
$this->handler->processField(['veg' => '123'], $bookingDto, 0); // String selection
|
||||
|
||||
$this->assertSame($vegService, $participant->veg);
|
||||
}
|
||||
|
||||
public function testProcessFieldHandlesEmptyServicesArray(): void
|
||||
{
|
||||
$participant = new ParticipantDto();
|
||||
|
||||
$travel = $this->createMockTravel([]);
|
||||
$bookingDto = $this->createMockBookingDto($travel);
|
||||
$bookingDto->method('getParticipants')->willReturn([$participant]);
|
||||
|
||||
$this->handler->processField(['veg' => '123'], $bookingDto, 0);
|
||||
|
||||
$this->assertNull($participant->veg);
|
||||
}
|
||||
|
||||
public function testProcessFieldSelectsFromMultipleVegOptions(): void
|
||||
{
|
||||
$vegetarian = $this->createService(1, 'Vegetarisch');
|
||||
$vegan = $this->createService(2, 'Vegan');
|
||||
$participant = new ParticipantDto();
|
||||
|
||||
$travel = $this->createMockTravel([$vegetarian, $vegan]);
|
||||
$bookingDto = $this->createMockBookingDto($travel);
|
||||
$bookingDto->method('getParticipants')->willReturn([$participant]);
|
||||
|
||||
$this->handler->processField(['veg' => '2'], $bookingDto, 0);
|
||||
|
||||
$this->assertSame($vegan, $participant->veg);
|
||||
}
|
||||
|
||||
public function testGetFieldStateModificationsReturnsEmptyArray(): void
|
||||
{
|
||||
$bookingDto = $this->createMockBookingDto();
|
||||
|
||||
$result = $this->handler->getFieldStateModifications([], $bookingDto, 0);
|
||||
|
||||
$this->assertIsArray($result);
|
||||
$this->assertEmpty($result);
|
||||
}
|
||||
|
||||
public function testGetAffectedFieldNamesReturnsEmptyArray(): void
|
||||
{
|
||||
$result = $this->handler->getAffectedFieldNames();
|
||||
|
||||
$this->assertIsArray($result);
|
||||
$this->assertEmpty($result);
|
||||
}
|
||||
|
||||
private function createService(int $id, string $label = 'Test Service'): Service
|
||||
{
|
||||
$service = new Service();
|
||||
$service->id = $id;
|
||||
$service->label = $label;
|
||||
$service->subType = Constants::TOKEN_VEG;
|
||||
|
||||
return $service;
|
||||
}
|
||||
|
||||
private function createMockTravel(array $vegServices): Travel
|
||||
{
|
||||
$travel = $this->createMock(Travel::class);
|
||||
$travel->method('getAdditionalServicesBySubTypes')
|
||||
->with(Constants::TOKEN_VEG, true)
|
||||
->willReturn($vegServices);
|
||||
|
||||
return $travel;
|
||||
}
|
||||
|
||||
private function createMockBookingDto(?Travel $travel = null): BookingDto
|
||||
{
|
||||
$bookingDto = $this->createMock(BookingDto::class);
|
||||
|
||||
if (null !== $travel) {
|
||||
$bookingDto->travel = $travel;
|
||||
}
|
||||
|
||||
return $bookingDto;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user