Laravel.io
<?php

namespace Cbm\Tests\Helper;

use Cbm\Application\EducationService\Entity\ServiceTypeKeyEnum;
use Cbm\Application\Messenger\Message\Entity\MessengerMessage;
use Cbm\Application\Messenger\Message\MessengerMessageRepositoryInterface;
use Cbm\Application\Modifier\Entity\ModifierNameEnum;
use Cbm\Application\Orchestration\Entity\FlowId;
use Cbm\Application\Orchestration\Entity\SalesToolId;
use Cbm\Application\Orchestration\Modifier\Specification\MessengerFlow\DemoLessonMessengerFlowModifierSpecification;
use Cbm\Controller\Amqp\MessengerMessage\MessageInAddedConsumer;
use Cbm\Controller\Amqp\MessengerMessage\StatusCreatedConsumer;
use Cbm\Tests\Mock\CommunicationsMocks;
use PhpAmqpLib\Message\AMQPMessage;
use Ramsey\Uuid\Uuid;
use Ramsey\Uuid\UuidInterface;

class MessengerFlowHelper extends BaseModule
{
   public function haveActiveMessengerFlow(?SalesToolId $salesToolId = null): void
   {
       if ($salesToolId === null) {
           $salesToolId = SalesToolId::MESSENGER_ADULT_ENGLISH_PAY_BEFORE();
       }
       $esId = mt_rand();

       $flowHelper = $this->getFlowHelper();
       $flowHelper->initContext(
           ServiceTypeKeyEnum::ENGLISH_ADULT_NOT_NATIVE_SPEAKER,
           FlowId::DEMO_LESSON_ADULT_ENGLISH_MESSENGER(),
           $salesToolId,
           $esId,
       );
       $flowHelper->createModifier(ModifierNameEnum::MESSENGER_FLOW(), [
           DemoLessonMessengerFlowModifierSpecification::GROUP_B,
       ]);
       $this->getClickhouseEventAnalyticsMocks()->wantMockClickhouseEventAnalyticsSendEvents();
       $this->getCrm2Mocks()->wantMockCrm2AppendSpecialComment($flowHelper->getContext()->getEducationServiceId());
   }

   public function sendMessageToUser(): UuidInterface
   {
       $uuid = Uuid::uuid4();
       $flowHelper = $this->getFlowHelper();
       $context = $flowHelper->getContext();
       $messengerMessage = MessengerMessage::create($uuid, $context->getEducationServiceId(), $context->getUserId());
       $functionalModule = $this->getFunctionalModule();
       $messengerMessageRepository = $functionalModule->getSymfonyServiceByClassName(
           MessengerMessageRepositoryInterface::class,
       );
       $messengerMessageRepository->save($messengerMessage);
       return $uuid;
   }

   public function setLastMessageAnswered(int $userId): void
   {
       $messageId = mt_rand();
       $uuid = Uuid::uuid4();
       $message = new AMQPMessage(
           json_try_encode([
               'thread_id' => mt_rand(),
               'message_id' => $messageId,
               'uuid' => $uuid->toString(),
           ]),
       );
       /** @var CommunicationsMocks $communicationsMocks */
       $communicationsMocks = $this->getModule('\\' . CommunicationsMocks::class);
       $communicationsMocks->wantMockCommunicationsWAFromUserMessage($messageId, $userId);
       $functionalModule = $this->getFunctionalModule();
       /** @var MessageInAddedConsumer $consumer */
       $consumer = $functionalModule->getSymfonyServiceByClassName(MessageInAddedConsumer::class);
       $consumer->execute($message);
   }

   public function setMessageRead(string $uuid): void
   {
       $message = new AMQPMessage(
           json_try_encode([
               'name' => 'read',
               'message_id' => mt_rand(),
               'message_uuid' => $uuid,
           ]),
       );
       $functionalModule = $this->getFunctionalModule();
       /** @var StatusCreatedConsumer $consumer */
       $consumer = $functionalModule->getSymfonyServiceByClassName(StatusCreatedConsumer::class);
       $consumer->execute($message);
   }
}

Please note that all pasted data is publicly available.