createLoader(static function (BookingDto $dto): void { // Draft reproduces the API state: nothing changes. }); $loader->initializeFromApi(new Request(), 42, $this->createUser()); $this->assertFalse($loader->isDraftRestored()); } public function testDraftThatChangesDataIsReportedAsRestored(): void { $loader = $this->createLoader(static function (BookingDto $dto): void { $dto->participants[0]->firstName = 'Berta'; }); $loader->initializeFromApi(new Request(), 42, $this->createUser()); $this->assertTrue($loader->isDraftRestored()); } private function createUser(): User { $user = new User('tester@example.com'); $user->setPassword('encrypted'); return $user; } /** * @param callable(BookingDto): void $applyDraft what the stored draft does to the DTO */ private function createLoader(callable $applyDraft): BookingEditDataLoader { $booking = new Booking(); $booking->id = 42; $booking->dateId = 1234; $booking->hotelId = 7; $travel = new Travel(); $travel->id = 1234; $bookingDto = new BookingDto($travel, 77); $bookingDto->booking = $booking; $participant = new ParticipantDto(); $participant->index = 0; $participant->firstName = 'Anna'; $bookingDto->participants = [$participant]; $cache = $this->createStub(TagAwareCacheInterface::class); $cache->method('get')->willReturn($booking); $travelDataService = $this->createStub(TravelDataProvider::class); $travelDataService->method('getTravelData')->willReturn($travel); $travelDataService->method('getMutabilityData')->willReturn($this->createStub(BaseData::class)); $travelDataService->method('getAvailabilityData') ->willReturn($this->createStub(ServiceAvailabilityResponse::class)); $bookingDataProcessor = $this->createStub(BookingDataProcessor::class); $bookingDataProcessor->method('createBookingDtoFromBooking')->willReturn($bookingDto); $draftService = $this->createStub(BookingEditDraftManager::class); $draftService->method('findDraft')->willReturn($this->createStub(BookingEditDraft::class)); $draftService->method('applyDraftToDto')->willReturnCallback( static function (BookingEditDraft $draft, BookingDto $dto, Travel $travel) use ($applyDraft): bool { $applyDraft($dto); return true; } ); $crypt = $this->createStub(Crypt::class); $crypt->method('decrypt')->willReturn('secret'); return new BookingEditDataLoader( $this->createStub(ApiClient::class), $bookingDataProcessor, $this->createStub(BookingSessionManager::class), new BookingChangeTracker(), $travelDataService, $draftService, $this->createStub(AgencyLoader::class), $crypt, $cache, ); } }