twig = self::getContainer()->get('twig'); $this->bodyRenderer = self::getContainer()->get(BodyRendererInterface::class); $this->em = self::getContainer()->get('doctrine.orm.entity_manager'); } public function testOnCompletedSendNotificationToUserGroupWithEmailAddress(): void { $entityWorkflow = new EntityWorkflow(); $this->em->persist($entityWorkflow); $entityWorkflow->setWorkflowName('dummy'); $dto = new WorkflowTransitionContextDTO($entityWorkflow); $dto->futureDestUsers = [$ug = new UserGroup()]; $ug->setEmail('test@email.com')->setLabel(['fr' => 'test group']); $mailer = $this->prophesize(MailerInterface::class); $sendMethod = $mailer->send(Argument::that(function (RawMessage $message): bool { if (!$message instanceof TemplatedEmail) { return false; } $this->bodyRenderer->render($message); return 'test@email.com' === $message->getTo()[0]->getAddress(); })); $sendMethod->shouldBeCalledOnce(); $metadataExtractor = $this->prophesize(MetadataExtractor::class); $metadataExtractor->buildArrayPresentationForWorkflow(Argument::type(Workflow::class))->willReturn(['name' => 'dummy', 'text' => 'Dummy Workflow']); $metadataExtractor->buildArrayPresentationForPlace($entityWorkflow)->willReturn(['name' => 'to_one', 'text' => 'Dummy Place']); $registry = $this->buildRegistryWithEventSubscriber($mailer->reveal(), $metadataExtractor->reveal()); $workflow = $registry->get($entityWorkflow, 'dummy'); $workflow->apply($entityWorkflow, 'to_one', ['context' => $dto, 'transition' => 'to_one', 'transitionAt' => new \DateTimeImmutable(), 'byUser' => new User()]); } public function testOnCompletedSendNotificationToUserGroupWithoutAnyEmailAddress(): void { $entityWorkflow = new EntityWorkflow(); $reflection = new \ReflectionClass($entityWorkflow); $idProperty = $reflection->getProperty('id'); $idProperty->setValue($entityWorkflow, 1); $entityWorkflow->setWorkflowName('dummy'); $dto = new WorkflowTransitionContextDTO($entityWorkflow); $dto->futureDestUsers = [$ug = new UserGroup()]; $mailer = $this->prophesize(MailerInterface::class); $mailer->send(Argument::any())->shouldNotBeCalled(); $metadataExtractor = $this->prophesize(MetadataExtractor::class); $metadataExtractor->buildArrayPresentationForWorkflow(Argument::type(Workflow::class))->willReturn(['name' => 'dummy', 'text' => 'Dummy Workflow']); $metadataExtractor->buildArrayPresentationForPlace($entityWorkflow)->willReturn(['name' => 'to_one', 'text' => 'Dummy Place']); $registry = $this->buildRegistryWithEventSubscriber($mailer->reveal(), $metadataExtractor->reveal()); $workflow = $registry->get($entityWorkflow, 'dummy'); $workflow->apply($entityWorkflow, 'to_one', ['context' => $dto, 'transition' => 'to_one', 'transitionAt' => new \DateTimeImmutable(), 'byUser' => new User()]); } private function buildRegistryWithEventSubscriber(MailerInterface $mailer, MetadataExtractor $metadataExtractor): Registry { $builder = new DefinitionBuilder(); $builder ->setInitialPlaces('initial') ->addPlaces(['initial', 'to_one']) ->addTransition(new Transition('to_one', 'initial', 'to_one')); $metadata = new InMemoryMetadataStore( ['label' => ['fr' => 'dummy workflow']], ); $builder->setMetadataStore($metadata); $workflow = new Workflow($builder->build(), new EntityWorkflowMarkingStore(), $eventDispatcher = new EventDispatcher(), 'dummy'); $registry = new Registry(); $registry->addWorkflow($workflow, new class () implements WorkflowSupportStrategyInterface { public function supports(WorkflowInterface $workflow, object $subject): bool { return true; } }); $notificationEventSubscriber = new NotificationToUserGroupsOnTransition($this->twig, $metadataExtractor, $registry, $mailer, $this->em); $eventDispatcher->addSubscriber($notificationEventSubscriber); return $registry; } }