registerVersion(); $converter = $this->prophesize(StoredObjectToPdfConverter::class); $converter->addConvertedVersion($storedObject, 'fr', 'pdf') ->shouldBeCalledOnce() ->will(function ($args) { /** @var StoredObject $storedObject */ $storedObject = $args[0]; $pointInTime = new StoredObjectPointInTime($storedObject->getCurrentVersion(), StoredObjectPointInTimeReasonEnum::KEEP_BEFORE_CONVERSION); $newVersion = $storedObject->registerVersion(filename: 'next'); return [$pointInTime, $newVersion]; }); $entityWorkflowManager = $this->prophesize(EntityWorkflowManager::class); $entityWorkflowManager->getAssociatedStoredObject($entityWorkflow)->willReturn($storedObject); $request = new Request(); $request->setLocale('fr'); $stack = new RequestStack(); $stack->push($request); $eventSubscriber = new ConvertToPdfBeforeSignatureStepEventSubscriber($entityWorkflowManager->reveal(), $converter->reveal(), $stack); $registry = $this->buildRegistry($eventSubscriber); $workflow = $registry->get($entityWorkflow, 'dummy'); $dto = new WorkflowTransitionContextDTO($entityWorkflow); $workflow->apply($entityWorkflow, 'to_signature', ['context' => $dto, 'transition' => 'to_signature', 'transitionAt' => new \DateTimeImmutable('now')]); self::assertEquals('signature', $entityWorkflow->getStep()); self::assertNotSame($previousVersion, $storedObject->getCurrentVersion()); self::assertTrue($previousVersion->hasPointInTimes()); self::assertCount(2, $storedObject->getVersions()); self::assertEquals('next', $storedObject->getCurrentVersion()->getFilename()); } public function testConvertToPdfBeforeSignatureStepEventSubscriberToNotASignatureStep(): void { $entityWorkflow = new EntityWorkflow(); $storedObject = new StoredObject(); $previousVersion = $storedObject->registerVersion(); $converter = $this->prophesize(StoredObjectToPdfConverter::class); $converter->addConvertedVersion($storedObject, 'fr', 'pdf') ->shouldNotBeCalled(); $entityWorkflowManager = $this->prophesize(EntityWorkflowManager::class); $entityWorkflowManager->getAssociatedStoredObject($entityWorkflow)->willReturn($storedObject); $request = new Request(); $request->setLocale('fr'); $stack = new RequestStack(); $stack->push($request); $eventSubscriber = new ConvertToPdfBeforeSignatureStepEventSubscriber($entityWorkflowManager->reveal(), $converter->reveal(), $stack); $registry = $this->buildRegistry($eventSubscriber); $workflow = $registry->get($entityWorkflow, 'dummy'); $dto = new WorkflowTransitionContextDTO($entityWorkflow); $workflow->apply($entityWorkflow, 'to_something', ['context' => $dto, 'transition' => 'to_something', 'transitionAt' => new \DateTimeImmutable('now')]); self::assertEquals('something', $entityWorkflow->getStep()); self::assertSame($previousVersion, $storedObject->getCurrentVersion()); self::assertFalse($previousVersion->hasPointInTimes()); self::assertCount(1, $storedObject->getVersions()); } public function testConvertToPdfBeforeSignatureStepEventSubscriberToSignatureAlreadyAPdf(): void { $entityWorkflow = new EntityWorkflow(); $storedObject = new StoredObject(); $previousVersion = $storedObject->registerVersion(type: 'application/pdf'); $converter = $this->prophesize(StoredObjectToPdfConverter::class); $converter->addConvertedVersion($storedObject, 'fr', 'pdf') ->shouldNotBeCalled(); $entityWorkflowManager = $this->prophesize(EntityWorkflowManager::class); $entityWorkflowManager->getAssociatedStoredObject($entityWorkflow)->willReturn($storedObject); $request = new Request(); $request->setLocale('fr'); $stack = new RequestStack(); $stack->push($request); $eventSubscriber = new ConvertToPdfBeforeSignatureStepEventSubscriber($entityWorkflowManager->reveal(), $converter->reveal(), $stack); $registry = $this->buildRegistry($eventSubscriber); $workflow = $registry->get($entityWorkflow, 'dummy'); $dto = new WorkflowTransitionContextDTO($entityWorkflow); $workflow->apply($entityWorkflow, 'to_signature', ['context' => $dto, 'transition' => 'to_signature', 'transitionAt' => new \DateTimeImmutable('now')]); self::assertEquals('signature', $entityWorkflow->getStep()); self::assertSame($previousVersion, $storedObject->getCurrentVersion()); self::assertFalse($previousVersion->hasPointInTimes()); self::assertCount(1, $storedObject->getVersions()); } public function testConvertToPdfBeforeSignatureStepEventSubscriberToSignatureWithNoStoredObject(): void { $entityWorkflow = new EntityWorkflow(); $converter = $this->prophesize(StoredObjectToPdfConverter::class); $converter->addConvertedVersion(Argument::type(StoredObject::class), 'fr', 'pdf') ->shouldNotBeCalled(); $entityWorkflowManager = $this->prophesize(EntityWorkflowManager::class); $entityWorkflowManager->getAssociatedStoredObject($entityWorkflow)->willReturn(null); $request = new Request(); $request->setLocale('fr'); $stack = new RequestStack(); $stack->push($request); $eventSubscriber = new ConvertToPdfBeforeSignatureStepEventSubscriber($entityWorkflowManager->reveal(), $converter->reveal(), $stack); $registry = $this->buildRegistry($eventSubscriber); $workflow = $registry->get($entityWorkflow, 'dummy'); $dto = new WorkflowTransitionContextDTO($entityWorkflow); $workflow->apply($entityWorkflow, 'to_signature', ['context' => $dto, 'transition' => 'to_signature', 'transitionAt' => new \DateTimeImmutable('now')]); self::assertEquals('signature', $entityWorkflow->getStep()); } private function buildRegistry(EventSubscriberInterface $eventSubscriber): Registry { $builder = new DefinitionBuilder(); $builder ->setInitialPlaces('initial') ->addPlaces(['initial', 'signature', 'something']) ->addTransition(new Transition('to_something', 'initial', 'something')) ->addTransition(new Transition('to_signature', 'initial', 'signature')); $metadataStore = new InMemoryMetadataStore([], ['signature' => ['isSignature' => ['user']]]); $builder->setMetadataStore($metadataStore); $eventDispatcher = new EventDispatcher(); $eventDispatcher->addSubscriber($eventSubscriber); $workflow = new Workflow($builder->build(), new EntityWorkflowMarkingStore(), $eventDispatcher, 'dummy'); $supports = new class () implements WorkflowSupportStrategyInterface { public function supports(WorkflowInterface $workflow, object $subject): bool { return true; } }; $registry = new Registry(); $registry->addWorkflow($workflow, $supports); return $registry; } }