feat: replace *Service suffix with role-based class names

This commit is contained in:
Björn Fromme
2026-04-16 13:34:54 +02:00
parent 0d2cc5b998
commit d1c92f2957
88 changed files with 435 additions and 435 deletions
+6 -6
View File
@@ -107,21 +107,21 @@ services:
arguments: arguments:
$path: '%path_to_keys%' $path: '%path_to_keys%'
App\Service\TravelSnapshotService: App\Service\TravelSnapshotManager:
arguments: arguments:
$retentionBufferDays: '%travel_snapshot_retention_buffer_days%' $retentionBufferDays: '%travel_snapshot_retention_buffer_days%'
App\Service\TravelDataService: App\Service\TravelDataProvider:
arguments: arguments:
$logger: '@monolog.logger.core' $logger: '@monolog.logger.core'
$preferRemote: '%env(bool:APP_TRAVEL_PREFER_REMOTE)%' $preferRemote: '%env(bool:APP_TRAVEL_PREFER_REMOTE)%'
$enableFallback: '%env(bool:APP_TRAVEL_ENABLE_FALLBACK)%' $enableFallback: '%env(bool:APP_TRAVEL_ENABLE_FALLBACK)%'
App\Service\BookingEditDataLoaderService: App\Service\BookingEditDataLoader:
arguments: arguments:
$bpnCache: '@bpn.cache' $bpnCache: '@bpn.cache'
App\Service\VoucherValidationService: App\Service\VoucherValidator:
arguments: arguments:
$cache: '@cache.app' $cache: '@cache.app'
$logger: '@monolog.logger.bpn' $logger: '@monolog.logger.bpn'
@@ -169,7 +169,7 @@ services:
$rules: $rules:
- '@App\BusProNet\Service\StatusRule\ChaperonServiceStatusRule' - '@App\BusProNet\Service\StatusRule\ChaperonServiceStatusRule'
App\Service\CmsDataService: App\Service\CmsDataProvider:
arguments: arguments:
$httpClient: '@typo3.client' $httpClient: '@typo3.client'
$apiKey: 'AbcAbc123'# dummy key, not yet implemented $apiKey: 'AbcAbc123'# dummy key, not yet implemented
@@ -178,7 +178,7 @@ services:
tags: tags:
- { name: monolog.processor } - { name: monolog.processor }
App\Service\NewsletterDoubleOptInService: App\Service\NewsletterManager:
arguments: arguments:
$newsletterConfirmationTtlHours: '%newsletter_confirmation_ttl_hours%' $newsletterConfirmationTtlHours: '%newsletter_confirmation_ttl_hours%'
@@ -12,8 +12,8 @@ use App\Form\Model\BankAccountDto;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Form\Model\RoomSelectionDto; use App\Form\Model\RoomSelectionDto;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\InsuranceService; use App\Service\InsuranceManager;
/** /**
* Processes booking form data and converts it into BusProNet API payload format. * Processes booking form data and converts it into BusProNet API payload format.
@@ -25,8 +25,8 @@ use App\Service\InsuranceService;
class BookingDataProcessor class BookingDataProcessor
{ {
public function __construct( public function __construct(
private readonly InsuranceService $insuranceService, private readonly InsuranceManager $insuranceService,
private readonly BookingPriceCalculatorService $priceCalculatorService, private readonly BookingPriceCalculator $priceCalculatorService,
private readonly ServiceMappingCollector $mappingCollector, private readonly ServiceMappingCollector $mappingCollector,
private readonly ParticipantServiceProcessor $serviceProcessor, private readonly ParticipantServiceProcessor $serviceProcessor,
private readonly BookingPayloadBuilder $payloadBuilder, private readonly BookingPayloadBuilder $payloadBuilder,
@@ -388,7 +388,7 @@ class BookingDataProcessor
$participantPrices[$index] = $this->priceCalculatorService->calculateIndividualParticipantPriceExcludingInsurance($bookingDto, $index); $participantPrices[$index] = $this->priceCalculatorService->calculateIndividualParticipantPriceExcludingInsurance($bookingDto, $index);
} }
// Use InsuranceService for proper type-based assignment with price tier matching // Use InsuranceManager for proper type-based assignment with price tier matching
$assignments = $this->insuranceService->batchAssignInsuranceToParticipants( $assignments = $this->insuranceService->batchAssignInsuranceToParticipants(
$selectableInsurances, $selectableInsurances,
$applicant->insurance, $applicant->insurance,
@@ -5,7 +5,7 @@ declare(strict_types=1);
namespace App\Command; namespace App\Command;
use App\BusProNet\XmlLoader\TravelLoader; use App\BusProNet\XmlLoader\TravelLoader;
use App\Service\TravelSnapshotService; use App\Service\TravelSnapshotManager;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\Command;
@@ -30,7 +30,7 @@ class BpnRefreshTravelSnapshotCommand extends Command
use LockableTrait; use LockableTrait;
public function __construct( public function __construct(
private readonly TravelSnapshotService $snapshotService, private readonly TravelSnapshotManager $snapshotService,
private readonly LoggerInterface $logger, private readonly LoggerInterface $logger,
private readonly TravelLoader $travelLoader, private readonly TravelLoader $travelLoader,
) { ) {
+4 -4
View File
@@ -6,8 +6,8 @@ namespace App\Command;
use App\BusProNet\Model\XmlExportInfo; use App\BusProNet\Model\XmlExportInfo;
use App\BusProNet\XmlLoader\TravelLoader; use App\BusProNet\XmlLoader\TravelLoader;
use App\Service\TravelDataService; use App\Service\TravelDataProvider;
use App\Service\TravelSnapshotService; use App\Service\TravelSnapshotManager;
use League\Flysystem\FilesystemException; use League\Flysystem\FilesystemException;
use League\Flysystem\FilesystemOperator; use League\Flysystem\FilesystemOperator;
use League\Flysystem\StorageAttributes; use League\Flysystem\StorageAttributes;
@@ -41,8 +41,8 @@ class BpnXmlSyncCommand extends Command
private readonly CacheInterface $cache, private readonly CacheInterface $cache,
private readonly LoggerInterface $logger, private readonly LoggerInterface $logger,
private readonly TravelLoader $travelLoader, private readonly TravelLoader $travelLoader,
private readonly TravelDataService $travelDataService, private readonly TravelDataProvider $travelDataService,
private readonly TravelSnapshotService $snapshotService, private readonly TravelSnapshotManager $snapshotService,
) { ) {
parent::__construct(); parent::__construct();
} }
@@ -6,7 +6,7 @@ namespace App\Command;
use App\BusProNet\Model\Booking; use App\BusProNet\Model\Booking;
use App\Repository\BookingEditDraftRepository; use App\Repository\BookingEditDraftRepository;
use App\Service\BookingEditDataLoaderService; use App\Service\BookingEditDataLoader;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\Command;
@@ -23,7 +23,7 @@ class DraftBackfillBookingNumberCommand extends Command
{ {
public function __construct( public function __construct(
private readonly BookingEditDraftRepository $draftRepository, private readonly BookingEditDraftRepository $draftRepository,
private readonly BookingEditDataLoaderService $dataLoader, private readonly BookingEditDataLoader $dataLoader,
private readonly EntityManagerInterface $entityManager, private readonly EntityManagerInterface $entityManager,
) { ) {
parent::__construct(); parent::__construct();
@@ -13,10 +13,10 @@ use App\Exception\NewsletterProviderException;
use App\Form\PersonalDataType; use App\Form\PersonalDataType;
use App\Repository\NewsletterOptInConfirmationRepository; use App\Repository\NewsletterOptInConfirmationRepository;
use App\Security\Crypt; use App\Security\Crypt;
use App\Service\BookingEditDataLoaderService; use App\Service\BookingEditDataLoader;
use App\Service\ProfileCompletenessChecker; use App\Service\ProfileCompletenessChecker;
use App\Service\MailjetNewsletterService; use App\Service\MailjetApiClient;
use App\Service\NewsletterDoubleOptInService; use App\Service\NewsletterManager;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@@ -39,7 +39,7 @@ class PersonalDataController extends AbstractController
/** /**
* @param ApiClient $apiClient BusProNet API client for data operations * @param ApiClient $apiClient BusProNet API client for data operations
* @param Crypt $crypt Encryption service for password handling * @param Crypt $crypt Encryption service for password handling
* @param BookingEditDataLoaderService $dataLoader Data loader for cache invalidation * @param BookingEditDataLoader $dataLoader Data loader for cache invalidation
* @param ProfileCompletenessChecker $completenessChecker Profile validation service * @param ProfileCompletenessChecker $completenessChecker Profile validation service
* @param EntityManagerInterface $entityManager Entity manager for persisting user changes * @param EntityManagerInterface $entityManager Entity manager for persisting user changes
* @param LoggerInterface $logger Logger for audit trails and debugging * @param LoggerInterface $logger Logger for audit trails and debugging
@@ -47,11 +47,11 @@ class PersonalDataController extends AbstractController
public function __construct( public function __construct(
private readonly ApiClient $apiClient, private readonly ApiClient $apiClient,
private readonly Crypt $crypt, private readonly Crypt $crypt,
private readonly BookingEditDataLoaderService $dataLoader, private readonly BookingEditDataLoader $dataLoader,
private readonly ProfileCompletenessChecker $completenessChecker, private readonly ProfileCompletenessChecker $completenessChecker,
private readonly EntityManagerInterface $entityManager, private readonly EntityManagerInterface $entityManager,
private readonly MailjetNewsletterService $newsletterService, private readonly MailjetApiClient $newsletterService,
private readonly NewsletterDoubleOptInService $doubleOptInService, private readonly NewsletterManager $doubleOptInService,
private readonly NewsletterOptInConfirmationRepository $newsletterConfirmationRepository, private readonly NewsletterOptInConfirmationRepository $newsletterConfirmationRepository,
private readonly LoggerInterface $logger, private readonly LoggerInterface $logger,
) { ) {
@@ -7,7 +7,7 @@ namespace App\Controller\Admin;
use App\Admin\Field\JsonDataField; use App\Admin\Field\JsonDataField;
use App\Entity\BookingEditDraft; use App\Entity\BookingEditDraft;
use App\Entity\User; use App\Entity\User;
use App\Service\BookingExportService; use App\Service\BookingExporter;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action; use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions; use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
@@ -22,7 +22,7 @@ use Symfony\Component\Routing\Attribute\Route;
class BookingEditDraftCrudController extends AbstractCrudController class BookingEditDraftCrudController extends AbstractCrudController
{ {
public function __construct( public function __construct(
private readonly BookingExportService $exportService, private readonly BookingExporter $exportService,
private readonly AdminUrlGenerator $adminUrlGenerator, private readonly AdminUrlGenerator $adminUrlGenerator,
) { ) {
} }
@@ -7,7 +7,7 @@ namespace App\Controller\Admin;
use App\Admin\Field\JsonDataField; use App\Admin\Field\JsonDataField;
use App\Entity\LogEntry; use App\Entity\LogEntry;
use App\Repository\LogEntryRepository; use App\Repository\LogEntryRepository;
use App\Service\XmlDumpService; use App\Service\XmlDumpReader;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action; use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions; use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
@@ -70,7 +70,7 @@ class LogEntryCrudController extends AbstractCrudController
yield JsonDataField::new('extra', 'Extra')->onlyOnDetail(); yield JsonDataField::new('extra', 'Extra')->onlyOnDetail();
} }
public function xmlDumps(Request $request, XmlDumpService $xmlDumpService): Response public function xmlDumps(Request $request, XmlDumpReader $xmlDumpService): Response
{ {
$entityId = $request->query->getInt('entityId'); $entityId = $request->query->getInt('entityId');
if ($entityId <= 0) { if ($entityId <= 0) {
+2 -2
View File
@@ -5,7 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Admin; namespace App\Controller\Admin;
use App\Repository\LogEntryRepository; use App\Repository\LogEntryRepository;
use App\Service\XmlDumpService; use App\Service\XmlDumpReader;
use League\Flysystem\FilesystemException; use League\Flysystem\FilesystemException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@@ -19,7 +19,7 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
class XmlDumpController extends AbstractController class XmlDumpController extends AbstractController
{ {
public function __construct( public function __construct(
private readonly XmlDumpService $xmlDumpService, private readonly XmlDumpReader $xmlDumpService,
private readonly LogEntryRepository $logEntryRepository, private readonly LogEntryRepository $logEntryRepository,
) { ) {
} }
+2 -2
View File
@@ -6,7 +6,7 @@ use App\BusProNet\ApiClient;
use App\BusProNet\Exception\ApiClientException; use App\BusProNet\Exception\ApiClientException;
use App\BusProNet\Model\Travel; use App\BusProNet\Model\Travel;
use App\BusProNet\Utility\DateCodeUtility; use App\BusProNet\Utility\DateCodeUtility;
use App\Service\TravelDataService; use App\Service\TravelDataProvider;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
@@ -21,7 +21,7 @@ class TravelController extends AbstractController
{ {
public function __construct( public function __construct(
private readonly ApiClient $apiClient, private readonly ApiClient $apiClient,
private readonly TravelDataService $travelDataService, private readonly TravelDataProvider $travelDataService,
) { ) {
} }
@@ -11,9 +11,9 @@ use App\Exception\NoRoomsAvailableException;
use App\Exception\TravelNotFoundException; use App\Exception\TravelNotFoundException;
use App\Htmx\HxTrait; use App\Htmx\HxTrait;
use App\Model\BookingQueryParams; use App\Model\BookingQueryParams;
use App\Service\BookingService; use App\Service\BookingConfigurator;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use App\Service\BookingSummaryDataService; use App\Service\BookingSummaryAssembler;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@@ -32,10 +32,10 @@ class IndexController extends AbstractController
use HxTrait; use HxTrait;
public function __construct( public function __construct(
private readonly BookingService $bookingService, private readonly BookingConfigurator $bookingService,
private readonly BookingSessionService $bookingSessionService, private readonly BookingSessionStore $bookingSessionService,
private readonly AgencyLoader $agencyLoader, private readonly AgencyLoader $agencyLoader,
private readonly BookingSummaryDataService $summaryDataService, private readonly BookingSummaryAssembler $summaryDataService,
) { ) {
} }
@@ -10,8 +10,8 @@ use App\Form\BookingCreateStep1Type;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Htmx\HxTrait; use App\Htmx\HxTrait;
use App\Service\BookingCreateContextFactory; use App\Service\BookingCreateContextFactory;
use App\Service\BookingService; use App\Service\BookingConfigurator;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use App\Service\RoomPricingCalculator; use App\Service\RoomPricingCalculator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
@@ -31,8 +31,8 @@ class Step1Controller extends AbstractController
use HxTrait; use HxTrait;
public function __construct( public function __construct(
private readonly BookingService $bookingService, private readonly BookingConfigurator $bookingService,
private readonly BookingSessionService $bookingSessionService, private readonly BookingSessionStore $bookingSessionService,
private readonly BookingCreateContextFactory $createContextFactory, private readonly BookingCreateContextFactory $createContextFactory,
) { ) {
} }
@@ -8,11 +8,11 @@ use App\Form\BookingParticipantType;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Htmx\HxTrait; use App\Htmx\HxTrait;
use App\Service\BookingCreateContextFactory; use App\Service\BookingCreateContextFactory;
use App\Service\BookingService; use App\Service\BookingConfigurator;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use App\Service\ParticipantFormSupportService; use App\Service\ParticipantFormSupport;
use App\Service\ParticipantPrepopulationService; use App\Service\ParticipantDataPrefiller;
use App\Service\TravelDataService; use App\Service\TravelDataProvider;
use App\Service\RoomPricingCalculator; use App\Service\RoomPricingCalculator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
@@ -28,12 +28,12 @@ class Step2ParticipantController extends AbstractController
use HxTrait; use HxTrait;
public function __construct( public function __construct(
private readonly BookingService $bookingService, private readonly BookingConfigurator $bookingService,
private readonly BookingSessionService $bookingSessionService, private readonly BookingSessionStore $bookingSessionService,
private readonly BookingCreateContextFactory $createContextFactory, private readonly BookingCreateContextFactory $createContextFactory,
private readonly TravelDataService $travelDataService, private readonly TravelDataProvider $travelDataService,
private readonly ParticipantPrepopulationService $prepopulationService, private readonly ParticipantDataPrefiller $prepopulationService,
private readonly ParticipantFormSupportService $participantFormSupportService, private readonly ParticipantFormSupport $participantFormSupportService,
) { ) {
} }
@@ -14,10 +14,10 @@ use App\Form\BookingCreateStep3Type;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Htmx\HxTrait; use App\Htmx\HxTrait;
use App\Service\BookingCreateContextFactory; use App\Service\BookingCreateContextFactory;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\BookingPriceMismatchDiagnosticsService; use App\Service\BookingPriceMismatchAnalyzer;
use App\Service\BookingService; use App\Service\BookingConfigurator;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use App\Service\RoomPricingCalculator; use App\Service\RoomPricingCalculator;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@@ -36,11 +36,11 @@ class Step3Controller extends AbstractController
use HxTrait; use HxTrait;
public function __construct( public function __construct(
private readonly BookingService $bookingService, private readonly BookingConfigurator $bookingService,
private readonly BookingSessionService $bookingSessionService, private readonly BookingSessionStore $bookingSessionService,
private readonly BookingCreateContextFactory $createContextFactory, private readonly BookingCreateContextFactory $createContextFactory,
private readonly BookingPriceCalculatorService $priceCalculator, private readonly BookingPriceCalculator $priceCalculator,
private readonly BookingPriceMismatchDiagnosticsService $priceMismatchDiagnostics, private readonly BookingPriceMismatchAnalyzer $priceMismatchDiagnostics,
private readonly ApiClient $apiClient, private readonly ApiClient $apiClient,
private readonly LoggerInterface $logger, private readonly LoggerInterface $logger,
) { ) {
@@ -15,11 +15,11 @@ use App\Form\Model\BookingDto;
use App\Htmx\HxTrait; use App\Htmx\HxTrait;
use App\Entity\User; use App\Entity\User;
use App\Service\BookingCreateContextFactory; use App\Service\BookingCreateContextFactory;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\BookingService; use App\Service\BookingConfigurator;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use App\Service\MailjetNewsletterService; use App\Service\MailjetApiClient;
use App\Service\NewsletterDoubleOptInService; use App\Service\NewsletterManager;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
@@ -38,14 +38,14 @@ class Step4Controller extends AbstractController
use HxTrait; use HxTrait;
public function __construct( public function __construct(
private readonly BookingService $bookingService, private readonly BookingConfigurator $bookingService,
private readonly BookingSessionService $bookingSessionService, private readonly BookingSessionStore $bookingSessionService,
private readonly BookingCreateContextFactory $createContextFactory, private readonly BookingCreateContextFactory $createContextFactory,
private readonly BookingPriceCalculatorService $priceCalculator, private readonly BookingPriceCalculator $priceCalculator,
private readonly ApiClient $apiClient, private readonly ApiClient $apiClient,
private readonly CacheInterface $cache, private readonly CacheInterface $cache,
private readonly MailjetNewsletterService $newsletterService, private readonly MailjetApiClient $newsletterService,
private readonly NewsletterDoubleOptInService $doubleOptInService, private readonly NewsletterManager $doubleOptInService,
private readonly LoggerInterface $logger, private readonly LoggerInterface $logger,
) { ) {
} }
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Booking\Create; namespace App\Controller\Booking\Create;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@@ -16,7 +16,7 @@ use Symfony\Component\Routing\Attribute\Route;
class SuccessController extends AbstractController class SuccessController extends AbstractController
{ {
public function __construct( public function __construct(
private readonly BookingSessionService $bookingSessionService, private readonly BookingSessionStore $bookingSessionService,
) { ) {
} }
+11 -11
View File
@@ -11,12 +11,12 @@ use App\Exception\TravelNotFoundException;
use App\Form\BookingEditType; use App\Form\BookingEditType;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Htmx\HxTrait; use App\Htmx\HxTrait;
use App\Service\BookingEditDataLoaderService; use App\Service\BookingEditDataLoader;
use App\Service\BookingEditDraftService; use App\Service\BookingEditDraftManager;
use App\Service\BookingEditContextFactory; use App\Service\BookingEditContextFactory;
use App\Service\BookingFingerprintService; use App\Service\BookingChangeTracker;
use App\Service\BookingEditSubmitService; use App\Service\BookingEditSubmitter;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@@ -30,7 +30,7 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
* - Card overview with lazy-loaded individual participant forms * - Card overview with lazy-loaded individual participant forms
* - Handles canceled participants (status 'S') * - Handles canceled participants (status 'S')
* - Applies mutability constraints via EditFieldStateProvider * - Applies mutability constraints via EditFieldStateProvider
* - Final submission is delegated to BookingEditSubmitService * - Final submission is delegated to BookingEditSubmitter
*/ */
class IndexController extends AbstractController class IndexController extends AbstractController
{ {
@@ -38,12 +38,12 @@ class IndexController extends AbstractController
use HxTrait; use HxTrait;
public function __construct( public function __construct(
private readonly BookingEditDataLoaderService $dataLoader, private readonly BookingEditDataLoader $dataLoader,
private readonly BookingEditDraftService $draftService, private readonly BookingEditDraftManager $draftService,
private readonly BookingSessionService $bookingSessionService, private readonly BookingSessionStore $bookingSessionService,
private readonly BookingFingerprintService $fingerprintService, private readonly BookingChangeTracker $fingerprintService,
private readonly BookingEditContextFactory $editContextFactory, private readonly BookingEditContextFactory $editContextFactory,
private readonly BookingEditSubmitService $submitService, private readonly BookingEditSubmitter $submitService,
) { ) {
} }
@@ -10,11 +10,11 @@ use App\Entity\User;
use App\Form\BookingParticipantType; use App\Form\BookingParticipantType;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Htmx\HxTrait; use App\Htmx\HxTrait;
use App\Service\BookingEditDataLoaderService; use App\Service\BookingEditDataLoader;
use App\Service\BookingEditContextFactory; use App\Service\BookingEditContextFactory;
use App\Service\BookingEditDraftService; use App\Service\BookingEditDraftManager;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use App\Service\ParticipantFormSupportService; use App\Service\ParticipantFormSupport;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@@ -29,11 +29,11 @@ class ParticipantController extends AbstractController
use HxTrait; use HxTrait;
public function __construct( public function __construct(
private readonly BookingEditDataLoaderService $dataLoader, private readonly BookingEditDataLoader $dataLoader,
private readonly BookingEditDraftService $draftService, private readonly BookingEditDraftManager $draftService,
private readonly BookingEditContextFactory $editContextFactory, private readonly BookingEditContextFactory $editContextFactory,
private readonly BookingSessionService $bookingSessionService, private readonly BookingSessionStore $bookingSessionService,
private readonly ParticipantFormSupportService $participantFormSupportService, private readonly ParticipantFormSupport $participantFormSupportService,
) { ) {
} }
@@ -10,7 +10,7 @@ use App\Exception\HotelNotInTravelException;
use App\Exception\NoRoomsAvailableException; use App\Exception\NoRoomsAvailableException;
use App\Exception\TravelNotFoundException; use App\Exception\TravelNotFoundException;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@@ -29,7 +29,7 @@ trait BookingExceptionHandlerTrait
* Handles all booking-related exceptions and provides appropriate user feedback * Handles all booking-related exceptions and provides appropriate user feedback
* by redirecting to the error page with flash messages. * by redirecting to the error page with flash messages.
*/ */
protected function getOrCreateBookingCreateDto(BookingSessionService $bookingSessionService, Request $request): BookingDto|RedirectResponse protected function getOrCreateBookingCreateDto(BookingSessionStore $bookingSessionService, Request $request): BookingDto|RedirectResponse
{ {
try { try {
return $bookingSessionService->getOrCreateBookingCreateDto($request); return $bookingSessionService->getOrCreateBookingCreateDto($request);
@@ -62,7 +62,7 @@ trait BookingExceptionHandlerTrait
* Returns empty 400 responses for HTMX requests when exceptions occur, * Returns empty 400 responses for HTMX requests when exceptions occur,
* allowing the frontend to handle errors appropriately. * allowing the frontend to handle errors appropriately.
*/ */
protected function getOrCreateBookingCreateDtoForHtmx(BookingSessionService $bookingSessionService, Request $request): mixed protected function getOrCreateBookingCreateDtoForHtmx(BookingSessionStore $bookingSessionService, Request $request): mixed
{ {
try { try {
return $bookingSessionService->getOrCreateBookingCreateDto($request); return $bookingSessionService->getOrCreateBookingCreateDto($request);
@@ -6,7 +6,7 @@ namespace App\Controller\Newsletter;
use App\Exception\NewsletterProviderException; use App\Exception\NewsletterProviderException;
use App\Model\NewsletterConfirmationResult; use App\Model\NewsletterConfirmationResult;
use App\Service\NewsletterDoubleOptInService; use App\Service\NewsletterManager;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@@ -16,7 +16,7 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
class ConfirmController extends AbstractController class ConfirmController extends AbstractController
{ {
public function __construct( public function __construct(
private readonly NewsletterDoubleOptInService $doubleOptInService, private readonly NewsletterManager $doubleOptInService,
private readonly LoggerInterface $logger, private readonly LoggerInterface $logger,
) { ) {
} }
+5 -5
View File
@@ -2,8 +2,8 @@
namespace App\Controller; namespace App\Controller;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use App\Service\BookingSummaryDataService; use App\Service\BookingSummaryAssembler;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@@ -18,11 +18,11 @@ class SecurityController extends AbstractController
public function login( public function login(
AuthenticationUtils $authenticationUtils, AuthenticationUtils $authenticationUtils,
Request $request, Request $request,
BookingSessionService $bookingSessionService, BookingSessionStore $bookingSessionService,
BookingSummaryDataService $summaryDataService, BookingSummaryAssembler $summaryDataService,
): Response { ): Response {
// Check if this is a booking flow (BookingDto exists in session) // Check if this is a booking flow (BookingDto exists in session)
$bookingDto = $bookingSessionService->getBookingDto($request, BookingSessionService::BOOKING_CREATE_KEY); $bookingDto = $bookingSessionService->getBookingDto($request, BookingSessionStore::BOOKING_CREATE_KEY);
$isBookingFlow = null !== $bookingDto; $isBookingFlow = null !== $bookingDto;
// If authenticated and in booking flow, proceed to Step 1 // If authenticated and in booking flow, proceed to Step 1
+2 -2
View File
@@ -331,7 +331,7 @@ class BookingDto
* *
* Replaces the full Travel object with just its integer ID. The Booking's * Replaces the full Travel object with just its integer ID. The Booking's
* travelData reference is also removed since it points to the same object. * travelData reference is also removed since it points to the same object.
* BookingService::hydrate() restores the Travel from cache after session read. * BookingConfigurator::hydrate() restores the Travel from cache after session read.
* *
* @return array<string, mixed> * @return array<string, mixed>
*/ */
@@ -356,7 +356,7 @@ class BookingDto
/** /**
* Restores the DTO from session data with a minimal Travel placeholder. * Restores the DTO from session data with a minimal Travel placeholder.
* *
* Creates a Travel object containing only the ID. BookingService::hydrate() * Creates a Travel object containing only the ID. BookingConfigurator::hydrate()
* replaces this with the full Travel from cache on every session read. * replaces this with the full Travel from cache on every session read.
* *
* @param array<string, mixed> $data * @param array<string, mixed> $data
@@ -6,7 +6,7 @@ namespace App\Form\Service\Condition;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Service\Contract\FieldConditionInterface; use App\Form\Service\Contract\FieldConditionInterface;
use App\Service\ParticipantEligibilityService; use App\Service\ParticipantEligibilityChecker;
/** /**
* Condition that evaluates whether a participant is eligible for booking. * Condition that evaluates whether a participant is eligible for booking.
@@ -26,7 +26,7 @@ use App\Service\ParticipantEligibilityService;
class BookingEligibilityCondition implements FieldConditionInterface class BookingEligibilityCondition implements FieldConditionInterface
{ {
public function __construct( public function __construct(
private readonly ParticipantEligibilityService $participantEligibilityService, private readonly ParticipantEligibilityChecker $participantEligibilityService,
) { ) {
} }
@@ -24,7 +24,7 @@ use App\Form\Service\Condition\ServiceSubTypeCondition;
use App\Form\Service\Condition\SingleRoomTypeCondition; use App\Form\Service\Condition\SingleRoomTypeCondition;
use App\Form\Service\Condition\SkiPassSelectionCondition; use App\Form\Service\Condition\SkiPassSelectionCondition;
use App\Form\Service\Condition\TravelStartCutoffReachedCondition; use App\Form\Service\Condition\TravelStartCutoffReachedCondition;
use App\Service\ParticipantEligibilityService; use App\Service\ParticipantEligibilityChecker;
/** /**
* Field state provider for the booking create workflow. * Field state provider for the booking create workflow.
@@ -44,7 +44,7 @@ use App\Service\ParticipantEligibilityService;
class CreateFieldStateProvider extends AbstractFieldStateProvider class CreateFieldStateProvider extends AbstractFieldStateProvider
{ {
public function __construct( public function __construct(
private readonly ParticipantEligibilityService $participantEligibilityService, private readonly ParticipantEligibilityChecker $participantEligibilityService,
) { ) {
parent::__construct(); parent::__construct();
} }
@@ -317,7 +317,7 @@ class CreateFieldStateProvider extends AbstractFieldStateProvider
// Room assignment field: // Room assignment field:
// - Hidden until date of birth is provided (age determines room eligibility, e.g., Baby rooms) // - Hidden until date of birth is provided (age determines room eligibility, e.g., Baby rooms)
// - Rendered as static text when only one room type is selected (auto-assigned by RoomAssignmentService) // - Rendered as static text when only one room type is selected (auto-assigned by RoomAssigner)
$this->fieldStateConditions['assignedRoomId'] = [ $this->fieldStateConditions['assignedRoomId'] = [
'hidden' => CompositeCondition::not($dateOfBirthProvidedCondition), 'hidden' => CompositeCondition::not($dateOfBirthProvidedCondition),
'static_text' => new SingleRoomTypeCondition(), 'static_text' => new SingleRoomTypeCondition(),
@@ -14,8 +14,8 @@ use App\BusProNet\Utility\DirectionMapper;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\RoomSelectionDto; use App\Form\Model\RoomSelectionDto;
use App\Form\Service\Abstract\AbstractFieldOptionsProvider; use App\Form\Service\Abstract\AbstractFieldOptionsProvider;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\InsuranceService; use App\Service\InsuranceManager;
use App\Service\ServiceLabelFormatter; use App\Service\ServiceLabelFormatter;
use App\Service\ServiceAvailabilityCalculator; use App\Service\ServiceAvailabilityCalculator;
use Symfony\Contracts\Translation\TranslatorInterface; use Symfony\Contracts\Translation\TranslatorInterface;
@@ -41,8 +41,8 @@ class ParticipantFieldOptionsProvider extends AbstractFieldOptionsProvider
{ {
public function __construct( public function __construct(
private readonly ServiceAvailabilityCalculator $serviceAvailabilityCalculator, private readonly ServiceAvailabilityCalculator $serviceAvailabilityCalculator,
private readonly InsuranceService $insuranceService, private readonly InsuranceManager $insuranceService,
private readonly BookingPriceCalculatorService $priceCalculatorService, private readonly BookingPriceCalculator $priceCalculatorService,
private readonly ServiceLabelFormatter $serviceLabelFormatter, private readonly ServiceLabelFormatter $serviceLabelFormatter,
private readonly TranslatorInterface $translator, private readonly TranslatorInterface $translator,
) { ) {
@@ -1112,14 +1112,14 @@ class ParticipantFieldOptionsProvider extends AbstractFieldOptionsProvider
/** /**
* Gets the rental insurance description for help text. * Gets the rental insurance description for help text.
*/ */
private function getRentalInsuranceDescription(array $rentalInsuranceServices): ?string private function getRentalInsuranceDescription(array $rentalInsuranceManagers): ?string
{ {
if (empty($rentalInsuranceServices)) { if (empty($rentalInsuranceManagers)) {
return null; return null;
} }
$rentalInsuranceService = reset($rentalInsuranceServices); // Get the first (and only) rental insurance service $rentalInsuranceManager = reset($rentalInsuranceManagers); // Get the first (and only) rental insurance service
return $rentalInsuranceService->description; return $rentalInsuranceManager->description;
} }
/** /**
@@ -7,8 +7,8 @@ namespace App\Form\Service;
use App\BusProNet\Model\Insurance; use App\BusProNet\Model\Insurance;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Service\Abstract\AbstractParticipantFieldHandler; use App\Form\Service\Abstract\AbstractParticipantFieldHandler;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\InsuranceService; use App\Service\InsuranceManager;
/** /**
* Handles processing of the insurance field for booking participants. * Handles processing of the insurance field for booking participants.
@@ -35,8 +35,8 @@ use App\Service\InsuranceService;
class ParticipantInsuranceFieldHandler extends AbstractParticipantFieldHandler class ParticipantInsuranceFieldHandler extends AbstractParticipantFieldHandler
{ {
public function __construct( public function __construct(
private readonly InsuranceService $insuranceService, private readonly InsuranceManager $insuranceService,
private readonly BookingPriceCalculatorService $priceCalculatorService, private readonly BookingPriceCalculator $priceCalculatorService,
) { ) {
} }
@@ -6,8 +6,8 @@ namespace App\Form\Service;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Service\Abstract\AbstractParticipantFieldHandler; use App\Form\Service\Abstract\AbstractParticipantFieldHandler;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\VoucherValidationService; use App\Service\VoucherValidator;
/** /**
* Handles promotional voucher code field processing. * Handles promotional voucher code field processing.
@@ -22,8 +22,8 @@ use App\Service\VoucherValidationService;
class ParticipantPromoVoucherFieldHandler extends AbstractParticipantFieldHandler class ParticipantPromoVoucherFieldHandler extends AbstractParticipantFieldHandler
{ {
public function __construct( public function __construct(
private readonly VoucherValidationService $voucherValidationService, private readonly VoucherValidator $voucherValidationService,
private readonly BookingPriceCalculatorService $priceCalculatorService, private readonly BookingPriceCalculator $priceCalculatorService,
) { ) {
} }
@@ -6,7 +6,7 @@ namespace App\Form\Service;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Service\Abstract\AbstractParticipantFieldHandler; use App\Form\Service\Abstract\AbstractParticipantFieldHandler;
use App\Service\VoucherValidationService; use App\Service\VoucherValidator;
/** /**
* Handles purchase voucher code field processing. * Handles purchase voucher code field processing.
@@ -20,7 +20,7 @@ use App\Service\VoucherValidationService;
class ParticipantPurchaseVoucherFieldHandler extends AbstractParticipantFieldHandler class ParticipantPurchaseVoucherFieldHandler extends AbstractParticipantFieldHandler
{ {
public function __construct( public function __construct(
private readonly VoucherValidationService $voucherValidationService, private readonly VoucherValidator $voucherValidationService,
) { ) {
} }
@@ -107,7 +107,7 @@ class ParticipantRentalInsuranceFieldHandler extends AbstractParticipantFieldHan
// Store service object based on checkbox state for pricing calculations // Store service object based on checkbox state for pricing calculations
if (true === $isRentalInsuranceSelected) { if (true === $isRentalInsuranceSelected) {
$participant->rentalInsurance = $this->findRentalInsuranceService($bookingDto, $participantIndex); $participant->rentalInsurance = $this->findRentalInsuranceManager($bookingDto, $participantIndex);
} else { } else {
$participant->rentalInsurance = null; $participant->rentalInsurance = null;
} }
@@ -124,20 +124,20 @@ class ParticipantRentalInsuranceFieldHandler extends AbstractParticipantFieldHan
* *
* @return Service|null The rental insurance service object, or null if not found * @return Service|null The rental insurance service object, or null if not found
*/ */
private function findRentalInsuranceService(BookingDto $bookingDto, int $participantIndex): ?Service private function findRentalInsuranceManager(BookingDto $bookingDto, int $participantIndex): ?Service
{ {
// Get available rental insurance services (includes booked insurance in edit mode) // Get available rental insurance services (includes booked insurance in edit mode)
$rentalInsuranceServices = $this->getAvailableServicesWithBooked( $rentalInsuranceManagers = $this->getAvailableServicesWithBooked(
$bookingDto, $bookingDto,
$participantIndex, $participantIndex,
Constants::TOKEN_RENTAL_INSURANCE, Constants::TOKEN_RENTAL_INSURANCE,
true true
); );
if (empty($rentalInsuranceServices)) { if (empty($rentalInsuranceManagers)) {
return null; return null;
} }
return reset($rentalInsuranceServices); // Get the first (and typically only) rental insurance service return reset($rentalInsuranceManagers); // Get the first (and typically only) rental insurance service
} }
} }
+2 -2
View File
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace App\Logger; namespace App\Logger;
use App\Service\ErrorCodeService; use App\Service\ErrorCodeGenerator;
use Monolog\Attribute\AsMonologProcessor; use Monolog\Attribute\AsMonologProcessor;
use Monolog\Level; use Monolog\Level;
use Monolog\LogRecord; use Monolog\LogRecord;
@@ -20,7 +20,7 @@ use Monolog\LogRecord;
class ErrorCodeProcessor class ErrorCodeProcessor
{ {
public function __construct( public function __construct(
private readonly ErrorCodeService $errorCodeService, private readonly ErrorCodeGenerator $errorCodeService,
) { ) {
} }
@@ -14,7 +14,7 @@ use App\Form\Model\ParticipantDto;
* Used by EditController to determine if user modifications need to be saved. * Used by EditController to determine if user modifications need to be saved.
* Also provides data extraction for draft persistence. * Also provides data extraction for draft persistence.
*/ */
class BookingFingerprintService class BookingChangeTracker
{ {
/** /**
* Generates a fingerprint (hash) of all mutable booking data. * Generates a fingerprint (hash) of all mutable booking data.
@@ -19,12 +19,12 @@ use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class BookingService class BookingConfigurator
{ {
public function __construct( public function __construct(
private readonly BookingSessionService $bookingSessionService, private readonly BookingSessionStore $bookingSessionService,
private readonly TravelDataService $travelDataService, private readonly TravelDataProvider $travelDataService,
private readonly ParticipantEligibilityService $participantEligibilityService, private readonly ParticipantEligibilityChecker $participantEligibilityService,
private readonly BookingStatusRuleRegistry $bookingStatusRuleRegistry, private readonly BookingStatusRuleRegistry $bookingStatusRuleRegistry,
private readonly AgencyLoader $agencyLoader, private readonly AgencyLoader $agencyLoader,
#[Autowire('%default_booking_status%')] #[Autowire('%default_booking_status%')]
+3 -3
View File
@@ -16,9 +16,9 @@ use App\Form\Model\BookingMutabilityDto;
class BookingEditContextFactory class BookingEditContextFactory
{ {
public function __construct( public function __construct(
private readonly ParticipantCardDataService $participantCardDataService, private readonly ParticipantCardAssembler $participantCardDataService,
private readonly BookingSummaryDataService $summaryDataService, private readonly BookingSummaryAssembler $summaryDataService,
private readonly TravelDataService $travelDataService, private readonly TravelDataProvider $travelDataService,
) { ) {
} }
@@ -23,7 +23,7 @@ use Symfony\Contracts\Cache\TagAwareCacheInterface;
* Encapsulates the logic for loading booking data from session or API, * Encapsulates the logic for loading booking data from session or API,
* refreshing availability data, and restoring drafts when available. * refreshing availability data, and restoring drafts when available.
*/ */
class BookingEditDataLoaderService class BookingEditDataLoader
{ {
public const string CACHE_TAG_USER_PREFIX = 'user_bookings_'; public const string CACHE_TAG_USER_PREFIX = 'user_bookings_';
@@ -32,10 +32,10 @@ class BookingEditDataLoaderService
public function __construct( public function __construct(
private readonly ApiClient $apiClient, private readonly ApiClient $apiClient,
private readonly BookingDataProcessor $bookingDataProcessor, private readonly BookingDataProcessor $bookingDataProcessor,
private readonly BookingSessionService $bookingSessionService, private readonly BookingSessionStore $bookingSessionService,
private readonly BookingFingerprintService $fingerprintService, private readonly BookingChangeTracker $fingerprintService,
private readonly TravelDataService $travelDataService, private readonly TravelDataProvider $travelDataService,
private readonly BookingEditDraftService $draftService, private readonly BookingEditDraftManager $draftService,
private readonly AgencyLoader $agencyLoader, private readonly AgencyLoader $agencyLoader,
private readonly Crypt $crypt, private readonly Crypt $crypt,
private readonly TagAwareCacheInterface $bpnCache, private readonly TagAwareCacheInterface $bpnCache,
@@ -20,7 +20,7 @@ use App\Form\Service\Condition\TravelStartCutoffReachedCondition;
* immutable categories are reverted to the current booking state so update * immutable categories are reverted to the current booking state so update
* payloads cannot include blocked changes. * payloads cannot include blocked changes.
*/ */
class BookingEditSubmitGuardService class BookingEditSubmitGuard
{ {
public function __construct( public function __construct(
private readonly BookingDataProcessor $bookingDataProcessor, private readonly BookingDataProcessor $bookingDataProcessor,
@@ -18,15 +18,15 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/** /**
* Handles the final booking edit submission workflow. * Handles the final booking edit submission workflow.
*/ */
class BookingEditSubmitService class BookingEditSubmitter
{ {
public function __construct( public function __construct(
private readonly ApiClient $apiClient, private readonly ApiClient $apiClient,
private readonly BookingEditDataLoaderService $dataLoader, private readonly BookingEditDataLoader $dataLoader,
private readonly BookingEditDraftService $draftService, private readonly BookingEditDraftManager $draftService,
private readonly TravelDataService $travelDataService, private readonly TravelDataProvider $travelDataService,
private readonly BookingEditSubmitGuardService $submitGuard, private readonly BookingEditSubmitGuard $submitGuard,
private readonly BookingSessionService $bookingSessionService, private readonly BookingSessionStore $bookingSessionService,
private readonly UrlGeneratorInterface $urlGenerator, private readonly UrlGeneratorInterface $urlGenerator,
private readonly LoggerInterface $logger, private readonly LoggerInterface $logger,
) { ) {
@@ -16,7 +16,7 @@ use Symfony\Component\HttpFoundation\StreamedResponse;
* converting all service, room, and pickup IDs to human-readable labels using * converting all service, room, and pickup IDs to human-readable labels using
* travel data loaded from XML files. * travel data loaded from XML files.
*/ */
class BookingExportService class BookingExporter
{ {
private const COLUMN_HEADERS = [ private const COLUMN_HEADERS = [
'Vorname', 'Vorname',
@@ -54,7 +54,7 @@ class BookingExportService
]; ];
public function __construct( public function __construct(
private readonly TravelDataService $travelDataService, private readonly TravelDataProvider $travelDataService,
) { ) {
} }
@@ -17,12 +17,12 @@ use App\Form\Model\ParticipantDto;
* coordinating room and participant calculations and handling service aggregation directly. * coordinating room and participant calculations and handling service aggregation directly.
* Returns structured pricing data for display in forms and summaries. * Returns structured pricing data for display in forms and summaries.
*/ */
class BookingPriceCalculatorService class BookingPriceCalculator
{ {
public function __construct( public function __construct(
private readonly RoomPricingCalculator $roomPricingCalculator, private readonly RoomPricingCalculator $roomPricingCalculator,
private readonly ParticipantEligibilityService $participantEligibilityService, private readonly ParticipantEligibilityChecker $participantEligibilityService,
private readonly InsuranceService $insuranceService, private readonly InsuranceManager $insuranceService,
private readonly ParticipantPricingCalculator $participantPricingCalculator, private readonly ParticipantPricingCalculator $participantPricingCalculator,
) { ) {
} }
@@ -12,10 +12,10 @@ use App\Form\Model\BookingDto;
/** /**
* Builds diagnostic payloads for booking price mismatches. * Builds diagnostic payloads for booking price mismatches.
*/ */
class BookingPriceMismatchDiagnosticsService class BookingPriceMismatchAnalyzer
{ {
public function __construct( public function __construct(
private readonly BookingPriceCalculatorService $priceCalculator, private readonly BookingPricingAssembler $pricingAssembler,
) { ) {
} }
@@ -24,7 +24,7 @@ class BookingPriceMismatchDiagnosticsService
*/ */
public function buildDiagnostics(BookingDto $bookingCreateDto, BookingResponse $response): array public function buildDiagnostics(BookingDto $bookingCreateDto, BookingResponse $response): array
{ {
$pricingBreakdown = $this->priceCalculator->getPricingBreakdown($bookingCreateDto); $pricingBreakdown = $this->pricingAssembler->getPricingBreakdown($bookingCreateDto);
$roomLines = $pricingBreakdown['rooms'] ?? []; $roomLines = $pricingBreakdown['rooms'] ?? [];
$serviceGroups = $pricingBreakdown['services'] ?? []; $serviceGroups = $pricingBreakdown['services'] ?? [];
@@ -15,7 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
* orchestration and pricing logic. It handles DTO persistence, baseline * orchestration and pricing logic. It handles DTO persistence, baseline
* room snapshots, and return URL storage for the booking create/edit flows. * room snapshots, and return URL storage for the booking create/edit flows.
*/ */
class BookingSessionService class BookingSessionStore
{ {
public const BOOKING_CREATE_KEY = 'booking_create'; public const BOOKING_CREATE_KEY = 'booking_create';
public const BOOKING_CREATE_BASELINE_KEY = 'booking_create_baseline_snapshot'; public const BOOKING_CREATE_BASELINE_KEY = 'booking_create_baseline_snapshot';
@@ -24,7 +24,7 @@ class BookingSessionService
public const DEFAULT_RETURN_URL = 'https://www.ep-reisen.de'; public const DEFAULT_RETURN_URL = 'https://www.ep-reisen.de';
public function __construct( public function __construct(
private readonly TravelDataService $travelDataService, private readonly TravelDataProvider $travelDataService,
) { ) {
} }
@@ -5,7 +5,7 @@ namespace App\Service;
use Symfony\Contracts\HttpClient\Exception\ExceptionInterface; use Symfony\Contracts\HttpClient\Exception\ExceptionInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\HttpClientInterface;
class CmsDataService class CmsDataProvider
{ {
public function __construct(private readonly HttpClientInterface $httpClient, private readonly string $apiKey) public function __construct(private readonly HttpClientInterface $httpClient, private readonly string $apiKey)
{ {
@@ -13,7 +13,7 @@ use Symfony\Component\HttpFoundation\RequestStack;
* to report error codes to support staff who can then search logs by the code. * to report error codes to support staff who can then search logs by the code.
* The code format is E-XXXXXXXX (8 uppercase alphanumeric characters in base36). * The code format is E-XXXXXXXX (8 uppercase alphanumeric characters in base36).
*/ */
class ErrorCodeService class ErrorCodeGenerator
{ {
private ?string $errorCode = null; private ?string $errorCode = null;
private bool $hasError = false; private bool $hasError = false;
@@ -18,7 +18,7 @@ use Carbon\Carbon;
* Uses request-scoped instance-level caching to optimize performance for bookings with many participants. * Uses request-scoped instance-level caching to optimize performance for bookings with many participants.
* This service is stateless and has no dependencies to avoid circular dependency issues. * This service is stateless and has no dependencies to avoid circular dependency issues.
*/ */
class InsuranceService class InsuranceManager
{ {
use SortByPriceTrait; use SortByPriceTrait;
@@ -8,7 +8,7 @@ use App\Exception\NewsletterProviderException;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\HttpClientInterface;
class MailjetNewsletterService class MailjetApiClient
{ {
private const DEFAULT_BASE_URL = 'https://api.mailjet.com/v3/REST'; private const DEFAULT_BASE_URL = 'https://api.mailjet.com/v3/REST';
@@ -12,12 +12,12 @@ use App\Repository\NewsletterOptInConfirmationRepository;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
class NewsletterDoubleOptInService class NewsletterManager
{ {
public function __construct( public function __construct(
private readonly NewsletterOptInConfirmationRepository $confirmationRepository, private readonly NewsletterOptInConfirmationRepository $confirmationRepository,
private readonly EntityManagerInterface $entityManager, private readonly EntityManagerInterface $entityManager,
private readonly MailjetNewsletterService $newsletterService, private readonly MailjetApiClient $newsletterService,
private readonly Mailer $mailer, private readonly Mailer $mailer,
private readonly LoggerInterface $logger, private readonly LoggerInterface $logger,
private readonly int $newsletterConfirmationTtlHours, private readonly int $newsletterConfirmationTtlHours,
@@ -16,10 +16,10 @@ use Symfony\Component\Validator\Validator\ValidatorInterface;
* Provides participant name, room assignment, and individual pricing for * Provides participant name, room assignment, and individual pricing for
* display in the card overview UI. * display in the card overview UI.
*/ */
class ParticipantCardDataService class ParticipantCardAssembler
{ {
public function __construct( public function __construct(
private readonly BookingPriceCalculatorService $priceCalculator, private readonly BookingPriceCalculator $priceCalculator,
private readonly ValidatorInterface $validator, private readonly ValidatorInterface $validator,
) { ) {
} }
@@ -21,7 +21,7 @@ use Psr\Log\LoggerInterface;
* the booking process for authenticated users. All errors are handled gracefully * the booking process for authenticated users. All errors are handled gracefully
* to ensure the booking flow is never interrupted. * to ensure the booking flow is never interrupted.
*/ */
class ParticipantPrepopulationService class ParticipantDataPrefiller
{ {
public const TOKEN = '#KUN#'; public const TOKEN = '#KUN#';
@@ -45,7 +45,7 @@ class ParticipantPrepopulationService
* *
* @return ParticipantDto The prepopulated participant (or unchanged if API fails) * @return ParticipantDto The prepopulated participant (or unchanged if API fails)
*/ */
public function prepopulateApplicantFromUser(User $user, ParticipantDto $applicant): ParticipantDto public function prefillApplicantFromUser(User $user, ParticipantDto $applicant): ParticipantDto
{ {
try { try {
// Decrypt user password for API authentication // Decrypt user password for API authentication
@@ -105,7 +105,7 @@ class ParticipantPrepopulationService
* *
* Only prepopulates if the participant is fresh. * Only prepopulates if the participant is fresh.
*/ */
public function shouldPrepopulateApplicant(ParticipantDto $applicant): bool public function shouldPrefillApplicant(ParticipantDto $applicant): bool
{ {
return null === $applicant->firstName || '' === $applicant->firstName; return null === $applicant->firstName || '' === $applicant->firstName;
} }
@@ -20,7 +20,7 @@ use Carbon\CarbonImmutable;
* Results are cached per request using instance-level arrays to avoid redundant calculations * Results are cached per request using instance-level arrays to avoid redundant calculations
* when checking the same participant multiple times. * when checking the same participant multiple times.
*/ */
class ParticipantEligibilityService class ParticipantEligibilityChecker
{ {
/** @var array<string, bool> Request-scoped cache for participant eligibility */ /** @var array<string, bool> Request-scoped cache for participant eligibility */
private array $eligibilityCache = []; private array $eligibilityCache = [];
@@ -13,7 +13,7 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
/** /**
* Shared helpers for participant edit forms in create and edit booking flows. * Shared helpers for participant edit forms in create and edit booking flows.
*/ */
class ParticipantFormSupportService class ParticipantFormSupport
{ {
public function __construct( public function __construct(
private readonly ParameterBagInterface $parameterBag, private readonly ParameterBagInterface $parameterBag,
@@ -12,7 +12,7 @@ use App\Form\Model\BookingDto;
* This service automatically assigns participants to selected rooms based on room capacity * This service automatically assigns participants to selected rooms based on room capacity
* and quantity, eliminating the need for manual room selection in the booking flow. * and quantity, eliminating the need for manual room selection in the booking flow.
*/ */
class RoomAssignmentService class RoomAssigner
{ {
/** /**
* Determines if automatic room assignment should be performed. * Determines if automatic room assignment should be performed.
@@ -27,10 +27,10 @@ use Symfony\Contracts\Cache\ItemInterface;
* prefer snapshots for performance and refresh those snapshots from XML during sync. It handles * prefer snapshots for performance and refresh those snapshots from XML during sync. It handles
* caching, error recovery, and data enrichment for both data sources. * caching, error recovery, and data enrichment for both data sources.
* *
* Mapping/lookup operations are delegated to TravelLookupService. * Mapping/lookup operations are delegated to TravelIndex.
* Travel enrichment (XML details, insurances) is delegated to TravelEnrichmentService. * Travel enrichment (XML details, insurances) is delegated to TravelEnricher.
*/ */
class TravelDataService class TravelDataProvider
{ {
public const string SOURCE_LOCAL = 'local'; public const string SOURCE_LOCAL = 'local';
public const string SOURCE_REMOTE = 'remote'; public const string SOURCE_REMOTE = 'remote';
@@ -42,9 +42,9 @@ class TravelDataService
private readonly ApiClient $apiClient, private readonly ApiClient $apiClient,
private readonly CacheInterface $cache, private readonly CacheInterface $cache,
private readonly LoggerInterface $logger, private readonly LoggerInterface $logger,
private readonly TravelSnapshotService $travelSnapshotService, private readonly TravelSnapshotManager $travelSnapshotService,
private readonly TravelLookupService $travelLookupService, private readonly TravelIndex $travelLookupService,
private readonly TravelEnrichmentService $travelEnrichmentService, private readonly TravelEnricher $travelEnrichmentService,
private readonly bool $preferRemote = false, private readonly bool $preferRemote = false,
private readonly bool $enableFallback = true, private readonly bool $enableFallback = true,
) { ) {
@@ -18,7 +18,7 @@ use Psr\Log\LoggerInterface;
* - Insurance patching applied to every local travel, replacing any stale snapshot data * - Insurance patching applied to every local travel, replacing any stale snapshot data
* with freshly parsed, fully-hydrated Insurance objects from the XML loader * with freshly parsed, fully-hydrated Insurance objects from the XML loader
*/ */
class TravelEnrichmentService class TravelEnricher
{ {
public function __construct( public function __construct(
private readonly PickupLoader $pickupLoader, private readonly PickupLoader $pickupLoader,
@@ -14,7 +14,7 @@ use Psr\Log\LoggerInterface;
* Consolidates code/ID mapping, dateId→productId resolution, and the combined XML+snapshot * Consolidates code/ID mapping, dateId→productId resolution, and the combined XML+snapshot
* files map. All operations are read-only and never load full Travel objects. * files map. All operations are read-only and never load full Travel objects.
*/ */
class TravelLookupService class TravelIndex
{ {
/** @var array<int, array<string, mixed>>|null */ /** @var array<int, array<string, mixed>>|null */
private ?array $filesMapCache = null; private ?array $filesMapCache = null;
@@ -22,7 +22,7 @@ class TravelLookupService
public function __construct( public function __construct(
private readonly TravelLoader $travelLoader, private readonly TravelLoader $travelLoader,
private readonly HotelLoader $hotelLoader, private readonly HotelLoader $hotelLoader,
private readonly TravelSnapshotService $travelSnapshotService, private readonly TravelSnapshotManager $travelSnapshotService,
private readonly LoggerInterface $logger, private readonly LoggerInterface $logger,
) { ) {
} }
@@ -27,7 +27,7 @@ use Symfony\Component\Serializer\SerializerInterface;
* - Enrich snapshots with extended availability data. * - Enrich snapshots with extended availability data.
* - Purge expired snapshot records. * - Purge expired snapshot records.
*/ */
class TravelSnapshotService class TravelSnapshotManager
{ {
public function __construct( public function __construct(
private readonly TravelSnapshotRepository $snapshotRepository, private readonly TravelSnapshotRepository $snapshotRepository,
@@ -13,7 +13,7 @@ use Psr\Log\LoggerInterface;
use Symfony\Contracts\Cache\CacheInterface; use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Cache\ItemInterface; use Symfony\Contracts\Cache\ItemInterface;
class VoucherValidationService class VoucherValidator
{ {
private const CACHE_TTL = 900; // 15 minutes private const CACHE_TTL = 900; // 15 minutes
@@ -14,7 +14,7 @@ use League\Flysystem\FilesystemOperator;
* the request ID, sequence number, and type (request/response). This service * the request ID, sequence number, and type (request/response). This service
* allows finding and reading dumps by request ID. * allows finding and reading dumps by request ID.
*/ */
class XmlDumpService class XmlDumpReader
{ {
public function __construct( public function __construct(
private readonly FilesystemOperator $xmlDump, private readonly FilesystemOperator $xmlDump,
+2 -2
View File
@@ -11,7 +11,7 @@ use App\Form\Service\Condition\TravelStartCutoffReachedCondition;
use App\Form\Service\CreateFieldStateProvider; use App\Form\Service\CreateFieldStateProvider;
use App\Form\Service\EditFieldStateProvider; use App\Form\Service\EditFieldStateProvider;
use App\Model\DomainConfig; use App\Model\DomainConfig;
use App\Service\ParticipantEligibilityService; use App\Service\ParticipantEligibilityChecker;
use Symfony\Component\Form\FormView; use Symfony\Component\Form\FormView;
use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\RequestStack;
use Twig\Environment; use Twig\Environment;
@@ -30,7 +30,7 @@ class AppRuntime implements RuntimeExtensionInterface
public function __construct( public function __construct(
private readonly IntlExtension $intlExtension, private readonly IntlExtension $intlExtension,
private readonly CountryDataProvider $countryDataProvider, private readonly CountryDataProvider $countryDataProvider,
private readonly ParticipantEligibilityService $participantEligibilityService, private readonly ParticipantEligibilityChecker $participantEligibilityService,
private readonly CreateFieldStateProvider $createFieldStateProvider, private readonly CreateFieldStateProvider $createFieldStateProvider,
private readonly EditFieldStateProvider $editFieldStateProvider, private readonly EditFieldStateProvider $editFieldStateProvider,
private readonly RequestStack $requestStack, private readonly RequestStack $requestStack,
+2 -2
View File
@@ -4,14 +4,14 @@ declare(strict_types=1);
namespace App\Twig; namespace App\Twig;
use App\Service\ErrorCodeService; use App\Service\ErrorCodeGenerator;
use Twig\Extension\AbstractExtension; use Twig\Extension\AbstractExtension;
use Twig\TwigFunction; use Twig\TwigFunction;
class ErrorCodeExtension extends AbstractExtension class ErrorCodeExtension extends AbstractExtension
{ {
public function __construct( public function __construct(
private readonly ErrorCodeService $errorCodeService, private readonly ErrorCodeGenerator $errorCodeService,
) { ) {
} }
@@ -8,7 +8,7 @@ use App\BusProNet\Constants;
use App\BusProNet\Model\Service; use App\BusProNet\Model\Service;
use App\Form\Model\ParticipantEditDto; use App\Form\Model\ParticipantEditDto;
use App\Form\Service\ServiceAgeEvaluator; use App\Form\Service\ServiceAgeEvaluator;
use App\Service\ParticipantEligibilityService; use App\Service\ParticipantEligibilityChecker;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator; use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException; use Symfony\Component\Validator\Exception\UnexpectedTypeException;
@@ -19,7 +19,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
class MandatoryAdditionalServicesSelectedValidator extends ConstraintValidator class MandatoryAdditionalServicesSelectedValidator extends ConstraintValidator
{ {
public function __construct( public function __construct(
private readonly ParticipantEligibilityService $participantEligibilityService, private readonly ParticipantEligibilityChecker $participantEligibilityService,
private readonly ServiceAgeEvaluator $serviceAgeEvaluator, private readonly ServiceAgeEvaluator $serviceAgeEvaluator,
) { ) {
} }
@@ -5,8 +5,8 @@ declare(strict_types=1);
namespace App\Validator\Constraints; namespace App\Validator\Constraints;
use App\Form\Model\ParticipantEditDto; use App\Form\Model\ParticipantEditDto;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\VoucherValidationService; use App\Service\VoucherValidator;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator; use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException; use Symfony\Component\Validator\Exception\UnexpectedTypeException;
@@ -21,8 +21,8 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
class PromoVoucherValidator extends ConstraintValidator class PromoVoucherValidator extends ConstraintValidator
{ {
public function __construct( public function __construct(
private readonly VoucherValidationService $voucherValidationService, private readonly VoucherValidator $voucherValidationService,
private readonly BookingPriceCalculatorService $priceCalculatorService, private readonly BookingPriceCalculator $priceCalculatorService,
) { ) {
} }
@@ -5,7 +5,7 @@ declare(strict_types=1);
namespace App\Validator\Constraints; namespace App\Validator\Constraints;
use App\Form\Model\ParticipantEditDto; use App\Form\Model\ParticipantEditDto;
use App\Service\VoucherValidationService; use App\Service\VoucherValidator;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator; use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException; use Symfony\Component\Validator\Exception\UnexpectedTypeException;
@@ -19,7 +19,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
class PurchaseVoucherValidator extends ConstraintValidator class PurchaseVoucherValidator extends ConstraintValidator
{ {
public function __construct( public function __construct(
private readonly VoucherValidationService $voucherValidationService, private readonly VoucherValidator $voucherValidationService,
) { ) {
} }
@@ -20,8 +20,8 @@ use App\BusProNet\Model\Service;
use App\BusProNet\Model\Travel; use App\BusProNet\Model\Travel;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\InsuranceService; use App\Service\InsuranceManager;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger; use Psr\Log\NullLogger;
@@ -37,9 +37,9 @@ class BookingDataProcessorTest extends TestCase
protected function setUp(): void protected function setUp(): void
{ {
// Create a mock InsuranceService // Create a mock InsuranceManager
$insuranceService = $this->createMock(InsuranceService::class); $insuranceService = $this->createMock(InsuranceManager::class);
$priceCalculatorService = $this->createMock(BookingPriceCalculatorService::class); $priceCalculatorService = $this->createMock(BookingPriceCalculator::class);
// Mock getSelectableInsurances to return empty array (not used in these tests) // Mock getSelectableInsurances to return empty array (not used in these tests)
$insuranceService->method('getSelectableInsurances') $insuranceService->method('getSelectableInsurances')
+6 -6
View File
@@ -6,8 +6,8 @@ namespace App\Tests\Command;
use App\BusProNet\XmlLoader\TravelLoader; use App\BusProNet\XmlLoader\TravelLoader;
use App\Command\BpnXmlSyncCommand; use App\Command\BpnXmlSyncCommand;
use App\Service\TravelDataService; use App\Service\TravelDataProvider;
use App\Service\TravelSnapshotService; use App\Service\TravelSnapshotManager;
use League\Flysystem\DirectoryListing; use League\Flysystem\DirectoryListing;
use League\Flysystem\FilesystemOperator; use League\Flysystem\FilesystemOperator;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
@@ -23,8 +23,8 @@ class BpnXmlSyncCommandTest extends TestCase
private CacheInterface $cache; private CacheInterface $cache;
private LoggerInterface $logger; private LoggerInterface $logger;
private TravelLoader $travelLoader; private TravelLoader $travelLoader;
private TravelDataService $travelDataService; private TravelDataProvider $travelDataService;
private TravelSnapshotService $travelSnapshotService; private TravelSnapshotManager $travelSnapshotService;
private BpnXmlSyncCommand $command; private BpnXmlSyncCommand $command;
protected function tearDown(): void protected function tearDown(): void
@@ -42,8 +42,8 @@ class BpnXmlSyncCommandTest extends TestCase
$this->cache = $this->createMock(CacheInterface::class); $this->cache = $this->createMock(CacheInterface::class);
$this->logger = $this->createMock(LoggerInterface::class); $this->logger = $this->createMock(LoggerInterface::class);
$this->travelLoader = $this->createMock(TravelLoader::class); $this->travelLoader = $this->createMock(TravelLoader::class);
$this->travelDataService = $this->createMock(TravelDataService::class); $this->travelDataService = $this->createMock(TravelDataProvider::class);
$this->travelSnapshotService = $this->createMock(TravelSnapshotService::class); $this->travelSnapshotService = $this->createMock(TravelSnapshotManager::class);
$this->command = new BpnXmlSyncCommand( $this->command = new BpnXmlSyncCommand(
$this->xmlSource, $this->xmlSource,
+10 -10
View File
@@ -10,9 +10,9 @@ use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Form\Model\ParticipantEditDto; use App\Form\Model\ParticipantEditDto;
use App\Form\Service\ServiceAgeEvaluator; use App\Form\Service\ServiceAgeEvaluator;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\ParticipantEligibilityService; use App\Service\ParticipantEligibilityChecker;
use App\Service\VoucherValidationService; use App\Service\VoucherValidator;
use App\Validator\Constraints\MandatoryAdditionalServicesSelectedValidator; use App\Validator\Constraints\MandatoryAdditionalServicesSelectedValidator;
use App\Validator\Constraints\PromoVoucherValidator; use App\Validator\Constraints\PromoVoucherValidator;
use App\Validator\Constraints\PurchaseVoucherValidator; use App\Validator\Constraints\PurchaseVoucherValidator;
@@ -39,22 +39,22 @@ class ParticipantEditDtoTest extends TestCase
protected function setUp(): void protected function setUp(): void
{ {
// Create mock services for validator dependencies // Create mock services for validator dependencies
$mockVoucherService = $this->createMock(VoucherValidationService::class); $mockVoucherService = $this->createMock(VoucherValidator::class);
$mockPriceCalculatorService = $this->createMock(BookingPriceCalculatorService::class); $mockPriceCalculatorService = $this->createMock(BookingPriceCalculator::class);
$mockParticipantEligibilityService = $this->createMock(ParticipantEligibilityService::class); $mockParticipantEligibilityChecker = $this->createMock(ParticipantEligibilityChecker::class);
$mockServiceAgeEvaluator = $this->createMock(ServiceAgeEvaluator::class); $mockServiceAgeEvaluator = $this->createMock(ServiceAgeEvaluator::class);
// Create custom validator factory that can inject dependencies // Create custom validator factory that can inject dependencies
$validatorFactory = new class( $validatorFactory = new class(
$mockVoucherService, $mockVoucherService,
$mockPriceCalculatorService, $mockPriceCalculatorService,
$mockParticipantEligibilityService, $mockParticipantEligibilityChecker,
$mockServiceAgeEvaluator $mockServiceAgeEvaluator
) implements ConstraintValidatorFactoryInterface { ) implements ConstraintValidatorFactoryInterface {
public function __construct( public function __construct(
private readonly VoucherValidationService $voucherService, private readonly VoucherValidator $voucherService,
private readonly BookingPriceCalculatorService $priceCalculatorService, private readonly BookingPriceCalculator $priceCalculatorService,
private readonly ParticipantEligibilityService $participantEligibilityService, private readonly ParticipantEligibilityChecker $participantEligibilityService,
private readonly ServiceAgeEvaluator $serviceAgeEvaluator, private readonly ServiceAgeEvaluator $serviceAgeEvaluator,
) { ) {
} }
@@ -11,8 +11,8 @@ use App\BusProNet\Utility\DirectionMapper;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Form\Service\ParticipantFieldOptionsProvider; use App\Form\Service\ParticipantFieldOptionsProvider;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\InsuranceService; use App\Service\InsuranceManager;
use App\Service\ServiceLabelFormatter; use App\Service\ServiceLabelFormatter;
use App\Service\ServiceAvailabilityCalculator; use App\Service\ServiceAvailabilityCalculator;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
@@ -26,8 +26,8 @@ class ParticipantFieldOptionsProviderBabyTest extends TestCase
protected function setUp(): void protected function setUp(): void
{ {
$this->serviceAvailabilityCalculator = $this->createMock(ServiceAvailabilityCalculator::class); $this->serviceAvailabilityCalculator = $this->createMock(ServiceAvailabilityCalculator::class);
$insuranceService = $this->createMock(InsuranceService::class); $insuranceService = $this->createMock(InsuranceManager::class);
$priceCalculatorService = $this->createMock(BookingPriceCalculatorService::class); $priceCalculatorService = $this->createMock(BookingPriceCalculator::class);
$serviceLabelFormatter = new ServiceLabelFormatter(); $serviceLabelFormatter = new ServiceLabelFormatter();
$translator = $this->createMock(TranslatorInterface::class); $translator = $this->createMock(TranslatorInterface::class);
@@ -10,8 +10,8 @@ use App\BusProNet\Model\Travel;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Form\Service\ParticipantFieldOptionsProvider; use App\Form\Service\ParticipantFieldOptionsProvider;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\InsuranceService; use App\Service\InsuranceManager;
use App\Service\ServiceLabelFormatter; use App\Service\ServiceLabelFormatter;
use App\Service\ServiceAvailabilityCalculator; use App\Service\ServiceAvailabilityCalculator;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
@@ -29,8 +29,8 @@ class ParticipantFieldOptionsProviderMandatoryServiceTest extends TestCase
protected function setUp(): void protected function setUp(): void
{ {
$serviceAvailabilityCalculator = $this->createMock(ServiceAvailabilityCalculator::class); $serviceAvailabilityCalculator = $this->createMock(ServiceAvailabilityCalculator::class);
$insuranceService = $this->createMock(InsuranceService::class); $insuranceService = $this->createMock(InsuranceManager::class);
$priceCalculatorService = $this->createMock(BookingPriceCalculatorService::class); $priceCalculatorService = $this->createMock(BookingPriceCalculator::class);
$serviceLabelFormatter = new ServiceLabelFormatter(); $serviceLabelFormatter = new ServiceLabelFormatter();
$translator = $this->createMock(TranslatorInterface::class); $translator = $this->createMock(TranslatorInterface::class);
@@ -9,20 +9,20 @@ use App\BusProNet\Model\Travel;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Form\Service\ParticipantInsuranceFieldHandler; use App\Form\Service\ParticipantInsuranceFieldHandler;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\InsuranceService; use App\Service\InsuranceManager;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class ParticipantInsuranceFieldHandlerTest extends TestCase class ParticipantInsuranceFieldHandlerTest extends TestCase
{ {
private ParticipantInsuranceFieldHandler $handler; private ParticipantInsuranceFieldHandler $handler;
private InsuranceService $insuranceService; private InsuranceManager $insuranceService;
private BookingPriceCalculatorService $priceCalculatorService; private BookingPriceCalculator $priceCalculatorService;
protected function setUp(): void protected function setUp(): void
{ {
$this->insuranceService = $this->createMock(InsuranceService::class); $this->insuranceService = $this->createMock(InsuranceManager::class);
$this->priceCalculatorService = $this->createMock(BookingPriceCalculatorService::class); $this->priceCalculatorService = $this->createMock(BookingPriceCalculator::class);
// Mock getSelectableInsurances to return input array // Mock getSelectableInsurances to return input array
$this->insuranceService->method('getSelectableInsurances') $this->insuranceService->method('getSelectableInsurances')
+3 -3
View File
@@ -5,19 +5,19 @@ declare(strict_types=1);
namespace App\Tests\Logger; namespace App\Tests\Logger;
use App\Logger\ErrorCodeProcessor; use App\Logger\ErrorCodeProcessor;
use App\Service\ErrorCodeService; use App\Service\ErrorCodeGenerator;
use Monolog\Level; use Monolog\Level;
use Monolog\LogRecord; use Monolog\LogRecord;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class ErrorCodeProcessorTest extends TestCase class ErrorCodeProcessorTest extends TestCase
{ {
private ErrorCodeService $errorCodeService; private ErrorCodeGenerator $errorCodeService;
private ErrorCodeProcessor $processor; private ErrorCodeProcessor $processor;
protected function setUp(): void protected function setUp(): void
{ {
$this->errorCodeService = $this->createMock(ErrorCodeService::class); $this->errorCodeService = $this->createMock(ErrorCodeGenerator::class);
$this->processor = new ErrorCodeProcessor($this->errorCodeService); $this->processor = new ErrorCodeProcessor($this->errorCodeService);
} }
@@ -11,27 +11,27 @@ use App\BusProNet\Service\BookingStatusRuleRegistry;
use App\BusProNet\XmlLoader\AgencyLoader; use App\BusProNet\XmlLoader\AgencyLoader;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Service\BookingService; use App\Service\BookingConfigurator;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use App\Service\ParticipantEligibilityService; use App\Service\ParticipantEligibilityChecker;
use App\Service\TravelDataService; use App\Service\TravelDataProvider;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class BookingServiceBabyTest extends TestCase class BookingConfiguratorBabyTest extends TestCase
{ {
private BookingService $bookingService; private BookingConfigurator $bookingService;
private ParticipantEligibilityService $participantEligibilityService; private ParticipantEligibilityChecker $participantEligibilityService;
protected function setUp(): void protected function setUp(): void
{ {
$travelDataService = $this->createMock(TravelDataService::class); $travelDataService = $this->createMock(TravelDataProvider::class);
$this->participantEligibilityService = $this->createMock(ParticipantEligibilityService::class); $this->participantEligibilityService = $this->createMock(ParticipantEligibilityChecker::class);
$bookingStatusRuleRegistry = $this->createMock(BookingStatusRuleRegistry::class); $bookingStatusRuleRegistry = $this->createMock(BookingStatusRuleRegistry::class);
$bookingStatusRuleRegistry->method('evaluateStatus')->willReturn('F'); $bookingStatusRuleRegistry->method('evaluateStatus')->willReturn('F');
$agencyLoader = $this->createMock(AgencyLoader::class); $agencyLoader = $this->createMock(AgencyLoader::class);
$this->bookingService = new BookingService( $this->bookingService = new BookingConfigurator(
$this->createMock(BookingSessionService::class), $this->createMock(BookingSessionStore::class),
$travelDataService, $travelDataService,
$this->participantEligibilityService, $this->participantEligibilityService,
$bookingStatusRuleRegistry, $bookingStatusRuleRegistry,
@@ -11,30 +11,30 @@ use App\BusProNet\Model\Travel;
use App\BusProNet\Service\BookingStatusRuleRegistry; use App\BusProNet\Service\BookingStatusRuleRegistry;
use App\BusProNet\XmlLoader\AgencyLoader; use App\BusProNet\XmlLoader\AgencyLoader;
use App\Exception\NoRoomsAvailableException; use App\Exception\NoRoomsAvailableException;
use App\Service\BookingService; use App\Service\BookingConfigurator;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use App\Service\ParticipantEligibilityService; use App\Service\ParticipantEligibilityChecker;
use App\Service\TravelDataService; use App\Service\TravelDataProvider;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
class BookingServiceStatusTest extends TestCase class BookingConfiguratorStatusTest extends TestCase
{ {
private BookingService $bookingService; private BookingConfigurator $bookingService;
private TravelDataService $travelDataService; private TravelDataProvider $travelDataService;
protected function setUp(): void protected function setUp(): void
{ {
$bookingSessionService = $this->createMock(BookingSessionService::class); $bookingSessionService = $this->createMock(BookingSessionStore::class);
$this->travelDataService = $this->createMock(TravelDataService::class); $this->travelDataService = $this->createMock(TravelDataProvider::class);
$participantEligibility = $this->createMock(ParticipantEligibilityService::class); $participantEligibility = $this->createMock(ParticipantEligibilityChecker::class);
$bookingStatusRuleRegistry = $this->createMock(BookingStatusRuleRegistry::class); $bookingStatusRuleRegistry = $this->createMock(BookingStatusRuleRegistry::class);
$bookingStatusRuleRegistry->method('evaluateStatus')->willReturn('F'); $bookingStatusRuleRegistry->method('evaluateStatus')->willReturn('F');
$agencyLoader = $this->createMock(AgencyLoader::class); $agencyLoader = $this->createMock(AgencyLoader::class);
$this->bookingService = new BookingService( $this->bookingService = new BookingConfigurator(
$bookingSessionService, $bookingSessionService,
$this->travelDataService, $this->travelDataService,
$participantEligibility, $participantEligibility,
@@ -177,10 +177,10 @@ class BookingServiceStatusTest extends TestCase
$bookingStatusRuleRegistry = $this->createMock(BookingStatusRuleRegistry::class); $bookingStatusRuleRegistry = $this->createMock(BookingStatusRuleRegistry::class);
$bookingStatusRuleRegistry->method('evaluateStatus')->willReturn('O'); $bookingStatusRuleRegistry->method('evaluateStatus')->willReturn('O');
$bookingService = new BookingService( $bookingService = new BookingConfigurator(
$this->createMock(BookingSessionService::class), $this->createMock(BookingSessionStore::class),
$this->travelDataService, $this->travelDataService,
$this->createMock(ParticipantEligibilityService::class), $this->createMock(ParticipantEligibilityChecker::class),
$bookingStatusRuleRegistry, $bookingStatusRuleRegistry,
$this->createMock(AgencyLoader::class), $this->createMock(AgencyLoader::class),
'F' 'F'
@@ -208,10 +208,10 @@ class BookingServiceStatusTest extends TestCase
$bookingStatusRuleRegistry = $this->createMock(BookingStatusRuleRegistry::class); $bookingStatusRuleRegistry = $this->createMock(BookingStatusRuleRegistry::class);
$bookingStatusRuleRegistry->expects($this->never())->method('evaluateStatus'); $bookingStatusRuleRegistry->expects($this->never())->method('evaluateStatus');
$bookingService = new BookingService( $bookingService = new BookingConfigurator(
$this->createMock(BookingSessionService::class), $this->createMock(BookingSessionStore::class),
$this->travelDataService, $this->travelDataService,
$this->createMock(ParticipantEligibilityService::class), $this->createMock(ParticipantEligibilityChecker::class),
$bookingStatusRuleRegistry, $bookingStatusRuleRegistry,
$this->createMock(AgencyLoader::class), $this->createMock(AgencyLoader::class),
'F' 'F'
+15 -15
View File
@@ -13,9 +13,9 @@ use App\Form\Model\BookingMutabilityDto;
use App\Form\Model\BookingEditContext; use App\Form\Model\BookingEditContext;
use App\Form\Model\BookingSummaryDto; use App\Form\Model\BookingSummaryDto;
use App\Service\BookingEditContextFactory; use App\Service\BookingEditContextFactory;
use App\Service\BookingSummaryDataService; use App\Service\BookingSummaryAssembler;
use App\Service\ParticipantCardDataService; use App\Service\ParticipantCardAssembler;
use App\Service\TravelDataService; use App\Service\TravelDataProvider;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class BookingEditContextFactoryTest extends TestCase class BookingEditContextFactoryTest extends TestCase
@@ -27,14 +27,14 @@ class BookingEditContextFactoryTest extends TestCase
$travel->dateTo = new \DateTimeImmutable('2030-01-06'); $travel->dateTo = new \DateTimeImmutable('2030-01-06');
$bookingDto = new BookingDto($travel, 157047); $bookingDto = new BookingDto($travel, 157047);
$travelDataService = $this->createMock(TravelDataService::class); $travelDataService = $this->createMock(TravelDataProvider::class);
$travelDataService->expects($this->once()) $travelDataService->expects($this->once())
->method('enrichWithFreshAvailabilities') ->method('enrichWithFreshAvailabilities')
->with($travel); ->with($travel);
$service = new BookingEditContextFactory( $service = new BookingEditContextFactory(
$this->createMock(ParticipantCardDataService::class), $this->createMock(ParticipantCardAssembler::class),
$this->createMock(BookingSummaryDataService::class), $this->createMock(BookingSummaryAssembler::class),
$travelDataService, $travelDataService,
); );
@@ -58,20 +58,20 @@ class BookingEditContextFactoryTest extends TestCase
]); ]);
$summaryData = $this->createMock(BookingSummaryDto::class); $summaryData = $this->createMock(BookingSummaryDto::class);
$summaryDataService = $this->createMock(BookingSummaryDataService::class); $summaryDataService = $this->createMock(BookingSummaryAssembler::class);
$summaryDataService->expects($this->once()) $summaryDataService->expects($this->once())
->method('getSummaryData') ->method('getSummaryData')
->with($bookingDto) ->with($bookingDto)
->willReturn($summaryData); ->willReturn($summaryData);
$travelDataService = $this->createMock(TravelDataService::class); $travelDataService = $this->createMock(TravelDataProvider::class);
$travelDataService->expects($this->once()) $travelDataService->expects($this->once())
->method('getMutabilityData') ->method('getMutabilityData')
->with(1234) ->with(1234)
->willReturn($mutableData); ->willReturn($mutableData);
$service = new BookingEditContextFactory( $service = new BookingEditContextFactory(
$this->createMock(ParticipantCardDataService::class), $this->createMock(ParticipantCardAssembler::class),
$summaryDataService, $summaryDataService,
$travelDataService, $travelDataService,
); );
@@ -96,18 +96,18 @@ class BookingEditContextFactoryTest extends TestCase
$bookingDto = new BookingDto($travel, 157047); $bookingDto = new BookingDto($travel, 157047);
$summaryData = $this->createMock(BookingSummaryDto::class); $summaryData = $this->createMock(BookingSummaryDto::class);
$summaryDataService = $this->createMock(BookingSummaryDataService::class); $summaryDataService = $this->createMock(BookingSummaryAssembler::class);
$summaryDataService->expects($this->once()) $summaryDataService->expects($this->once())
->method('getSummaryData') ->method('getSummaryData')
->with($bookingDto) ->with($bookingDto)
->willReturn($summaryData); ->willReturn($summaryData);
$travelDataService = $this->createMock(TravelDataService::class); $travelDataService = $this->createMock(TravelDataProvider::class);
$travelDataService->expects($this->never()) $travelDataService->expects($this->never())
->method('getMutabilityData'); ->method('getMutabilityData');
$service = new BookingEditContextFactory( $service = new BookingEditContextFactory(
$this->createMock(ParticipantCardDataService::class), $this->createMock(ParticipantCardAssembler::class),
$summaryDataService, $summaryDataService,
$travelDataService, $travelDataService,
); );
@@ -135,19 +135,19 @@ class BookingEditContextFactoryTest extends TestCase
$summaryData = $this->createMock(BookingSummaryDto::class); $summaryData = $this->createMock(BookingSummaryDto::class);
$cardsData = []; $cardsData = [];
$participantCardDataService = $this->createMock(ParticipantCardDataService::class); $participantCardDataService = $this->createMock(ParticipantCardAssembler::class);
$participantCardDataService->expects($this->once()) $participantCardDataService->expects($this->once())
->method('getAllCardsDataWithValidation') ->method('getAllCardsDataWithValidation')
->with($bookingDto) ->with($bookingDto)
->willReturn($cardsData); ->willReturn($cardsData);
$summaryDataService = $this->createMock(BookingSummaryDataService::class); $summaryDataService = $this->createMock(BookingSummaryAssembler::class);
$summaryDataService->expects($this->once()) $summaryDataService->expects($this->once())
->method('getSummaryData') ->method('getSummaryData')
->with($bookingDto) ->with($bookingDto)
->willReturn($summaryData); ->willReturn($summaryData);
$travelDataService = $this->createMock(TravelDataService::class); $travelDataService = $this->createMock(TravelDataProvider::class);
$travelDataService->expects($this->once()) $travelDataService->expects($this->once())
->method('getMutabilityData') ->method('getMutabilityData')
->with(1234) ->with(1234)
@@ -11,11 +11,11 @@ use App\BusProNet\Model\Service;
use App\BusProNet\Model\Travel; use App\BusProNet\Model\Travel;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Service\BookingEditSubmitGuardService; use App\Service\BookingEditSubmitGuard;
use Carbon\CarbonImmutable; use Carbon\CarbonImmutable;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class BookingEditSubmitGuardServiceTest extends TestCase class BookingEditSubmitGuardTest extends TestCase
{ {
protected function tearDown(): void protected function tearDown(): void
{ {
@@ -52,7 +52,7 @@ class BookingEditSubmitGuardServiceTest extends TestCase
->method('createBookingDtoFromBooking') ->method('createBookingDtoFromBooking')
->willReturn($baselineDto); ->willReturn($baselineDto);
$service = new BookingEditSubmitGuardService($processor); $service = new BookingEditSubmitGuard($processor);
$changed = $service->reconcileImmutableCategories($workingDto, new Booking()); $changed = $service->reconcileImmutableCategories($workingDto, new Booking());
@@ -88,7 +88,7 @@ class BookingEditSubmitGuardServiceTest extends TestCase
->method('createBookingDtoFromBooking') ->method('createBookingDtoFromBooking')
->willReturn($baselineDto); ->willReturn($baselineDto);
$service = new BookingEditSubmitGuardService($processor); $service = new BookingEditSubmitGuard($processor);
$changed = $service->reconcileImmutableCategories($workingDto, new Booking()); $changed = $service->reconcileImmutableCategories($workingDto, new Booking());
@@ -125,7 +125,7 @@ class BookingEditSubmitGuardServiceTest extends TestCase
->method('createBookingDtoFromBooking') ->method('createBookingDtoFromBooking')
->willReturn($baselineDto); ->willReturn($baselineDto);
$service = new BookingEditSubmitGuardService($processor); $service = new BookingEditSubmitGuard($processor);
$changed = $service->reconcileImmutableCategories($workingDto, new Booking()); $changed = $service->reconcileImmutableCategories($workingDto, new Booking());
@@ -12,12 +12,12 @@ use App\BusProNet\Model\Notification;
use App\BusProNet\Model\Travel; use App\BusProNet\Model\Travel;
use App\Entity\User; use App\Entity\User;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Service\BookingEditDataLoaderService; use App\Service\BookingEditDataLoader;
use App\Service\BookingEditDraftService; use App\Service\BookingEditDraftManager;
use App\Service\BookingEditSubmitGuardService; use App\Service\BookingEditSubmitGuard;
use App\Service\BookingEditSubmitService; use App\Service\BookingEditSubmitter;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use App\Service\TravelDataService; use App\Service\TravelDataProvider;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
@@ -25,7 +25,7 @@ use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class BookingEditSubmitServiceTest extends TestCase class BookingEditSubmitterTest extends TestCase
{ {
public function testHandleSubmissionReturnsRedirectWhenFreshBookingDataCannotBeLoaded(): void public function testHandleSubmissionReturnsRedirectWhenFreshBookingDataCannotBeLoaded(): void
{ {
@@ -33,7 +33,7 @@ class BookingEditSubmitServiceTest extends TestCase
$user = $this->createUser(); $user = $this->createUser();
$bookingDto = $this->createBookingDto(); $bookingDto = $this->createBookingDto();
$dataLoader = $this->createMock(BookingEditDataLoaderService::class); $dataLoader = $this->createMock(BookingEditDataLoader::class);
$dataLoader->expects($this->once()) $dataLoader->expects($this->once())
->method('invalidateBookingCache') ->method('invalidateBookingCache')
->with(42, $user); ->with(42, $user);
@@ -68,7 +68,7 @@ class BookingEditSubmitServiceTest extends TestCase
$bookingDto = $this->createBookingDto(); $bookingDto = $this->createBookingDto();
$freshBookingData = $this->createFreshBooking(); $freshBookingData = $this->createFreshBooking();
$dataLoader = $this->createMock(BookingEditDataLoaderService::class); $dataLoader = $this->createMock(BookingEditDataLoader::class);
$dataLoader->expects($this->exactly(1)) $dataLoader->expects($this->exactly(1))
->method('invalidateBookingCache') ->method('invalidateBookingCache')
->with(42, $user); ->with(42, $user);
@@ -77,7 +77,7 @@ class BookingEditSubmitServiceTest extends TestCase
->with(42, $user) ->with(42, $user)
->willReturn($freshBookingData); ->willReturn($freshBookingData);
$travelDataService = $this->createMock(TravelDataService::class); $travelDataService = $this->createMock(TravelDataProvider::class);
$travelDataService->expects($this->once()) $travelDataService->expects($this->once())
->method('getMutabilityData') ->method('getMutabilityData')
->with(1234, true, true) ->with(1234, true, true)
@@ -85,7 +85,7 @@ class BookingEditSubmitServiceTest extends TestCase
$travelDataService->expects($this->never()) $travelDataService->expects($this->never())
->method('patchMutability'); ->method('patchMutability');
$submitGuard = $this->createMock(BookingEditSubmitGuardService::class); $submitGuard = $this->createMock(BookingEditSubmitGuard::class);
$submitGuard->expects($this->once()) $submitGuard->expects($this->once())
->method('reconcileImmutableCategories') ->method('reconcileImmutableCategories')
->with($bookingDto, $freshBookingData) ->with($bookingDto, $freshBookingData)
@@ -117,7 +117,7 @@ class BookingEditSubmitServiceTest extends TestCase
$bookingDto = $this->createBookingDto(); $bookingDto = $this->createBookingDto();
$freshBookingData = $this->createFreshBooking(); $freshBookingData = $this->createFreshBooking();
$dataLoader = $this->createMock(BookingEditDataLoaderService::class); $dataLoader = $this->createMock(BookingEditDataLoader::class);
$dataLoader->expects($this->once()) $dataLoader->expects($this->once())
->method('invalidateBookingCache') ->method('invalidateBookingCache')
->with(42, $user); ->with(42, $user);
@@ -126,7 +126,7 @@ class BookingEditSubmitServiceTest extends TestCase
->with(42, $user) ->with(42, $user)
->willReturn($freshBookingData); ->willReturn($freshBookingData);
$travelDataService = $this->createMock(TravelDataService::class); $travelDataService = $this->createMock(TravelDataProvider::class);
$travelDataService->expects($this->once()) $travelDataService->expects($this->once())
->method('getMutabilityData') ->method('getMutabilityData')
->with(1234, true, true) ->with(1234, true, true)
@@ -134,7 +134,7 @@ class BookingEditSubmitServiceTest extends TestCase
$travelDataService->expects($this->never()) $travelDataService->expects($this->never())
->method('patchMutability'); ->method('patchMutability');
$submitGuard = $this->createMock(BookingEditSubmitGuardService::class); $submitGuard = $this->createMock(BookingEditSubmitGuard::class);
$submitGuard->expects($this->once()) $submitGuard->expects($this->once())
->method('reconcileImmutableCategories') ->method('reconcileImmutableCategories')
->with($bookingDto, $freshBookingData) ->with($bookingDto, $freshBookingData)
@@ -179,7 +179,7 @@ class BookingEditSubmitServiceTest extends TestCase
$bookingDto = $this->createBookingDto(); $bookingDto = $this->createBookingDto();
$freshBookingData = $this->createFreshBooking(); $freshBookingData = $this->createFreshBooking();
$dataLoader = $this->createMock(BookingEditDataLoaderService::class); $dataLoader = $this->createMock(BookingEditDataLoader::class);
$dataLoader->expects($this->exactly(2)) $dataLoader->expects($this->exactly(2))
->method('invalidateBookingCache') ->method('invalidateBookingCache')
->with(42, $user); ->with(42, $user);
@@ -188,7 +188,7 @@ class BookingEditSubmitServiceTest extends TestCase
->with(42, $user) ->with(42, $user)
->willReturn($freshBookingData); ->willReturn($freshBookingData);
$travelDataService = $this->createMock(TravelDataService::class); $travelDataService = $this->createMock(TravelDataProvider::class);
$travelDataService->expects($this->once()) $travelDataService->expects($this->once())
->method('getMutabilityData') ->method('getMutabilityData')
->with(1234, true, true) ->with(1234, true, true)
@@ -196,7 +196,7 @@ class BookingEditSubmitServiceTest extends TestCase
$travelDataService->expects($this->never()) $travelDataService->expects($this->never())
->method('patchMutability'); ->method('patchMutability');
$submitGuard = $this->createMock(BookingEditSubmitGuardService::class); $submitGuard = $this->createMock(BookingEditSubmitGuard::class);
$submitGuard->expects($this->once()) $submitGuard->expects($this->once())
->method('reconcileImmutableCategories') ->method('reconcileImmutableCategories')
->with($bookingDto, $freshBookingData) ->with($bookingDto, $freshBookingData)
@@ -210,14 +210,14 @@ class BookingEditSubmitServiceTest extends TestCase
->with($bookingDto, true) ->with($bookingDto, true)
->willReturn($bookingUpdate); ->willReturn($bookingUpdate);
$bookingSessionService = $this->createMock(BookingSessionService::class); $bookingSessionService = $this->createMock(BookingSessionStore::class);
$bookingSessionService->expects($this->once()) $bookingSessionService->expects($this->once())
->method('clearBookingDto') ->method('clearBookingDto')
->with($request, BookingDto::MODE_EDIT); ->with($request, BookingDto::MODE_EDIT);
$bookingSessionService->expects($this->never()) $bookingSessionService->expects($this->never())
->method('saveBookingDto'); ->method('saveBookingDto');
$draftService = $this->createMock(BookingEditDraftService::class); $draftService = $this->createMock(BookingEditDraftManager::class);
$draftService->expects($this->once()) $draftService->expects($this->once())
->method('deleteDraft') ->method('deleteDraft')
->with($user, 42); ->with($user, 42);
@@ -245,7 +245,7 @@ class BookingEditSubmitServiceTest extends TestCase
$bookingDto = $this->createBookingDto(); $bookingDto = $this->createBookingDto();
$freshBookingData = $this->createFreshBooking(); $freshBookingData = $this->createFreshBooking();
$dataLoader = $this->createMock(BookingEditDataLoaderService::class); $dataLoader = $this->createMock(BookingEditDataLoader::class);
$dataLoader->expects($this->exactly(2)) $dataLoader->expects($this->exactly(2))
->method('invalidateBookingCache') ->method('invalidateBookingCache')
->with(42, $user); ->with(42, $user);
@@ -254,7 +254,7 @@ class BookingEditSubmitServiceTest extends TestCase
->with(42, $user) ->with(42, $user)
->willReturn($freshBookingData); ->willReturn($freshBookingData);
$travelDataService = $this->createMock(TravelDataService::class); $travelDataService = $this->createMock(TravelDataProvider::class);
$travelDataService->expects($this->once()) $travelDataService->expects($this->once())
->method('getMutabilityData') ->method('getMutabilityData')
->with(1234, true, true) ->with(1234, true, true)
@@ -262,7 +262,7 @@ class BookingEditSubmitServiceTest extends TestCase
$travelDataService->expects($this->never()) $travelDataService->expects($this->never())
->method('patchMutability'); ->method('patchMutability');
$submitGuard = $this->createMock(BookingEditSubmitGuardService::class); $submitGuard = $this->createMock(BookingEditSubmitGuard::class);
$submitGuard->expects($this->once()) $submitGuard->expects($this->once())
->method('reconcileImmutableCategories') ->method('reconcileImmutableCategories')
->with($bookingDto, $freshBookingData) ->with($bookingDto, $freshBookingData)
@@ -276,7 +276,7 @@ class BookingEditSubmitServiceTest extends TestCase
->with($bookingDto, true) ->with($bookingDto, true)
->willReturn($bookingUpdate); ->willReturn($bookingUpdate);
$bookingSessionService = $this->createMock(BookingSessionService::class); $bookingSessionService = $this->createMock(BookingSessionStore::class);
$bookingSessionService->expects($this->once()) $bookingSessionService->expects($this->once())
->method('saveBookingDto') ->method('saveBookingDto')
->with($request, $bookingDto, BookingDto::MODE_EDIT); ->with($request, $bookingDto, BookingDto::MODE_EDIT);
@@ -284,7 +284,7 @@ class BookingEditSubmitServiceTest extends TestCase
->method('clearBookingDto') ->method('clearBookingDto')
->with($request, BookingDto::MODE_EDIT); ->with($request, BookingDto::MODE_EDIT);
$draftService = $this->createMock(BookingEditDraftService::class); $draftService = $this->createMock(BookingEditDraftManager::class);
$draftService->expects($this->once()) $draftService->expects($this->once())
->method('deleteDraft') ->method('deleteDraft')
->with($user, 42); ->with($user, 42);
@@ -330,7 +330,7 @@ class BookingEditSubmitServiceTest extends TestCase
$bookingDto = $this->createBookingDto(); $bookingDto = $this->createBookingDto();
$freshBookingData = $this->createFreshBooking(); $freshBookingData = $this->createFreshBooking();
$dataLoader = $this->createMock(BookingEditDataLoaderService::class); $dataLoader = $this->createMock(BookingEditDataLoader::class);
$dataLoader->expects($this->once()) $dataLoader->expects($this->once())
->method('invalidateBookingCache') ->method('invalidateBookingCache')
->with(42, $user); ->with(42, $user);
@@ -339,7 +339,7 @@ class BookingEditSubmitServiceTest extends TestCase
->with(42, $user) ->with(42, $user)
->willReturn($freshBookingData); ->willReturn($freshBookingData);
$travelDataService = $this->createMock(TravelDataService::class); $travelDataService = $this->createMock(TravelDataProvider::class);
$travelDataService->expects($this->once()) $travelDataService->expects($this->once())
->method('getMutabilityData') ->method('getMutabilityData')
->with(1234, true, true) ->with(1234, true, true)
@@ -347,7 +347,7 @@ class BookingEditSubmitServiceTest extends TestCase
$travelDataService->expects($this->never()) $travelDataService->expects($this->never())
->method('patchMutability'); ->method('patchMutability');
$submitGuard = $this->createMock(BookingEditSubmitGuardService::class); $submitGuard = $this->createMock(BookingEditSubmitGuard::class);
$submitGuard->expects($this->once()) $submitGuard->expects($this->once())
->method('reconcileImmutableCategories') ->method('reconcileImmutableCategories')
->with($bookingDto, $freshBookingData) ->with($bookingDto, $freshBookingData)
@@ -379,7 +379,7 @@ class BookingEditSubmitServiceTest extends TestCase
$bookingDto = $this->createBookingDto(); $bookingDto = $this->createBookingDto();
$freshBookingData = $this->createFreshBooking(); $freshBookingData = $this->createFreshBooking();
$dataLoader = $this->createMock(BookingEditDataLoaderService::class); $dataLoader = $this->createMock(BookingEditDataLoader::class);
$dataLoader->expects($this->once()) $dataLoader->expects($this->once())
->method('invalidateBookingCache') ->method('invalidateBookingCache')
->with(42, $user); ->with(42, $user);
@@ -388,7 +388,7 @@ class BookingEditSubmitServiceTest extends TestCase
->with(42, $user) ->with(42, $user)
->willReturn($freshBookingData); ->willReturn($freshBookingData);
$travelDataService = $this->createMock(TravelDataService::class); $travelDataService = $this->createMock(TravelDataProvider::class);
$travelDataService->expects($this->once()) $travelDataService->expects($this->once())
->method('getMutabilityData') ->method('getMutabilityData')
->with(1234, true, true) ->with(1234, true, true)
@@ -396,7 +396,7 @@ class BookingEditSubmitServiceTest extends TestCase
$travelDataService->expects($this->never()) $travelDataService->expects($this->never())
->method('patchMutability'); ->method('patchMutability');
$submitGuard = $this->createMock(BookingEditSubmitGuardService::class); $submitGuard = $this->createMock(BookingEditSubmitGuard::class);
$submitGuard->expects($this->once()) $submitGuard->expects($this->once())
->method('reconcileImmutableCategories') ->method('reconcileImmutableCategories')
->with($bookingDto, $freshBookingData) ->with($bookingDto, $freshBookingData)
@@ -423,19 +423,19 @@ class BookingEditSubmitServiceTest extends TestCase
private function createService( private function createService(
?\App\BusProNet\ApiClient $apiClient = null, ?\App\BusProNet\ApiClient $apiClient = null,
?BookingEditDataLoaderService $dataLoader = null, ?BookingEditDataLoader $dataLoader = null,
?BookingEditDraftService $draftService = null, ?BookingEditDraftManager $draftService = null,
?TravelDataService $travelDataService = null, ?TravelDataProvider $travelDataService = null,
?BookingEditSubmitGuardService $submitGuard = null, ?BookingEditSubmitGuard $submitGuard = null,
?BookingSessionService $bookingSessionService = null, ?BookingSessionStore $bookingSessionService = null,
): BookingEditSubmitService { ): BookingEditSubmitter {
return new BookingEditSubmitService( return new BookingEditSubmitter(
$apiClient ?? $this->createMock(\App\BusProNet\ApiClient::class), $apiClient ?? $this->createMock(\App\BusProNet\ApiClient::class),
$dataLoader ?? $this->createMock(BookingEditDataLoaderService::class), $dataLoader ?? $this->createMock(BookingEditDataLoader::class),
$draftService ?? $this->createMock(BookingEditDraftService::class), $draftService ?? $this->createMock(BookingEditDraftManager::class),
$travelDataService ?? $this->createMock(TravelDataService::class), $travelDataService ?? $this->createMock(TravelDataProvider::class),
$submitGuard ?? $this->createMock(BookingEditSubmitGuardService::class), $submitGuard ?? $this->createMock(BookingEditSubmitGuard::class),
$bookingSessionService ?? $this->createMock(BookingSessionService::class), $bookingSessionService ?? $this->createMock(BookingSessionStore::class),
$this->createUrlGenerator(), $this->createUrlGenerator(),
$this->createMock(LoggerInterface::class), $this->createMock(LoggerInterface::class),
); );
@@ -11,23 +11,23 @@ use App\BusProNet\Model\Travel;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Form\Model\RoomSelectionDto; use App\Form\Model\RoomSelectionDto;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\InsuranceService; use App\Service\InsuranceManager;
use App\Service\ParticipantEligibilityService; use App\Service\ParticipantEligibilityChecker;
use App\Service\ParticipantPricingCalculator; use App\Service\ParticipantPricingCalculator;
use App\Service\RoomPricingCalculator; use App\Service\RoomPricingCalculator;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class BookingPriceCalculatorServiceTest extends TestCase class BookingPriceCalculatorTest extends TestCase
{ {
private BookingPriceCalculatorService $service; private BookingPriceCalculator $service;
private ParticipantEligibilityService $participantEligibilityService; private ParticipantEligibilityChecker $participantEligibilityService;
private RoomPricingCalculator $roomPricingCalculator; private RoomPricingCalculator $roomPricingCalculator;
private ParticipantPricingCalculator $participantPricingCalculator; private ParticipantPricingCalculator $participantPricingCalculator;
protected function setUp(): void protected function setUp(): void
{ {
$this->participantEligibilityService = $this->createMock(ParticipantEligibilityService::class); $this->participantEligibilityService = $this->createMock(ParticipantEligibilityChecker::class);
$this->participantEligibilityService->method('isParticipantEligible')->willReturn(true); $this->participantEligibilityService->method('isParticipantEligible')->willReturn(true);
$this->roomPricingCalculator = new RoomPricingCalculator(); $this->roomPricingCalculator = new RoomPricingCalculator();
@@ -595,7 +595,7 @@ class BookingPriceCalculatorServiceTest extends TestCase
$bookingDto->participants = [$participant1, $participant2]; $bookingDto->participants = [$participant1, $participant2];
// Mock participant eligibility to mark second participant as ineligible // Mock participant eligibility to mark second participant as ineligible
$participantEligibilityService = $this->createMock(ParticipantEligibilityService::class); $participantEligibilityService = $this->createMock(ParticipantEligibilityChecker::class);
$participantEligibilityService->method('isParticipantEligible') $participantEligibilityService->method('isParticipantEligible')
->willReturnCallback(fn ($booking, $index) => 0 === $index); // Only first participant eligible ->willReturnCallback(fn ($booking, $index) => 0 === $index); // Only first participant eligible
@@ -695,12 +695,12 @@ class BookingPriceCalculatorServiceTest extends TestCase
return $participant; return $participant;
} }
private function createService(ParticipantEligibilityService $participantEligibilityService): BookingPriceCalculatorService private function createService(ParticipantEligibilityChecker $participantEligibilityService): BookingPriceCalculator
{ {
return new BookingPriceCalculatorService( return new BookingPriceCalculator(
$this->roomPricingCalculator, $this->roomPricingCalculator,
$participantEligibilityService, $participantEligibilityService,
new InsuranceService(), new InsuranceManager(),
$this->participantPricingCalculator, $this->participantPricingCalculator,
); );
} }
@@ -11,16 +11,16 @@ use App\BusProNet\Model\Travel;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Form\Model\RoomSelectionDto; use App\Form\Model\RoomSelectionDto;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPricingAssembler;
use App\Service\BookingPriceMismatchDiagnosticsService; use App\Service\BookingPriceMismatchAnalyzer;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class BookingPriceMismatchDiagnosticsServiceTest extends TestCase class BookingPriceMismatchAnalyzerTest extends TestCase
{ {
public function testBuildDiagnosticsProvidesDeltaBreakdown(): void public function testBuildDiagnosticsProvidesDeltaBreakdown(): void
{ {
$priceCalculator = $this->createMock(BookingPriceCalculatorService::class); $pricingAssembler = $this->createMock(BookingPricingAssembler::class);
$priceCalculator->method('getPricingBreakdown')->willReturn([ $pricingAssembler->method('getPricingBreakdown')->willReturn([
'rooms' => [ 'rooms' => [
['roomId' => 74, 'totalPrice' => 444.0], ['roomId' => 74, 'totalPrice' => 444.0],
], ],
@@ -36,7 +36,7 @@ class BookingPriceMismatchDiagnosticsServiceTest extends TestCase
'grandTotal' => 513.5, 'grandTotal' => 513.5,
]); ]);
$service = new BookingPriceMismatchDiagnosticsService($priceCalculator); $service = new BookingPriceMismatchAnalyzer($pricingAssembler);
$bookingDto = new BookingDto(new Travel(), 197136); $bookingDto = new BookingDto(new Travel(), 197136);
$roomSelection = new RoomSelectionDto(); $roomSelection = new RoomSelectionDto();
@@ -8,22 +8,22 @@ use App\BusProNet\Model\Booking;
use App\BusProNet\Model\Travel; use App\BusProNet\Model\Travel;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\RoomSelectionDto; use App\Form\Model\RoomSelectionDto;
use App\Service\BookingSessionService; use App\Service\BookingSessionStore;
use App\Service\TravelDataService; use App\Service\TravelDataProvider;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
class BookingSessionServiceTest extends TestCase class BookingSessionStoreTest extends TestCase
{ {
private TravelDataService $travelDataService; private TravelDataProvider $travelDataService;
private BookingSessionService $service; private BookingSessionStore $service;
protected function setUp(): void protected function setUp(): void
{ {
$this->travelDataService = $this->createMock(TravelDataService::class); $this->travelDataService = $this->createMock(TravelDataProvider::class);
$this->service = new BookingSessionService($this->travelDataService); $this->service = new BookingSessionStore($this->travelDataService);
} }
public function testGetOrCreateBookingCreateDtoThrowsWhenSessionMissing(): void public function testGetOrCreateBookingCreateDtoThrowsWhenSessionMissing(): void
@@ -91,7 +91,7 @@ class BookingSessionServiceTest extends TestCase
$this->service->storeReturnUrl($request, 'javascript:alert(1)'); $this->service->storeReturnUrl($request, 'javascript:alert(1)');
$this->assertSame(BookingSessionService::DEFAULT_RETURN_URL, $this->service->getReturnUrl($request)); $this->assertSame(BookingSessionStore::DEFAULT_RETURN_URL, $this->service->getReturnUrl($request));
} }
public function testClearBookingSessionPreservesReturnUrl(): void public function testClearBookingSessionPreservesReturnUrl(): void
@@ -4,20 +4,20 @@ declare(strict_types=1);
namespace App\Tests\Service; namespace App\Tests\Service;
use App\Service\ErrorCodeService; use App\Service\ErrorCodeGenerator;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\RequestStack;
class ErrorCodeServiceTest extends TestCase class ErrorCodeGeneratorTest extends TestCase
{ {
private RequestStack $requestStack; private RequestStack $requestStack;
private ErrorCodeService $service; private ErrorCodeGenerator $service;
protected function setUp(): void protected function setUp(): void
{ {
$this->requestStack = new RequestStack(); $this->requestStack = new RequestStack();
$this->service = new ErrorCodeService($this->requestStack); $this->service = new ErrorCodeGenerator($this->requestStack);
} }
public function testReturnsNullWithoutRequest(): void public function testReturnsNullWithoutRequest(): void
@@ -67,7 +67,7 @@ class ErrorCodeServiceTest extends TestCase
$request1->attributes->set('request_id', 'abc123'); $request1->attributes->set('request_id', 'abc123');
$this->requestStack->push($request1); $this->requestStack->push($request1);
$service1 = new ErrorCodeService($this->requestStack); $service1 = new ErrorCodeGenerator($this->requestStack);
$result1 = $service1->getErrorCode(); $result1 = $service1->getErrorCode();
$this->requestStack->pop(); $this->requestStack->pop();
@@ -76,7 +76,7 @@ class ErrorCodeServiceTest extends TestCase
$request2->attributes->set('request_id', 'xyz789'); $request2->attributes->set('request_id', 'xyz789');
$this->requestStack->push($request2); $this->requestStack->push($request2);
$service2 = new ErrorCodeService($this->requestStack); $service2 = new ErrorCodeGenerator($this->requestStack);
$result2 = $service2->getErrorCode(); $result2 = $service2->getErrorCode();
$this->assertNotSame($result1, $result2); $this->assertNotSame($result1, $result2);
@@ -88,7 +88,7 @@ class ErrorCodeServiceTest extends TestCase
$request1->attributes->set('request_id', 'abc123_1'); $request1->attributes->set('request_id', 'abc123_1');
$this->requestStack->push($request1); $this->requestStack->push($request1);
$service1 = new ErrorCodeService($this->requestStack); $service1 = new ErrorCodeGenerator($this->requestStack);
$result1 = $service1->getErrorCode(); $result1 = $service1->getErrorCode();
$this->requestStack->pop(); $this->requestStack->pop();
@@ -97,7 +97,7 @@ class ErrorCodeServiceTest extends TestCase
$request2->attributes->set('request_id', 'abc123_2'); $request2->attributes->set('request_id', 'abc123_2');
$this->requestStack->push($request2); $this->requestStack->push($request2);
$service2 = new ErrorCodeService($this->requestStack); $service2 = new ErrorCodeGenerator($this->requestStack);
$result2 = $service2->getErrorCode(); $result2 = $service2->getErrorCode();
$this->assertSame($result1, $result2); $this->assertSame($result1, $result2);
@@ -109,7 +109,7 @@ class ErrorCodeServiceTest extends TestCase
$request1->attributes->set('request_id', 'abc123'); $request1->attributes->set('request_id', 'abc123');
$this->requestStack->push($request1); $this->requestStack->push($request1);
$service1 = new ErrorCodeService($this->requestStack); $service1 = new ErrorCodeGenerator($this->requestStack);
$result1 = $service1->getErrorCode(); $result1 = $service1->getErrorCode();
$this->requestStack->pop(); $this->requestStack->pop();
@@ -118,7 +118,7 @@ class ErrorCodeServiceTest extends TestCase
$request2->attributes->set('request_id', 'abc123_5'); $request2->attributes->set('request_id', 'abc123_5');
$this->requestStack->push($request2); $this->requestStack->push($request2);
$service2 = new ErrorCodeService($this->requestStack); $service2 = new ErrorCodeGenerator($this->requestStack);
$result2 = $service2->getErrorCode(); $result2 = $service2->getErrorCode();
$this->assertSame($result1, $result2); $this->assertSame($result1, $result2);
@@ -8,18 +8,18 @@ use App\BusProNet\Model\Insurance;
use App\BusProNet\Model\Travel; use App\BusProNet\Model\Travel;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Service\InsuranceService; use App\Service\InsuranceManager;
use Carbon\Carbon; use Carbon\Carbon;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class InsuranceServiceTest extends TestCase class InsuranceManagerTest extends TestCase
{ {
private InsuranceService $service; private InsuranceManager $service;
protected function setUp(): void protected function setUp(): void
{ {
// InsuranceService is stateless and has no dependencies // InsuranceManager is stateless and has no dependencies
$this->service = new InsuranceService(); $this->service = new InsuranceManager();
// Set a fixed test date for consistent test results // Set a fixed test date for consistent test results
Carbon::setTestNow('2024-06-01 12:00:00'); Carbon::setTestNow('2024-06-01 12:00:00');
@@ -8,22 +8,22 @@ use App\BusProNet\Model\Room;
use App\BusProNet\Model\Travel; use App\BusProNet\Model\Travel;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Service\BookingPriceCalculatorService; use App\Service\BookingPriceCalculator;
use App\Service\ParticipantCardDataService; use App\Service\ParticipantCardAssembler;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Component\Validator\Validator\ValidatorInterface;
class ParticipantCardDataServiceTest extends TestCase class ParticipantCardAssemblerTest extends TestCase
{ {
private ParticipantCardDataService $service; private ParticipantCardAssembler $service;
private BookingPriceCalculatorService $priceCalculator; private BookingPriceCalculator $priceCalculator;
private ValidatorInterface $validator; private ValidatorInterface $validator;
protected function setUp(): void protected function setUp(): void
{ {
$this->priceCalculator = $this->createMock(BookingPriceCalculatorService::class); $this->priceCalculator = $this->createMock(BookingPriceCalculator::class);
$this->validator = $this->createMock(ValidatorInterface::class); $this->validator = $this->createMock(ValidatorInterface::class);
$this->service = new ParticipantCardDataService( $this->service = new ParticipantCardAssembler(
$this->priceCalculator, $this->priceCalculator,
$this->validator $this->validator
); );
@@ -13,17 +13,17 @@ use App\Entity\User;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Security\Crypt; use App\Security\Crypt;
use App\Service\ParticipantPrepopulationService; use App\Service\ParticipantDataPrefiller;
use Carbon\CarbonImmutable; use Carbon\CarbonImmutable;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
class ParticipantPrepopulationServiceTest extends TestCase class ParticipantDataPrefillerTest extends TestCase
{ {
private ApiClient $apiClient; private ApiClient $apiClient;
private Crypt $crypt; private Crypt $crypt;
private LoggerInterface $logger; private LoggerInterface $logger;
private ParticipantPrepopulationService $service; private ParticipantDataPrefiller $service;
protected function setUp(): void protected function setUp(): void
{ {
@@ -31,7 +31,7 @@ class ParticipantPrepopulationServiceTest extends TestCase
$this->crypt = $this->createMock(Crypt::class); $this->crypt = $this->createMock(Crypt::class);
$this->logger = $this->createMock(LoggerInterface::class); $this->logger = $this->createMock(LoggerInterface::class);
$this->service = new ParticipantPrepopulationService( $this->service = new ParticipantDataPrefiller(
$this->apiClient, $this->apiClient,
$this->crypt, $this->crypt,
$this->logger $this->logger
@@ -56,7 +56,7 @@ class ParticipantPrepopulationServiceTest extends TestCase
->with('[email protected]', 'decrypted_password') ->with('[email protected]', 'decrypted_password')
->willReturn($personalData); ->willReturn($personalData);
$result = $this->service->prepopulateApplicantFromUser($user, $applicant); $result = $this->service->prefillApplicantFromUser($user, $applicant);
// BPN API IDs for linking to existing records // BPN API IDs for linking to existing records
$this->assertSame(12345, $result->addressId); $this->assertSame(12345, $result->addressId);
@@ -102,7 +102,7 @@ class ParticipantPrepopulationServiceTest extends TestCase
->method('getPersonalData') ->method('getPersonalData')
->willReturn($personalData); ->willReturn($personalData);
$result = $this->service->prepopulateApplicantFromUser($user, $applicant); $result = $this->service->prefillApplicantFromUser($user, $applicant);
// Required fields should be populated // Required fields should be populated
$this->assertSame('Jane', $result->firstName); $this->assertSame('Jane', $result->firstName);
@@ -148,7 +148,7 @@ class ParticipantPrepopulationServiceTest extends TestCase
$this->logger->expects($this->never()) $this->logger->expects($this->never())
->method('info'); ->method('info');
$result = $this->service->prepopulateApplicantFromUser($user, $applicant); $result = $this->service->prefillApplicantFromUser($user, $applicant);
// Should return unchanged applicant // Should return unchanged applicant
$this->assertNull($result->firstName); $this->assertNull($result->firstName);
@@ -176,7 +176,7 @@ class ParticipantPrepopulationServiceTest extends TestCase
'email' => '[email protected]', 'email' => '[email protected]',
]); ]);
$result = $this->service->prepopulateApplicantFromUser($user, $applicant); $result = $this->service->prefillApplicantFromUser($user, $applicant);
// Should return unchanged applicant // Should return unchanged applicant
$this->assertNull($result->firstName); $this->assertNull($result->firstName);
@@ -205,7 +205,7 @@ class ParticipantPrepopulationServiceTest extends TestCase
'email' => '[email protected]', 'email' => '[email protected]',
]); ]);
$result = $this->service->prepopulateApplicantFromUser($user, $applicant); $result = $this->service->prefillApplicantFromUser($user, $applicant);
// Should return unchanged applicant // Should return unchanged applicant
$this->assertNull($result->firstName); $this->assertNull($result->firstName);
@@ -231,7 +231,7 @@ class ParticipantPrepopulationServiceTest extends TestCase
->method('getPersonalData') ->method('getPersonalData')
->willReturn($personalData); ->willReturn($personalData);
$result = $this->service->prepopulateApplicantFromUser($user, $applicant); $result = $this->service->prefillApplicantFromUser($user, $applicant);
// Personal data should be updated // Personal data should be updated
$this->assertSame('John', $result->firstName); $this->assertSame('John', $result->firstName);
@@ -250,14 +250,14 @@ class ParticipantPrepopulationServiceTest extends TestCase
$filled = new ParticipantDto(); $filled = new ParticipantDto();
$filled->firstName = 'Already set'; $filled->firstName = 'Already set';
$this->assertTrue($this->service->shouldPrepopulateApplicant($fresh)); $this->assertTrue($this->service->shouldPrefillApplicant($fresh));
$this->assertFalse($this->service->shouldPrepopulateApplicant($filled)); $this->assertFalse($this->service->shouldPrefillApplicant($filled));
} }
public function testDummyTokenMatchesOnlyInCreateMode(): void public function testDummyTokenMatchesOnlyInCreateMode(): void
{ {
$participant = new ParticipantDto(); $participant = new ParticipantDto();
$participant->lastName = ParticipantPrepopulationService::TOKEN; $participant->lastName = ParticipantDataPrefiller::TOKEN;
$this->assertTrue($this->service->isDummyDataFillRequested($participant, BookingDto::MODE_CREATE)); $this->assertTrue($this->service->isDummyDataFillRequested($participant, BookingDto::MODE_CREATE));
$this->assertFalse($this->service->isDummyDataFillRequested($participant, BookingDto::MODE_EDIT)); $this->assertFalse($this->service->isDummyDataFillRequested($participant, BookingDto::MODE_EDIT));
@@ -9,16 +9,16 @@ use App\BusProNet\Model\Service;
use App\BusProNet\Model\Travel; use App\BusProNet\Model\Travel;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Service\ParticipantEligibilityService; use App\Service\ParticipantEligibilityChecker;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class ParticipantEligibilityServiceTest extends TestCase class ParticipantEligibilityCheckerTest extends TestCase
{ {
private ParticipantEligibilityService $service; private ParticipantEligibilityChecker $service;
protected function setUp(): void protected function setUp(): void
{ {
$this->service = new ParticipantEligibilityService(); $this->service = new ParticipantEligibilityChecker();
} }
public function testBabyParticipantIsAlwaysEligible(): void public function testBabyParticipantIsAlwaysEligible(): void
@@ -9,11 +9,11 @@ use App\BusProNet\Model\Travel;
use App\Exception\ParticipantNotFoundException; use App\Exception\ParticipantNotFoundException;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Service\ParticipantFormSupportService; use App\Service\ParticipantFormSupport;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class ParticipantFormSupportServiceTest extends TestCase class ParticipantFormSupportTest extends TestCase
{ {
public function testEnsureParticipantExistsThrowsForMissingIndex(): void public function testEnsureParticipantExistsThrowsForMissingIndex(): void
{ {
@@ -84,11 +84,11 @@ class ParticipantFormSupportServiceTest extends TestCase
$this->assertFalse($options['validation_groups']); $this->assertFalse($options['validation_groups']);
} }
private function createService(?ParameterBagInterface $parameterBag = null): ParticipantFormSupportService private function createService(?ParameterBagInterface $parameterBag = null): ParticipantFormSupport
{ {
$parameterBag ??= $this->createMock(ParameterBagInterface::class); $parameterBag ??= $this->createMock(ParameterBagInterface::class);
return new ParticipantFormSupportService($parameterBag); return new ParticipantFormSupport($parameterBag);
} }
private function createBookingDto(): BookingDto private function createBookingDto(): BookingDto
@@ -10,19 +10,19 @@ use App\BusProNet\Model\Travel;
use App\Form\Model\BookingDto; use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Form\Model\RoomSelectionDto; use App\Form\Model\RoomSelectionDto;
use App\Service\RoomAssignmentService; use App\Service\RoomAssigner;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
/** /**
* Tests for RoomAssignmentService. * Tests for RoomAssigner.
*/ */
class RoomAssignmentServiceTest extends TestCase class RoomAssignerTest extends TestCase
{ {
private RoomAssignmentService $service; private RoomAssigner $service;
protected function setUp(): void protected function setUp(): void
{ {
$this->service = new RoomAssignmentService(); $this->service = new RoomAssigner();
} }
/** /**
@@ -8,24 +8,24 @@ use App\BusProNet\ApiClient;
use App\BusProNet\Model\Travel; use App\BusProNet\Model\Travel;
use App\BusProNet\XmlLoader\TravelLoader; use App\BusProNet\XmlLoader\TravelLoader;
use App\Exception\TravelNotFoundException; use App\Exception\TravelNotFoundException;
use App\Service\TravelDataService; use App\Service\TravelDataProvider;
use App\Service\TravelEnrichmentService; use App\Service\TravelEnricher;
use App\Service\TravelLookupService; use App\Service\TravelIndex;
use App\Service\TravelSnapshotService; use App\Service\TravelSnapshotManager;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Contracts\Cache\CacheInterface; use Symfony\Contracts\Cache\CacheInterface;
class TravelDataServiceTest extends TestCase class TravelDataProviderTest extends TestCase
{ {
private TravelDataService $service; private TravelDataProvider $service;
private TravelLoader $travelLoader; private TravelLoader $travelLoader;
private ApiClient $apiClient; private ApiClient $apiClient;
private CacheInterface $cache; private CacheInterface $cache;
private LoggerInterface $logger; private LoggerInterface $logger;
private TravelSnapshotService $travelSnapshotService; private TravelSnapshotManager $travelSnapshotService;
private TravelLookupService $travelLookupService; private TravelIndex $travelLookupService;
private TravelEnrichmentService $travelEnrichmentService; private TravelEnricher $travelEnrichmentService;
protected function setUp(): void protected function setUp(): void
{ {
@@ -33,11 +33,11 @@ class TravelDataServiceTest extends TestCase
$this->apiClient = $this->createMock(ApiClient::class); $this->apiClient = $this->createMock(ApiClient::class);
$this->cache = $this->createMock(CacheInterface::class); $this->cache = $this->createMock(CacheInterface::class);
$this->logger = $this->createMock(LoggerInterface::class); $this->logger = $this->createMock(LoggerInterface::class);
$this->travelSnapshotService = $this->createMock(TravelSnapshotService::class); $this->travelSnapshotService = $this->createMock(TravelSnapshotManager::class);
$this->travelLookupService = $this->createMock(TravelLookupService::class); $this->travelLookupService = $this->createMock(TravelIndex::class);
$this->travelEnrichmentService = $this->createMock(TravelEnrichmentService::class); $this->travelEnrichmentService = $this->createMock(TravelEnricher::class);
$this->service = new TravelDataService( $this->service = new TravelDataProvider(
$this->travelLoader, $this->travelLoader,
$this->apiClient, $this->apiClient,
$this->cache, $this->cache,
@@ -9,13 +9,13 @@ use App\BusProNet\Model\Travel;
use App\BusProNet\XmlLoader\HotelLoader; use App\BusProNet\XmlLoader\HotelLoader;
use App\BusProNet\XmlLoader\InsuranceLoader; use App\BusProNet\XmlLoader\InsuranceLoader;
use App\BusProNet\XmlLoader\PickupLoader; use App\BusProNet\XmlLoader\PickupLoader;
use App\Service\TravelEnrichmentService; use App\Service\TravelEnricher;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
class TravelEnrichmentServiceTest extends TestCase class TravelEnricherTest extends TestCase
{ {
private TravelEnrichmentService $service; private TravelEnricher $service;
private PickupLoader $pickupLoader; private PickupLoader $pickupLoader;
private HotelLoader $hotelLoader; private HotelLoader $hotelLoader;
private InsuranceLoader $insuranceLoader; private InsuranceLoader $insuranceLoader;
@@ -28,7 +28,7 @@ class TravelEnrichmentServiceTest extends TestCase
$this->insuranceLoader = $this->createMock(InsuranceLoader::class); $this->insuranceLoader = $this->createMock(InsuranceLoader::class);
$this->logger = $this->createMock(LoggerInterface::class); $this->logger = $this->createMock(LoggerInterface::class);
$this->service = new TravelEnrichmentService( $this->service = new TravelEnricher(
$this->pickupLoader, $this->pickupLoader,
$this->hotelLoader, $this->hotelLoader,
$this->insuranceLoader, $this->insuranceLoader,
@@ -6,27 +6,27 @@ namespace App\Tests\Service;
use App\BusProNet\XmlLoader\HotelLoader; use App\BusProNet\XmlLoader\HotelLoader;
use App\BusProNet\XmlLoader\TravelLoader; use App\BusProNet\XmlLoader\TravelLoader;
use App\Service\TravelLookupService; use App\Service\TravelIndex;
use App\Service\TravelSnapshotService; use App\Service\TravelSnapshotManager;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
class TravelLookupServiceTest extends TestCase class TravelIndexTest extends TestCase
{ {
private TravelLookupService $service; private TravelIndex $service;
private TravelLoader $travelLoader; private TravelLoader $travelLoader;
private HotelLoader $hotelLoader; private HotelLoader $hotelLoader;
private TravelSnapshotService $travelSnapshotService; private TravelSnapshotManager $travelSnapshotService;
private LoggerInterface $logger; private LoggerInterface $logger;
protected function setUp(): void protected function setUp(): void
{ {
$this->travelLoader = $this->createMock(TravelLoader::class); $this->travelLoader = $this->createMock(TravelLoader::class);
$this->hotelLoader = $this->createMock(HotelLoader::class); $this->hotelLoader = $this->createMock(HotelLoader::class);
$this->travelSnapshotService = $this->createMock(TravelSnapshotService::class); $this->travelSnapshotService = $this->createMock(TravelSnapshotManager::class);
$this->logger = $this->createMock(LoggerInterface::class); $this->logger = $this->createMock(LoggerInterface::class);
$this->service = new TravelLookupService( $this->service = new TravelIndex(
$this->travelLoader, $this->travelLoader,
$this->hotelLoader, $this->hotelLoader,
$this->travelSnapshotService, $this->travelSnapshotService,
@@ -11,20 +11,20 @@ use App\BusProNet\Model\Hotel;
use App\BusProNet\Model\Travel; use App\BusProNet\Model\Travel;
use App\Entity\TravelSnapshot; use App\Entity\TravelSnapshot;
use App\Repository\TravelSnapshotRepository; use App\Repository\TravelSnapshotRepository;
use App\Service\TravelSnapshotService; use App\Service\TravelSnapshotManager;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Component\Serializer\SerializerInterface; use Symfony\Component\Serializer\SerializerInterface;
class TravelSnapshotServiceTest extends TestCase class TravelSnapshotManagerTest extends TestCase
{ {
private TravelSnapshotRepository $snapshotRepository; private TravelSnapshotRepository $snapshotRepository;
private EntityManagerInterface $entityManager; private EntityManagerInterface $entityManager;
private ApiClient $apiClient; private ApiClient $apiClient;
private LoggerInterface $logger; private LoggerInterface $logger;
private SerializerInterface $serializer; private SerializerInterface $serializer;
private TravelSnapshotService $service; private TravelSnapshotManager $service;
protected function setUp(): void protected function setUp(): void
{ {
@@ -34,7 +34,7 @@ class TravelSnapshotServiceTest extends TestCase
$this->logger = $this->createMock(LoggerInterface::class); $this->logger = $this->createMock(LoggerInterface::class);
$this->serializer = $this->createMock(SerializerInterface::class); $this->serializer = $this->createMock(SerializerInterface::class);
$this->service = new TravelSnapshotService( $this->service = new TravelSnapshotManager(
$this->snapshotRepository, $this->snapshotRepository,
$this->entityManager, $this->entityManager,
$this->apiClient, $this->apiClient,
@@ -11,19 +11,19 @@ use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use App\Form\Model\ParticipantEditDto; use App\Form\Model\ParticipantEditDto;
use App\Form\Service\ServiceAgeEvaluator; use App\Form\Service\ServiceAgeEvaluator;
use App\Service\ParticipantEligibilityService; use App\Service\ParticipantEligibilityChecker;
use App\Validator\Constraints\MandatoryAdditionalServicesSelected; use App\Validator\Constraints\MandatoryAdditionalServicesSelected;
use App\Validator\Constraints\MandatoryAdditionalServicesSelectedValidator; use App\Validator\Constraints\MandatoryAdditionalServicesSelectedValidator;
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase; use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
class MandatoryAdditionalServicesSelectedValidatorTest extends ConstraintValidatorTestCase class MandatoryAdditionalServicesSelectedValidatorTest extends ConstraintValidatorTestCase
{ {
private ParticipantEligibilityService $participantEligibilityService; private ParticipantEligibilityChecker $participantEligibilityService;
private bool $participantEligible = true; private bool $participantEligible = true;
protected function createValidator(): MandatoryAdditionalServicesSelectedValidator protected function createValidator(): MandatoryAdditionalServicesSelectedValidator
{ {
$this->participantEligibilityService = $this->createMock(ParticipantEligibilityService::class); $this->participantEligibilityService = $this->createMock(ParticipantEligibilityChecker::class);
$this->participantEligibilityService $this->participantEligibilityService
->method('isParticipantEligible') ->method('isParticipantEligible')
->willReturnCallback(fn (): bool => $this->participantEligible); ->willReturnCallback(fn (): bool => $this->participantEligible);