From 6f8dee102febfc8afa913cdc0fdef9c68f3717ad Mon Sep 17 00:00:00 2001 From: "tien.xuan.vo" Date: Thu, 31 Oct 2019 11:34:17 +0700 Subject: [PATCH] Handle messages directly --- .github/workflows/main.yml | 2 +- README.md | 2 +- composer.json | 3 +- src/Command/ApplyBugTransitionCommand.php | 65 --------- src/Command/ApplyTaskTransitionCommand.php | 65 --------- src/Command/CaptureScreenshotsCommand.php | 111 --------------- src/Command/CommandRunner.php | 52 ------- src/Command/CreateBugCommand.php | 107 --------------- src/Command/DefaultBugTitleTrait.php | 16 +++ src/Command/ExecuteTaskCommand.php | 116 ---------------- src/Command/FinishReduceBugCommand.php | 74 ---------- src/Command/FinishReduceStepsCommand.php | 76 ----------- src/Command/MessageTrait.php | 7 + src/Command/ReduceBugCommand.php | 106 --------------- src/Command/ReduceStepsCommand.php | 110 --------------- src/Command/RemoveScreenshotsCommand.php | 69 ---------- src/Command/ReportBugCommand.php | 68 ---------- src/Command/TestBugCommand.php | 128 ------------------ src/Command/TestModelCommand.php | 12 +- src/Command/TestPredefinedCaseCommand.php | 120 ---------------- src/Command/WorkflowRegisterTrait.php | 18 +++ .../Compiler/SecurityTokenPass.php | 20 +-- .../Compiler/WorkflowRegisterPass.php | 28 ++-- .../TienvxMbtExtension.php | 12 +- src/Generator/AllTransitionsGenerator.php | 3 +- .../ApplyBugTransitionMessageHandler.php | 29 +++- .../ApplyTaskTransitionMessageHandler.php | 27 +++- .../CaptureScreenshotsMessageHandler.php | 71 +++++++++- .../CreateBugMessageHandler.php | 52 ++++++- .../ExecuteTaskMessageHandler.php | 70 ++++++++-- .../FinishReduceBugMessageHandler.php | 40 +++++- .../FinishReduceStepsMessageHandler.php | 42 +++++- .../ReduceBugMessageHandler.php | 63 +++++++-- .../ReduceStepsMessageHandler.php | 52 ++++++- .../RemoveScreenshotsMessageHandler.php | 34 ++++- .../ReportBugMessageHandler.php | 32 ++++- src/MessageHandler/TestBugMessageHandler.php | 80 ++++++++++- .../TestPredefinedCaseMessageHandler.php | 74 ++++++++-- tests/TestCase.php | 4 +- tests/app/config/services.yaml | 2 - tests/app/src/Command/CommandRunner.php | 39 ------ 41 files changed, 651 insertions(+), 1450 deletions(-) delete mode 100644 src/Command/ApplyBugTransitionCommand.php delete mode 100644 src/Command/ApplyTaskTransitionCommand.php delete mode 100644 src/Command/CaptureScreenshotsCommand.php delete mode 100644 src/Command/CommandRunner.php delete mode 100644 src/Command/CreateBugCommand.php create mode 100644 src/Command/DefaultBugTitleTrait.php delete mode 100644 src/Command/ExecuteTaskCommand.php delete mode 100644 src/Command/FinishReduceBugCommand.php delete mode 100644 src/Command/FinishReduceStepsCommand.php delete mode 100644 src/Command/ReduceBugCommand.php delete mode 100644 src/Command/ReduceStepsCommand.php delete mode 100644 src/Command/RemoveScreenshotsCommand.php delete mode 100644 src/Command/ReportBugCommand.php delete mode 100644 src/Command/TestBugCommand.php delete mode 100644 src/Command/TestPredefinedCaseCommand.php create mode 100644 src/Command/WorkflowRegisterTrait.php delete mode 100644 tests/app/src/Command/CommandRunner.php diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bf944227..31804365 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,7 +32,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - php: ['7.2', '7.3', '7.4.0RC3'] + php: ['7.2', '7.3', '7.4.0RC4'] container: image: php:${{ matrix.php }}-cli-alpine steps: diff --git a/README.md b/README.md index 47e213b0..3adf80bc 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ $ composer create-project symfony/skeleton my-project Install lastest version of this bundle: ```console -$ composer require tienvx/mbt-bundle "^1.13" +$ composer require tienvx/mbt-bundle "^1.14" ``` ### Step 3: Config file storage diff --git a/composer.json b/composer.json index 3267d626..a963f5eb 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,6 @@ "symfony/workflow": "~4.3.1", "symfony/validator": "~4.3.1", "symfony/messenger": "~4.3.1", - "symfony/process": "~4.3.1", "symfony/property-info": "~4.3.1", "doctrine/doctrine-bundle": "~1.11.2", "doctrine/orm": "~2.6.3", @@ -56,7 +55,7 @@ }, "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.14-dev" } }, "suggest": { diff --git a/src/Command/ApplyBugTransitionCommand.php b/src/Command/ApplyBugTransitionCommand.php deleted file mode 100644 index 172e8903..00000000 --- a/src/Command/ApplyBugTransitionCommand.php +++ /dev/null @@ -1,65 +0,0 @@ -entityManager = $entityManager; - $this->bugWorkflow = $bugWorkflow; - - parent::__construct(); - } - - protected function configure() - { - $this - ->setName('mbt:bug:apply-transition') - ->setDescription('Apply transition of a bug.') - ->setHelp("This command change status of a bug by applying a transition of bug's workflow.") - ->addArgument('bug-id', InputArgument::REQUIRED, 'The bug id to update.') - ->addArgument('transition', InputArgument::REQUIRED, 'The transition to apply.') - ->setHidden(true); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Exception - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $bugId = $input->getArgument('bug-id'); - $bug = $this->entityManager->getRepository(Bug::class)->find($bugId); - - if (!$bug || !$bug instanceof Bug) { - throw new Exception(sprintf('No bug found for id %d', $bugId)); - } - - $transition = $input->getArgument('transition'); - - $this->bugWorkflow->apply($bug, $transition); - $this->entityManager->flush(); - } -} diff --git a/src/Command/ApplyTaskTransitionCommand.php b/src/Command/ApplyTaskTransitionCommand.php deleted file mode 100644 index 449effd7..00000000 --- a/src/Command/ApplyTaskTransitionCommand.php +++ /dev/null @@ -1,65 +0,0 @@ -entityManager = $entityManager; - $this->taskWorkflow = $taskWorkflow; - - parent::__construct(); - } - - protected function configure() - { - $this - ->setName('mbt:task:apply-transition') - ->setDescription('Apply transition of a task.') - ->setHelp("This command update status of a task by applying a transition of task's workflow.") - ->addArgument('task-id', InputArgument::REQUIRED, 'The task id to update.') - ->addArgument('transition', InputArgument::REQUIRED, 'The transition to apply.') - ->setHidden(true); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Exception - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $taskId = $input->getArgument('task-id'); - $task = $this->entityManager->getRepository(Task::class)->find($taskId); - - if (!$task || !$task instanceof Task) { - throw new Exception(sprintf('No task found for id %d', $taskId)); - } - - $transition = $input->getArgument('transition'); - - $this->taskWorkflow->apply($task, $transition); - $this->entityManager->flush(); - } -} diff --git a/src/Command/CaptureScreenshotsCommand.php b/src/Command/CaptureScreenshotsCommand.php deleted file mode 100644 index 0d3c8ffb..00000000 --- a/src/Command/CaptureScreenshotsCommand.php +++ /dev/null @@ -1,111 +0,0 @@ -entityManager = $entityManager; - $this->subjectManager = $subjectManager; - $this->mbtStorage = $mbtStorage; - - parent::__construct(); - } - - public function setWorkflowRegistry(Registry $workflowRegistry) - { - $this->workflowRegistry = $workflowRegistry; - } - - protected function configure() - { - $this - ->setName('mbt:bug:capture-screenshots') - ->setDescription('Capture screenshots of a bug.') - ->setHelp('Capture screenshots of every reproduce steps of a bug.') - ->addArgument('bug-id', InputArgument::REQUIRED, 'The bug id to report.') - ->setHidden(true); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Exception - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $bugId = $input->getArgument('bug-id'); - $bug = $this->entityManager->getRepository(Bug::class)->find($bugId); - - if (!$bug || !$bug instanceof Bug) { - throw new Exception(sprintf('No bug found for id %d', $bugId)); - } - - $workflow = WorkflowHelper::get($this->workflowRegistry, $bug->getModel()->getName()); - if (WorkflowHelper::checksum($workflow) !== $bug->getModelHash()) { - throw new Exception(sprintf('Model checksum of bug with id %d does not match', $bugId)); - } - - $subject = $this->getSubject($bug->getModel()->getName()); - $subject->setFilesystem($this->mbtStorage); - $subject->removeScreenshots($bug->getId()); - - $this->setAnonymousToken(); - - try { - foreach ($bug->getSteps() as $index => $step) { - if ($step->getTransition() && $step->getData() instanceof Data) { - try { - $workflow->apply($subject, $step->getTransition(), [ - 'data' => $step->getData(), - ]); - } catch (Throwable $throwable) { - } finally { - $subject->captureScreenshot($bugId, $index); - } - } elseif (0 === $index) { - $subject->captureScreenshot($bugId, $index); - } - } - } finally { - $subject->tearDown(); - } - } -} diff --git a/src/Command/CommandRunner.php b/src/Command/CommandRunner.php deleted file mode 100644 index ac0c8125..00000000 --- a/src/Command/CommandRunner.php +++ /dev/null @@ -1,52 +0,0 @@ -kernel = $kernel; - $this->logger = $logger; - } - - /** - * Call console command corresponding to the message is being handled. - * - * @param array $parameters - * - * @throws Exception - */ - public function run(array $parameters) - { - $process = new Process(array_merge(['bin/console'], $parameters)); - $process->setTimeout(null); - $process->setWorkingDirectory($this->kernel->getProjectDir()); - - $exitCode = $process->run(); - - if ($exitCode) { - $error = $process->getErrorOutput(); - $this->logger->error($error); - - // Re-sent the message to the transport to be tried again - throw new Exception($error); - } - } -} diff --git a/src/Command/CreateBugCommand.php b/src/Command/CreateBugCommand.php deleted file mode 100644 index a75ab1f9..00000000 --- a/src/Command/CreateBugCommand.php +++ /dev/null @@ -1,107 +0,0 @@ -entityManager = $entityManager; - $this->validator = $validator; - - parent::__construct(); - } - - public function setWorkflowRegistry(Registry $workflowRegistry) - { - $this->workflowRegistry = $workflowRegistry; - } - - protected function configure() - { - $this - ->setName('mbt:bug:create') - ->setDescription('Create a bug.') - ->setHelp('Create a bug.') - ->addArgument('title', InputArgument::REQUIRED, 'Bug title.') - ->addArgument('steps', InputArgument::REQUIRED, 'Bug steps.') - ->addArgument('message', InputArgument::REQUIRED, 'Bug message.') - ->addArgument('task-id', InputArgument::REQUIRED, 'Task id.') - ->addArgument('status', InputArgument::REQUIRED, 'Bug status.') - ->addArgument('model', InputArgument::REQUIRED, 'Model name.') - ->setHidden(true); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Exception - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $title = $input->getArgument('title'); - $steps = $input->getArgument('steps'); - $message = $input->getArgument('message'); - $taskId = $input->getArgument('task-id'); - $status = $input->getArgument('status'); - $model = $input->getArgument('model'); - - $workflow = WorkflowHelper::get($this->workflowRegistry, $model); - - $bug = new Bug(); - $bug->setTitle($title); - $bug->setSteps(Steps::deserialize($steps)); - $bug->setModel(new Model($model)); - $bug->setModelHash(WorkflowHelper::checksum($workflow)); - $bug->setBugMessage($message); - $bug->setStatus($status); - - if ($taskId) { - $task = $this->entityManager->getRepository(Task::class)->find($taskId); - if ($task instanceof Task) { - $bug->setTask($task); - } - } - - $errors = $this->validator->validate($bug); - - if (count($errors) > 0) { - throw new Exception(sprintf('Invalid bug. Reason: %s', (string) $errors)); - } - - $this->entityManager->persist($bug); - $this->entityManager->flush(); - } -} diff --git a/src/Command/DefaultBugTitleTrait.php b/src/Command/DefaultBugTitleTrait.php new file mode 100644 index 00000000..c1f41bbb --- /dev/null +++ b/src/Command/DefaultBugTitleTrait.php @@ -0,0 +1,16 @@ +defaultBugTitle = $defaultBugTitle; + } +} diff --git a/src/Command/ExecuteTaskCommand.php b/src/Command/ExecuteTaskCommand.php deleted file mode 100644 index c5ac8c65..00000000 --- a/src/Command/ExecuteTaskCommand.php +++ /dev/null @@ -1,116 +0,0 @@ -subjectManager = $subjectManager; - $this->generatorManager = $generatorManager; - $this->entityManager = $entityManager; - $this->messageBus = $messageBus; - - parent::__construct(); - } - - public function setWorkflowRegistry(Registry $workflowRegistry) - { - $this->workflowRegistry = $workflowRegistry; - } - - protected function configure() - { - $this - ->setName('mbt:task:execute') - ->setDescription('Execute a task.') - ->setHelp('This command execute a task, then create a bug if found.') - ->addArgument('task-id', InputArgument::REQUIRED, 'The task id to execute.'); - } - - public function setDefaultBugTitle(string $defaultBugTitle) - { - $this->defaultBugTitle = $defaultBugTitle; - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Exception - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $taskId = $input->getArgument('task-id'); - $task = $this->entityManager->find(Task::class, $taskId); - - if (!$task instanceof Task) { - $output->writeln(sprintf('No task found for id %d', $taskId)); - - return; - } - - $subject = $this->getSubject($task->getModel()->getName()); - $generator = $this->generatorManager->getGenerator($task->getGenerator()->getName()); - $workflow = WorkflowHelper::get($this->workflowRegistry, $task->getModel()->getName()); - - $this->setAnonymousToken(); - - $recorded = new Steps(); - try { - $steps = $generator->generate($workflow, $subject, $task->getGeneratorOptions()); - StepsRunner::record($steps, $workflow, $subject, $recorded); - } catch (Throwable $throwable) { - $this->createBug($this->defaultBugTitle, $recorded, $throwable->getMessage(), $taskId, $task->getModel()->getName()); - } finally { - $subject->tearDown(); - - $this->applyTaskTransition($taskId, TaskWorkflow::COMPLETE); - } - } -} diff --git a/src/Command/FinishReduceBugCommand.php b/src/Command/FinishReduceBugCommand.php deleted file mode 100644 index dbb53fa4..00000000 --- a/src/Command/FinishReduceBugCommand.php +++ /dev/null @@ -1,74 +0,0 @@ -entityManager = $entityManager; - $this->messageBus = $messageBus; - - parent::__construct(); - } - - protected function configure() - { - $this - ->setName('mbt:bug:finish-reduce') - ->setDescription('Finish reduce bug.') - ->setHelp('Do things after finish reducing bugs: report bug, capture screenshots') - ->addArgument('bug-id', InputArgument::REQUIRED, 'The bug id.') - ->setHidden(true); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Exception - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $bugId = $input->getArgument('bug-id'); - $bug = $this->entityManager->find(Bug::class, $bugId); - - if (!$bug instanceof Bug) { - throw new Exception(sprintf('No bug found for id %d', $bugId)); - } - - $this->applyBugTransition($bug->getId(), BugWorkflow::COMPLETE_REDUCE); - - $task = $bug->getTask(); - if ($task instanceof Task) { - if (!empty($task->getReporters())) { - foreach ($task->getReporters() as $reporter) { - $this->reportBug($bug->getId(), $reporter->getName()); - } - } - if ($task->getTakeScreenshots()) { - $this->captureScreenshots($bug->getId()); - } - } - } -} diff --git a/src/Command/FinishReduceStepsCommand.php b/src/Command/FinishReduceStepsCommand.php deleted file mode 100644 index 3d3b379d..00000000 --- a/src/Command/FinishReduceStepsCommand.php +++ /dev/null @@ -1,76 +0,0 @@ -entityManager = $entityManager; - $this->messageBus = $messageBus; - - parent::__construct(); - } - - protected function configure() - { - $this - ->setName('mbt:steps:finish-reduce') - ->setDescription('Finish reduce path') - ->setHelp('Do things after finish reducing path: reduce messages count, finish reduce bug if needed') - ->addArgument('bug-id', InputArgument::REQUIRED, 'The bug id.') - ->setHidden(true); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Exception - * @throws Throwable - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $bugId = $input->getArgument('bug-id'); - - $callback = function () use ($bugId) { - $bug = $this->entityManager->find(Bug::class, $bugId, LockMode::PESSIMISTIC_WRITE); - - if (!$bug instanceof Bug) { - throw new Exception(sprintf('No bug found for id %d', $bugId)); - } - - if ($bug->getMessagesCount() > 0) { - $bug->setMessagesCount($bug->getMessagesCount() - 1); - } - - return $bug; - }; - - $bug = $this->entityManager->transactional($callback); - if ($bug instanceof Bug && 0 === $bug->getMessagesCount()) { - $this->finishReduceBug($bug->getId()); - } - } -} diff --git a/src/Command/MessageTrait.php b/src/Command/MessageTrait.php index c3d21602..842d8a02 100644 --- a/src/Command/MessageTrait.php +++ b/src/Command/MessageTrait.php @@ -3,12 +3,14 @@ namespace Tienvx\Bundle\MbtBundle\Command; use Symfony\Component\Messenger\MessageBusInterface; +use Tienvx\Bundle\MbtBundle\Entity\Bug; use Tienvx\Bundle\MbtBundle\Entity\Steps; use Tienvx\Bundle\MbtBundle\Message\ApplyBugTransitionMessage; use Tienvx\Bundle\MbtBundle\Message\ApplyTaskTransitionMessage; use Tienvx\Bundle\MbtBundle\Message\CaptureScreenshotsMessage; use Tienvx\Bundle\MbtBundle\Message\CreateBugMessage; use Tienvx\Bundle\MbtBundle\Message\FinishReduceBugMessage; +use Tienvx\Bundle\MbtBundle\Message\FinishReduceStepsMessage; use Tienvx\Bundle\MbtBundle\Message\ReportBugMessage; use Tienvx\Bundle\MbtBundle\Workflow\BugWorkflow; @@ -56,4 +58,9 @@ protected function finishReduceBug(int $bugId) { $this->messageBus->dispatch(new FinishReduceBugMessage($bugId)); } + + protected function finishReduceSteps(Bug $bug): void + { + $this->messageBus->dispatch(new FinishReduceStepsMessage($bug->getId())); + } } diff --git a/src/Command/ReduceBugCommand.php b/src/Command/ReduceBugCommand.php deleted file mode 100644 index bbfc6513..00000000 --- a/src/Command/ReduceBugCommand.php +++ /dev/null @@ -1,106 +0,0 @@ -reducerManager = $reducerManager; - $this->entityManager = $entityManager; - $this->messageBus = $messageBus; - - parent::__construct(); - } - - public function setWorkflowRegistry(Registry $workflowRegistry) - { - $this->workflowRegistry = $workflowRegistry; - } - - protected function configure() - { - $this - ->setName('mbt:bug:reduce') - ->setDescription('Reduce the reproduce steps of the bug.') - ->setHelp("Make bug's reproduce steps shorter.") - ->addArgument('bug-id', InputArgument::REQUIRED, 'The bug id to reduce the steps.') - ->addArgument('reducer', InputArgument::REQUIRED, 'The path reducer.') - ->setHidden(true); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Exception - * @throws Throwable - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $bugId = $input->getArgument('bug-id'); - $reducer = $input->getArgument('reducer'); - $bug = $this->entityManager->find(Bug::class, $bugId); - - if (!$bug instanceof Bug) { - throw new Exception(sprintf('No bug found for id %d', $bugId)); - } - - $workflow = WorkflowHelper::get($this->workflowRegistry, $bug->getModel()->getName()); - if (WorkflowHelper::checksum($workflow) !== $bug->getModelHash()) { - throw new Exception(sprintf('Model checksum of bug with id %d does not match', $bugId)); - } - - $reducer = $this->reducerManager->getReducer($reducer); - $messagesCount = $reducer->dispatch($bug); - if (0 === $messagesCount && 0 === $bug->getMessagesCount()) { - $this->finishReduceBug($bug->getId()); - } elseif ($messagesCount > 0) { - $callback = function () use ($bug, $messagesCount) { - // Reload the bug for the newest messages count. - $bug = $this->entityManager->find(Bug::class, $bug->getId(), LockMode::PESSIMISTIC_WRITE); - - if ($bug instanceof Bug) { - $bug->setMessagesCount($bug->getMessagesCount() + $messagesCount); - } - }; - - $this->entityManager->transactional($callback); - } - } -} diff --git a/src/Command/ReduceStepsCommand.php b/src/Command/ReduceStepsCommand.php deleted file mode 100644 index 62326a94..00000000 --- a/src/Command/ReduceStepsCommand.php +++ /dev/null @@ -1,110 +0,0 @@ -reducerManager = $reducerManager; - $this->entityManager = $entityManager; - $this->messageBus = $messageBus; - - parent::__construct(); - } - - public function setWorkflowRegistry(Registry $workflowRegistry) - { - $this->workflowRegistry = $workflowRegistry; - } - - protected function configure() - { - $this - ->setName('mbt:steps:reduce') - ->setDescription("Handle a path reducer's message.") - ->setHelp('Call path reducer to handle a message that was come from itself') - ->addArgument('bug-id', InputArgument::REQUIRED, 'The bug id.') - ->addArgument('reducer', InputArgument::REQUIRED, 'The path reducer.') - ->addArgument('length', InputArgument::REQUIRED, 'The path length.') - ->addArgument('from', InputArgument::REQUIRED, 'From places.') - ->addArgument('to', InputArgument::REQUIRED, 'To places.') - ->setHidden(true); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Exception - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $bugId = $input->getArgument('bug-id'); - $reducer = $input->getArgument('reducer'); - $length = $input->getArgument('length'); - $from = $input->getArgument('from'); - $to = $input->getArgument('to'); - $bug = $this->entityManager->find(Bug::class, $bugId); - - if (!$bug || !$bug instanceof Bug) { - throw new Exception(sprintf('No bug found for id %d', $bugId)); - } - - $workflow = WorkflowHelper::get($this->workflowRegistry, $bug->getModel()->getName()); - if (WorkflowHelper::checksum($workflow) !== $bug->getModelHash()) { - throw new Exception(sprintf('Model checksum of bug with id %d does not match', $bugId)); - } - - $this->setAnonymousToken(); - - $reducerService = $this->reducerManager->getReducer($reducer); - $reducerService->handle($bug, $workflow, $length, $from, $to); - - $this->finish($bug); - } - - public function finish(Bug $bug): void - { - $this->messageBus->dispatch(new FinishReduceStepsMessage($bug->getId())); - } -} diff --git a/src/Command/RemoveScreenshotsCommand.php b/src/Command/RemoveScreenshotsCommand.php deleted file mode 100644 index 6c05d2ec..00000000 --- a/src/Command/RemoveScreenshotsCommand.php +++ /dev/null @@ -1,69 +0,0 @@ -entityManager = $entityManager; - $this->subjectManager = $subjectManager; - $this->mbtStorage = $mbtStorage; - - parent::__construct(); - } - - protected function configure() - { - $this - ->setName('mbt:bug:remove-screenshots') - ->setDescription('Remove screenshots of a bug.') - ->setHelp('Remove screenshots of a bug when the bug is removed.') - ->addArgument('bug-id', InputArgument::REQUIRED, 'The bug id to report.') - ->addArgument('model', InputArgument::REQUIRED, 'The model of the task.') - ->setHidden(true); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Exception - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $bugId = $input->getArgument('bug-id'); - $model = $input->getArgument('model'); - - $subject = $this->subjectManager->createSubject($model); - $subject->setFilesystem($this->mbtStorage); - $subject->removeScreenshots($bugId); - } -} diff --git a/src/Command/ReportBugCommand.php b/src/Command/ReportBugCommand.php deleted file mode 100644 index bfd616f8..00000000 --- a/src/Command/ReportBugCommand.php +++ /dev/null @@ -1,68 +0,0 @@ -entityManager = $entityManager; - $this->reporterManager = $reporterManager; - - parent::__construct(); - } - - protected function configure() - { - $this - ->setName('mbt:bug:report') - ->setDescription('Report a bug.') - ->setHelp('Report a bug to email, hipchat or jira.') - ->addArgument('bug-id', InputArgument::REQUIRED, 'The bug id to report.') - ->addArgument('reporter', InputArgument::REQUIRED, 'The bug reporter.'); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Exception - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $bugId = $input->getArgument('bug-id'); - $reporter = $input->getArgument('reporter'); - - $bug = $this->entityManager->find(Bug::class, $bugId); - - if (!$bug instanceof Bug) { - $output->writeln(sprintf('No bug found for id %d', $bugId)); - - return; - } - - $reporterPlugin = $this->reporterManager->getReporter($reporter); - $reporterPlugin->report($bug); - } -} diff --git a/src/Command/TestBugCommand.php b/src/Command/TestBugCommand.php deleted file mode 100644 index 630c8bc1..00000000 --- a/src/Command/TestBugCommand.php +++ /dev/null @@ -1,128 +0,0 @@ -subjectManager = $subjectManager; - $this->generatorManager = $generatorManager; - $this->entityManager = $entityManager; - $this->messageBus = $messageBus; - - parent::__construct(); - } - - public function setWorkflowRegistry(Registry $workflowRegistry) - { - $this->workflowRegistry = $workflowRegistry; - } - - protected function configure() - { - $this - ->setName('mbt:bug:test') - ->setDescription('Test a bug to see if it is still replicable or not.') - ->setHelp('Test a bug, update the bug, or create a new bug if needed.') - ->addArgument('bug-id', InputArgument::REQUIRED, 'The bug to test.'); - } - - public function setDefaultBugTitle(string $defaultBugTitle) - { - $this->defaultBugTitle = $defaultBugTitle; - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Throwable - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $bugId = $input->getArgument('bug-id'); - $bug = $this->entityManager->find(Bug::class, $bugId); - - if (!$bug instanceof Bug) { - throw new Exception(sprintf('No bug found for id %d', $bugId)); - } - - if (BugWorkflow::CLOSED !== $bug->getStatus()) { - throw new Exception(sprintf('Can not test bug with id %d, only closed bug can be tested again', $bugId)); - } - - $workflow = WorkflowHelper::get($this->workflowRegistry, $bug->getModel()->getName()); - if (WorkflowHelper::checksum($workflow) !== $bug->getModelHash()) { - throw new Exception(sprintf('Model checksum of bug with id %d does not match', $bugId)); - } - - $subject = $this->getSubject($bug->getModel()->getName()); - $this->setAnonymousToken(); - - $recorded = new Steps(); - try { - StepsRunner::record($bug->getSteps(), $workflow, $subject, $recorded); - } catch (Throwable $throwable) { - if ($throwable->getMessage() === $bug->getBugMessage()) { - if ($recorded->getLength() < $bug->getSteps()->getLength()) { - BugHelper::updateSteps($this->entityManager, $bug, $recorded); - } - $this->applyBugTransition($bugId, BugWorkflow::REOPEN); - } else { - $this->createBug($this->defaultBugTitle, $recorded, $throwable->getMessage(), null, $bug->getModel()->getName()); - } - } finally { - $subject->tearDown(); - } - - $output->writeln('Testing bug is finished!'); - } -} diff --git a/src/Command/TestModelCommand.php b/src/Command/TestModelCommand.php index 7ef51fe5..dfe8a294 100644 --- a/src/Command/TestModelCommand.php +++ b/src/Command/TestModelCommand.php @@ -9,7 +9,6 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Workflow\Registry; use Throwable; use Tienvx\Bundle\MbtBundle\Entity\GeneratorOptions; use Tienvx\Bundle\MbtBundle\Entity\Steps; @@ -22,11 +21,7 @@ class TestModelCommand extends Command { use TokenTrait; use SubjectTrait; - - /** - * @var Registry - */ - private $workflowRegistry; + use WorkflowRegisterTrait; /** * @var SubjectManager @@ -48,11 +43,6 @@ public function __construct( parent::__construct(); } - public function setWorkflowRegistry(Registry $workflowRegistry) - { - $this->workflowRegistry = $workflowRegistry; - } - protected function configure() { $this diff --git a/src/Command/TestPredefinedCaseCommand.php b/src/Command/TestPredefinedCaseCommand.php deleted file mode 100644 index f4dedf55..00000000 --- a/src/Command/TestPredefinedCaseCommand.php +++ /dev/null @@ -1,120 +0,0 @@ -subjectManager = $subjectManager; - $this->generatorManager = $generatorManager; - $this->entityManager = $entityManager; - $this->messageBus = $messageBus; - $this->predefinedCaseManager = $predefinedCaseManager; - - parent::__construct(); - } - - public function setWorkflowRegistry(Registry $workflowRegistry) - { - $this->workflowRegistry = $workflowRegistry; - } - - protected function configure() - { - $this - ->setName('mbt:predefined-case:test') - ->setDescription('Test a predefined case to see if it has a bug or not.') - ->setHelp('Test a predefined case, create a new bug if needed.') - ->addArgument('name', InputArgument::REQUIRED, 'The predefined case name.'); - } - - public function setDefaultBugTitle(string $defaultBugTitle) - { - $this->defaultBugTitle = $defaultBugTitle; - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * - * @throws Exception - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - $name = $input->getArgument('name'); - - if (!$this->predefinedCaseManager->has($name)) { - throw new Exception(sprintf('No pre-defined case found for name %s', $name)); - } - - $predefinedCase = $this->predefinedCaseManager->get($name); - $model = $predefinedCase->getModel()->getName(); - $workflow = WorkflowHelper::get($this->workflowRegistry, $model); - $subject = $this->getSubject($model); - - $this->setAnonymousToken(); - - $recorded = new Steps(); - try { - StepsRunner::record($predefinedCase->getSteps(), $workflow, $subject, $recorded); - } catch (Throwable $throwable) { - $this->createBug($this->defaultBugTitle, $recorded, $throwable->getMessage(), null, $model); - } finally { - $subject->tearDown(); - } - - $output->writeln('Testing predefined case is finished!'); - } -} diff --git a/src/Command/WorkflowRegisterTrait.php b/src/Command/WorkflowRegisterTrait.php new file mode 100644 index 00000000..6a0f2c32 --- /dev/null +++ b/src/Command/WorkflowRegisterTrait.php @@ -0,0 +1,18 @@ +workflowRegistry = $workflowRegistry; + } +} diff --git a/src/DependencyInjection/Compiler/SecurityTokenPass.php b/src/DependencyInjection/Compiler/SecurityTokenPass.php index f283a5b2..fb9f85ec 100644 --- a/src/DependencyInjection/Compiler/SecurityTokenPass.php +++ b/src/DependencyInjection/Compiler/SecurityTokenPass.php @@ -6,12 +6,12 @@ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; -use Tienvx\Bundle\MbtBundle\Command\CaptureScreenshotsCommand; -use Tienvx\Bundle\MbtBundle\Command\ExecuteTaskCommand; -use Tienvx\Bundle\MbtBundle\Command\TestBugCommand; -use Tienvx\Bundle\MbtBundle\Command\ReduceStepsCommand; use Tienvx\Bundle\MbtBundle\Command\TestModelCommand; -use Tienvx\Bundle\MbtBundle\Command\TestPredefinedCaseCommand; +use Tienvx\Bundle\MbtBundle\MessageHandler\CaptureScreenshotsMessageHandler; +use Tienvx\Bundle\MbtBundle\MessageHandler\ExecuteTaskMessageHandler; +use Tienvx\Bundle\MbtBundle\MessageHandler\ReduceStepsMessageHandler; +use Tienvx\Bundle\MbtBundle\MessageHandler\TestBugMessageHandler; +use Tienvx\Bundle\MbtBundle\MessageHandler\TestPredefinedCaseMessageHandler; class SecurityTokenPass implements CompilerPassInterface { @@ -35,11 +35,11 @@ public function process(ContainerBuilder $container) $tokenStorage = new Reference($this->tokenStorageService); $commands = [ - ExecuteTaskCommand::class, - ReduceStepsCommand::class, - CaptureScreenshotsCommand::class, - TestBugCommand::class, - TestPredefinedCaseCommand::class, + ExecuteTaskMessageHandler::class, + ReduceStepsMessageHandler::class, + CaptureScreenshotsMessageHandler::class, + TestBugMessageHandler::class, + TestPredefinedCaseMessageHandler::class, TestModelCommand::class, ]; foreach ($commands as $command) { diff --git a/src/DependencyInjection/Compiler/WorkflowRegisterPass.php b/src/DependencyInjection/Compiler/WorkflowRegisterPass.php index eb6fe71a..6fd55468 100644 --- a/src/DependencyInjection/Compiler/WorkflowRegisterPass.php +++ b/src/DependencyInjection/Compiler/WorkflowRegisterPass.php @@ -6,15 +6,15 @@ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; -use Tienvx\Bundle\MbtBundle\Command\CaptureScreenshotsCommand; -use Tienvx\Bundle\MbtBundle\Command\CreateBugCommand; -use Tienvx\Bundle\MbtBundle\Command\ExecuteTaskCommand; -use Tienvx\Bundle\MbtBundle\Command\ReduceBugCommand; -use Tienvx\Bundle\MbtBundle\Command\ReduceStepsCommand; -use Tienvx\Bundle\MbtBundle\Command\TestBugCommand; use Tienvx\Bundle\MbtBundle\Command\TestModelCommand; -use Tienvx\Bundle\MbtBundle\Command\TestPredefinedCaseCommand; use Tienvx\Bundle\MbtBundle\Maker\MakeSubject; +use Tienvx\Bundle\MbtBundle\MessageHandler\CaptureScreenshotsMessageHandler; +use Tienvx\Bundle\MbtBundle\MessageHandler\CreateBugMessageHandler; +use Tienvx\Bundle\MbtBundle\MessageHandler\ExecuteTaskMessageHandler; +use Tienvx\Bundle\MbtBundle\MessageHandler\ReduceBugMessageHandler; +use Tienvx\Bundle\MbtBundle\MessageHandler\ReduceStepsMessageHandler; +use Tienvx\Bundle\MbtBundle\MessageHandler\TestBugMessageHandler; +use Tienvx\Bundle\MbtBundle\MessageHandler\TestPredefinedCaseMessageHandler; use Tienvx\Bundle\MbtBundle\Reducer\LoopReducer; use Tienvx\Bundle\MbtBundle\Reducer\RandomReducer; use Tienvx\Bundle\MbtBundle\Reducer\SplitReducer; @@ -43,14 +43,14 @@ public function process(ContainerBuilder $container) $registry = new Reference($this->registryService); $services = [ - CaptureScreenshotsCommand::class, - CreateBugCommand::class, - ExecuteTaskCommand::class, - ReduceBugCommand::class, - ReduceStepsCommand::class, - TestBugCommand::class, + CaptureScreenshotsMessageHandler::class, + CreateBugMessageHandler::class, + ExecuteTaskMessageHandler::class, + ReduceBugMessageHandler::class, + ReduceStepsMessageHandler::class, + TestBugMessageHandler::class, + TestPredefinedCaseMessageHandler::class, TestModelCommand::class, - TestPredefinedCaseCommand::class, MakeSubject::class, LoopReducer::class, RandomReducer::class, diff --git a/src/DependencyInjection/TienvxMbtExtension.php b/src/DependencyInjection/TienvxMbtExtension.php index 0eb2d4a5..d72dfd44 100644 --- a/src/DependencyInjection/TienvxMbtExtension.php +++ b/src/DependencyInjection/TienvxMbtExtension.php @@ -9,14 +9,14 @@ use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\HttpKernel\DependencyInjection\Extension; -use Tienvx\Bundle\MbtBundle\Command\ExecuteTaskCommand; -use Tienvx\Bundle\MbtBundle\Command\TestBugCommand; -use Tienvx\Bundle\MbtBundle\Command\TestPredefinedCaseCommand; use Tienvx\Bundle\MbtBundle\Entity\PredefinedCase; use Tienvx\Bundle\MbtBundle\Entity\Steps; use Tienvx\Bundle\MbtBundle\Generator\GeneratorInterface; use Tienvx\Bundle\MbtBundle\Generator\ProbabilityGenerator; use Tienvx\Bundle\MbtBundle\Generator\RandomGenerator; +use Tienvx\Bundle\MbtBundle\MessageHandler\ExecuteTaskMessageHandler; +use Tienvx\Bundle\MbtBundle\MessageHandler\TestBugMessageHandler; +use Tienvx\Bundle\MbtBundle\MessageHandler\TestPredefinedCaseMessageHandler; use Tienvx\Bundle\MbtBundle\PredefinedCase\PredefinedCaseManager; use Tienvx\Bundle\MbtBundle\Reducer\ReducerInterface; use Tienvx\Bundle\MbtBundle\Reporter\EmailReporter; @@ -65,9 +65,9 @@ public function load(array $configs, ContainerBuilder $container) private function registerCommandConfiguration(array $config, ContainerBuilder $container) { $commands = [ - ExecuteTaskCommand::class, - TestBugCommand::class, - TestPredefinedCaseCommand::class, + ExecuteTaskMessageHandler::class, + TestBugMessageHandler::class, + TestPredefinedCaseMessageHandler::class, ]; foreach ($commands as $command) { $commandDefinition = $container->getDefinition($command); diff --git a/src/Generator/AllTransitionsGenerator.php b/src/Generator/AllTransitionsGenerator.php index 002b3ecb..6267f008 100644 --- a/src/Generator/AllTransitionsGenerator.php +++ b/src/Generator/AllTransitionsGenerator.php @@ -40,8 +40,7 @@ public function generate(Workflow $workflow, SubjectInterface $subject, Generato if ($singleComponent) { $algorithm = new Eulerian($graph); $startVertex = $graph->getVertex(VertexHelper::getId($workflow->getDefinition()->getInitialPlaces())); - $edges = $algorithm->getEdges($startVertex); - $edges = $edges->getVector(); + $edges = $algorithm->getEdges($startVertex)->getVector(); while (!empty($edges)) { $edge = array_shift($edges); $transitionName = $edge->getAttribute('name'); diff --git a/src/MessageHandler/ApplyBugTransitionMessageHandler.php b/src/MessageHandler/ApplyBugTransitionMessageHandler.php index 4a8bd51e..19b7386c 100644 --- a/src/MessageHandler/ApplyBugTransitionMessageHandler.php +++ b/src/MessageHandler/ApplyBugTransitionMessageHandler.php @@ -2,21 +2,29 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\ORM\EntityManagerInterface; use Exception; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; +use Tienvx\Bundle\MbtBundle\Entity\Bug; use Tienvx\Bundle\MbtBundle\Message\ApplyBugTransitionMessage; +use Tienvx\Bundle\MbtBundle\Workflow\BugWorkflow; class ApplyBugTransitionMessageHandler implements MessageHandlerInterface { /** - * @var CommandRunner + * @var BugWorkflow */ - private $commandRunner; + private $bugWorkflow; - public function __construct(CommandRunner $commandRunner) + /** + * @var EntityManagerInterface + */ + private $entityManager; + + public function __construct(EntityManagerInterface $entityManager, BugWorkflow $bugWorkflow) { - $this->commandRunner = $commandRunner; + $this->entityManager = $entityManager; + $this->bugWorkflow = $bugWorkflow; } /** @@ -27,7 +35,14 @@ public function __construct(CommandRunner $commandRunner) public function __invoke(ApplyBugTransitionMessage $message) { $bugId = $message->getId(); - $status = $message->getTransition(); - $this->commandRunner->run(['mbt:bug:apply-transition', $bugId, $status]); + $transition = $message->getTransition(); + $bug = $this->entityManager->getRepository(Bug::class)->find($bugId); + + if (!$bug || !$bug instanceof Bug) { + throw new Exception(sprintf('No bug found for id %d', $bugId)); + } + + $this->bugWorkflow->apply($bug, $transition); + $this->entityManager->flush(); } } diff --git a/src/MessageHandler/ApplyTaskTransitionMessageHandler.php b/src/MessageHandler/ApplyTaskTransitionMessageHandler.php index aca3a7d7..af0dbc7e 100644 --- a/src/MessageHandler/ApplyTaskTransitionMessageHandler.php +++ b/src/MessageHandler/ApplyTaskTransitionMessageHandler.php @@ -2,21 +2,29 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\ORM\EntityManagerInterface; use Exception; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; +use Tienvx\Bundle\MbtBundle\Entity\Task; use Tienvx\Bundle\MbtBundle\Message\ApplyTaskTransitionMessage; +use Tienvx\Bundle\MbtBundle\Workflow\TaskWorkflow; class ApplyTaskTransitionMessageHandler implements MessageHandlerInterface { /** - * @var CommandRunner + * @var TaskWorkflow */ - private $commandRunner; + private $taskWorkflow; - public function __construct(CommandRunner $commandRunner) + /** + * @var EntityManagerInterface + */ + private $entityManager; + + public function __construct(EntityManagerInterface $entityManager, TaskWorkflow $taskWorkflow) { - $this->commandRunner = $commandRunner; + $this->entityManager = $entityManager; + $this->taskWorkflow = $taskWorkflow; } /** @@ -28,6 +36,13 @@ public function __invoke(ApplyTaskTransitionMessage $message) { $taskId = $message->getId(); $transition = $message->getTransition(); - $this->commandRunner->run(['mbt:task:apply-transition', $taskId, $transition]); + $task = $this->entityManager->getRepository(Task::class)->find($taskId); + + if (!$task || !$task instanceof Task) { + throw new Exception(sprintf('No task found for id %d', $taskId)); + } + + $this->taskWorkflow->apply($task, $transition); + $this->entityManager->flush(); } } diff --git a/src/MessageHandler/CaptureScreenshotsMessageHandler.php b/src/MessageHandler/CaptureScreenshotsMessageHandler.php index 61802c1e..5e9b0f06 100644 --- a/src/MessageHandler/CaptureScreenshotsMessageHandler.php +++ b/src/MessageHandler/CaptureScreenshotsMessageHandler.php @@ -2,21 +2,44 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\ORM\EntityManagerInterface; use Exception; +use League\Flysystem\FilesystemInterface; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; +use Throwable; +use Tienvx\Bundle\MbtBundle\Command\WorkflowRegisterTrait; +use Tienvx\Bundle\MbtBundle\Command\SubjectTrait; +use Tienvx\Bundle\MbtBundle\Command\TokenTrait; +use Tienvx\Bundle\MbtBundle\Entity\Bug; +use Tienvx\Bundle\MbtBundle\Entity\Data; +use Tienvx\Bundle\MbtBundle\Helper\WorkflowHelper; use Tienvx\Bundle\MbtBundle\Message\CaptureScreenshotsMessage; +use Tienvx\Bundle\MbtBundle\Subject\SubjectManager; class CaptureScreenshotsMessageHandler implements MessageHandlerInterface { + use TokenTrait; + use SubjectTrait; + use WorkflowRegisterTrait; + /** - * @var CommandRunner + * @var EntityManagerInterface */ - private $commandRunner; + private $entityManager; - public function __construct(CommandRunner $commandRunner) - { - $this->commandRunner = $commandRunner; + /** + * @var FilesystemInterface + */ + protected $mbtStorage; + + public function __construct( + EntityManagerInterface $entityManager, + SubjectManager $subjectManager, + FilesystemInterface $mbtStorage + ) { + $this->entityManager = $entityManager; + $this->subjectManager = $subjectManager; + $this->mbtStorage = $mbtStorage; } /** @@ -27,6 +50,40 @@ public function __construct(CommandRunner $commandRunner) public function __invoke(CaptureScreenshotsMessage $message) { $bugId = $message->getBugId(); - $this->commandRunner->run(['mbt:bug:capture-screenshots', $bugId]); + $bug = $this->entityManager->getRepository(Bug::class)->find($bugId); + + if (!$bug || !$bug instanceof Bug) { + throw new Exception(sprintf('No bug found for id %d', $bugId)); + } + + $workflow = WorkflowHelper::get($this->workflowRegistry, $bug->getModel()->getName()); + if (WorkflowHelper::checksum($workflow) !== $bug->getModelHash()) { + throw new Exception(sprintf('Model checksum of bug with id %d does not match', $bugId)); + } + + $subject = $this->getSubject($bug->getModel()->getName()); + $subject->setFilesystem($this->mbtStorage); + $subject->removeScreenshots($bug->getId()); + + $this->setAnonymousToken(); + + try { + foreach ($bug->getSteps() as $index => $step) { + if ($step->getTransition() && $step->getData() instanceof Data) { + try { + $workflow->apply($subject, $step->getTransition(), [ + 'data' => $step->getData(), + ]); + } catch (Throwable $throwable) { + } finally { + $subject->captureScreenshot($bugId, $index); + } + } elseif (0 === $index) { + $subject->captureScreenshot($bugId, $index); + } + } + } finally { + $subject->tearDown(); + } } } diff --git a/src/MessageHandler/CreateBugMessageHandler.php b/src/MessageHandler/CreateBugMessageHandler.php index 52abc1e5..c94c7538 100644 --- a/src/MessageHandler/CreateBugMessageHandler.php +++ b/src/MessageHandler/CreateBugMessageHandler.php @@ -2,21 +2,36 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\ORM\EntityManagerInterface; use Exception; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; +use Symfony\Component\Validator\Validator\ValidatorInterface; +use Tienvx\Bundle\MbtBundle\Command\WorkflowRegisterTrait; +use Tienvx\Bundle\MbtBundle\Entity\Bug; +use Tienvx\Bundle\MbtBundle\Entity\Model; +use Tienvx\Bundle\MbtBundle\Entity\Steps; +use Tienvx\Bundle\MbtBundle\Entity\Task; +use Tienvx\Bundle\MbtBundle\Helper\WorkflowHelper; use Tienvx\Bundle\MbtBundle\Message\CreateBugMessage; class CreateBugMessageHandler implements MessageHandlerInterface { + use WorkflowRegisterTrait; + /** - * @var CommandRunner + * @var ValidatorInterface */ - private $commandRunner; + private $validator; - public function __construct(CommandRunner $commandRunner) + /** + * @var EntityManagerInterface + */ + private $entityManager; + + public function __construct(EntityManagerInterface $entityManager, ValidatorInterface $validator) { - $this->commandRunner = $commandRunner; + $this->entityManager = $entityManager; + $this->validator = $validator; } /** @@ -32,6 +47,31 @@ public function __invoke(CreateBugMessage $message) $taskId = $message->getTaskId(); $status = $message->getStatus(); $model = $message->getModel(); - $this->commandRunner->run(['mbt:bug:create', $title, $steps, $bugMessage, $taskId, $status, $model]); + + $workflow = WorkflowHelper::get($this->workflowRegistry, $model); + + $bug = new Bug(); + $bug->setTitle($title); + $bug->setSteps(Steps::deserialize($steps)); + $bug->setModel(new Model($model)); + $bug->setModelHash(WorkflowHelper::checksum($workflow)); + $bug->setBugMessage($bugMessage); + $bug->setStatus($status); + + if ($taskId) { + $task = $this->entityManager->getRepository(Task::class)->find($taskId); + if ($task instanceof Task) { + $bug->setTask($task); + } + } + + $errors = $this->validator->validate($bug); + + if (count($errors) > 0) { + throw new Exception(sprintf('Invalid bug. Reason: %s', (string) $errors)); + } + + $this->entityManager->persist($bug); + $this->entityManager->flush(); } } diff --git a/src/MessageHandler/ExecuteTaskMessageHandler.php b/src/MessageHandler/ExecuteTaskMessageHandler.php index 19bafc45..bb8cae71 100644 --- a/src/MessageHandler/ExecuteTaskMessageHandler.php +++ b/src/MessageHandler/ExecuteTaskMessageHandler.php @@ -2,21 +2,53 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\ORM\EntityManagerInterface; use Exception; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; +use Symfony\Component\Messenger\MessageBusInterface; +use Throwable; +use Tienvx\Bundle\MbtBundle\Command\DefaultBugTitleTrait; +use Tienvx\Bundle\MbtBundle\Command\MessageTrait; +use Tienvx\Bundle\MbtBundle\Command\SubjectTrait; +use Tienvx\Bundle\MbtBundle\Command\TokenTrait; +use Tienvx\Bundle\MbtBundle\Command\WorkflowRegisterTrait; +use Tienvx\Bundle\MbtBundle\Entity\Steps; +use Tienvx\Bundle\MbtBundle\Entity\Task; +use Tienvx\Bundle\MbtBundle\Generator\GeneratorManager; +use Tienvx\Bundle\MbtBundle\Helper\StepsRunner; +use Tienvx\Bundle\MbtBundle\Helper\WorkflowHelper; use Tienvx\Bundle\MbtBundle\Message\ExecuteTaskMessage; +use Tienvx\Bundle\MbtBundle\Subject\SubjectManager; +use Tienvx\Bundle\MbtBundle\Workflow\TaskWorkflow; class ExecuteTaskMessageHandler implements MessageHandlerInterface { + use TokenTrait; + use SubjectTrait; + use MessageTrait; + use WorkflowRegisterTrait; + use DefaultBugTitleTrait; + /** - * @var CommandRunner + * @var GeneratorManager */ - private $commandRunner; + private $generatorManager; - public function __construct(CommandRunner $commandRunner) - { - $this->commandRunner = $commandRunner; + /** + * @var EntityManagerInterface + */ + private $entityManager; + + public function __construct( + SubjectManager $subjectManager, + GeneratorManager $generatorManager, + EntityManagerInterface $entityManager, + MessageBusInterface $messageBus + ) { + $this->subjectManager = $subjectManager; + $this->generatorManager = $generatorManager; + $this->entityManager = $entityManager; + $this->messageBus = $messageBus; } /** @@ -26,7 +58,29 @@ public function __construct(CommandRunner $commandRunner) */ public function __invoke(ExecuteTaskMessage $message) { - $id = $message->getId(); - $this->commandRunner->run(['mbt:task:execute', $id]); + $taskId = $message->getId(); + $task = $this->entityManager->find(Task::class, $taskId); + + if (!$task instanceof Task) { + throw new Exception(sprintf('No task found for id %d', $taskId)); + } + + $subject = $this->getSubject($task->getModel()->getName()); + $generator = $this->generatorManager->getGenerator($task->getGenerator()->getName()); + $workflow = WorkflowHelper::get($this->workflowRegistry, $task->getModel()->getName()); + + $this->setAnonymousToken(); + + $recorded = new Steps(); + try { + $steps = $generator->generate($workflow, $subject, $task->getGeneratorOptions()); + StepsRunner::record($steps, $workflow, $subject, $recorded); + } catch (Throwable $throwable) { + $this->createBug($this->defaultBugTitle, $recorded, $throwable->getMessage(), $taskId, $task->getModel()->getName()); + } finally { + $subject->tearDown(); + + $this->applyTaskTransition($taskId, TaskWorkflow::COMPLETE); + } } } diff --git a/src/MessageHandler/FinishReduceBugMessageHandler.php b/src/MessageHandler/FinishReduceBugMessageHandler.php index ed3d6242..c3a54413 100644 --- a/src/MessageHandler/FinishReduceBugMessageHandler.php +++ b/src/MessageHandler/FinishReduceBugMessageHandler.php @@ -2,21 +2,29 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\ORM\EntityManagerInterface; use Exception; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; +use Symfony\Component\Messenger\MessageBusInterface; +use Tienvx\Bundle\MbtBundle\Command\MessageTrait; +use Tienvx\Bundle\MbtBundle\Entity\Bug; +use Tienvx\Bundle\MbtBundle\Entity\Task; use Tienvx\Bundle\MbtBundle\Message\FinishReduceBugMessage; +use Tienvx\Bundle\MbtBundle\Workflow\BugWorkflow; class FinishReduceBugMessageHandler implements MessageHandlerInterface { + use MessageTrait; + /** - * @var CommandRunner + * @var EntityManagerInterface */ - private $commandRunner; + private $entityManager; - public function __construct(CommandRunner $commandRunner) + public function __construct(EntityManagerInterface $entityManager, MessageBusInterface $messageBus) { - $this->commandRunner = $commandRunner; + $this->entityManager = $entityManager; + $this->messageBus = $messageBus; } /** @@ -26,7 +34,25 @@ public function __construct(CommandRunner $commandRunner) */ public function __invoke(FinishReduceBugMessage $message) { - $id = $message->getId(); - $this->commandRunner->run(['mbt:bug:finish-reduce', $id]); + $bugId = $message->getId(); + $bug = $this->entityManager->find(Bug::class, $bugId); + + if (!$bug instanceof Bug) { + throw new Exception(sprintf('No bug found for id %d', $bugId)); + } + + $this->applyBugTransition($bug->getId(), BugWorkflow::COMPLETE_REDUCE); + + $task = $bug->getTask(); + if ($task instanceof Task) { + if (!empty($task->getReporters())) { + foreach ($task->getReporters() as $reporter) { + $this->reportBug($bug->getId(), $reporter->getName()); + } + } + if ($task->getTakeScreenshots()) { + $this->captureScreenshots($bug->getId()); + } + } } } diff --git a/src/MessageHandler/FinishReduceStepsMessageHandler.php b/src/MessageHandler/FinishReduceStepsMessageHandler.php index b2515422..68aab456 100644 --- a/src/MessageHandler/FinishReduceStepsMessageHandler.php +++ b/src/MessageHandler/FinishReduceStepsMessageHandler.php @@ -2,21 +2,31 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\DBAL\LockMode; +use Doctrine\ORM\EntityManager; +use Doctrine\ORM\EntityManagerInterface; use Exception; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; +use Symfony\Component\Messenger\MessageBusInterface; +use Tienvx\Bundle\MbtBundle\Command\MessageTrait; +use Tienvx\Bundle\MbtBundle\Entity\Bug; use Tienvx\Bundle\MbtBundle\Message\FinishReduceStepsMessage; class FinishReduceStepsMessageHandler implements MessageHandlerInterface { + use MessageTrait; + /** - * @var CommandRunner + * @var EntityManager */ - private $commandRunner; + private $entityManager; - public function __construct(CommandRunner $commandRunner) - { - $this->commandRunner = $commandRunner; + public function __construct( + EntityManagerInterface $entityManager, + MessageBusInterface $messageBus + ) { + $this->entityManager = $entityManager; + $this->messageBus = $messageBus; } /** @@ -27,6 +37,24 @@ public function __construct(CommandRunner $commandRunner) public function __invoke(FinishReduceStepsMessage $message) { $bugId = $message->getBugId(); - $this->commandRunner->run(['mbt:steps:finish-reduce', $bugId]); + + $callback = function () use ($bugId) { + $bug = $this->entityManager->find(Bug::class, $bugId, LockMode::PESSIMISTIC_WRITE); + + if (!$bug instanceof Bug) { + throw new Exception(sprintf('No bug found for id %d', $bugId)); + } + + if ($bug->getMessagesCount() > 0) { + $bug->setMessagesCount($bug->getMessagesCount() - 1); + } + + return $bug; + }; + + $bug = $this->entityManager->transactional($callback); + if ($bug instanceof Bug && 0 === $bug->getMessagesCount()) { + $this->finishReduceBug($bug->getId()); + } } } diff --git a/src/MessageHandler/ReduceBugMessageHandler.php b/src/MessageHandler/ReduceBugMessageHandler.php index 091db625..f9c6f4b4 100644 --- a/src/MessageHandler/ReduceBugMessageHandler.php +++ b/src/MessageHandler/ReduceBugMessageHandler.php @@ -2,21 +2,42 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\DBAL\LockMode; +use Doctrine\ORM\EntityManager; +use Doctrine\ORM\EntityManagerInterface; use Exception; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; +use Symfony\Component\Messenger\MessageBusInterface; +use Tienvx\Bundle\MbtBundle\Command\MessageTrait; +use Tienvx\Bundle\MbtBundle\Command\WorkflowRegisterTrait; +use Tienvx\Bundle\MbtBundle\Entity\Bug; +use Tienvx\Bundle\MbtBundle\Helper\WorkflowHelper; use Tienvx\Bundle\MbtBundle\Message\ReduceBugMessage; +use Tienvx\Bundle\MbtBundle\Reducer\ReducerManager; class ReduceBugMessageHandler implements MessageHandlerInterface { + use MessageTrait; + use WorkflowRegisterTrait; + /** - * @var CommandRunner + * @var ReducerManager */ - private $commandRunner; + private $reducerManager; - public function __construct(CommandRunner $commandRunner) - { - $this->commandRunner = $commandRunner; + /** + * @var EntityManager + */ + private $entityManager; + + public function __construct( + ReducerManager $reducerManager, + EntityManagerInterface $entityManager, + MessageBusInterface $messageBus + ) { + $this->reducerManager = $reducerManager; + $this->entityManager = $entityManager; + $this->messageBus = $messageBus; } /** @@ -26,8 +47,34 @@ public function __construct(CommandRunner $commandRunner) */ public function __invoke(ReduceBugMessage $message) { - $id = $message->getId(); + $bugId = $message->getId(); $reducer = $message->getReducer(); - $this->commandRunner->run(['mbt:bug:reduce', $id, $reducer]); + $bug = $this->entityManager->find(Bug::class, $bugId); + + if (!$bug instanceof Bug) { + throw new Exception(sprintf('No bug found for id %d', $bugId)); + } + + $workflow = WorkflowHelper::get($this->workflowRegistry, $bug->getModel()->getName()); + if (WorkflowHelper::checksum($workflow) !== $bug->getModelHash()) { + throw new Exception(sprintf('Model checksum of bug with id %d does not match', $bugId)); + } + + $reducerService = $this->reducerManager->getReducer($reducer); + $messagesCount = $reducerService->dispatch($bug); + if (0 === $messagesCount && 0 === $bug->getMessagesCount()) { + $this->finishReduceBug($bug->getId()); + } elseif ($messagesCount > 0) { + $callback = function () use ($bug, $messagesCount) { + // Reload the bug for the newest messages count. + $bug = $this->entityManager->find(Bug::class, $bug->getId(), LockMode::PESSIMISTIC_WRITE); + + if ($bug instanceof Bug) { + $bug->setMessagesCount($bug->getMessagesCount() + $messagesCount); + } + }; + + $this->entityManager->transactional($callback); + } } } diff --git a/src/MessageHandler/ReduceStepsMessageHandler.php b/src/MessageHandler/ReduceStepsMessageHandler.php index b3425da7..18d97ffe 100644 --- a/src/MessageHandler/ReduceStepsMessageHandler.php +++ b/src/MessageHandler/ReduceStepsMessageHandler.php @@ -2,21 +2,43 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\ORM\EntityManager; +use Doctrine\ORM\EntityManagerInterface; use Exception; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; +use Symfony\Component\Messenger\MessageBusInterface; +use Tienvx\Bundle\MbtBundle\Command\MessageTrait; +use Tienvx\Bundle\MbtBundle\Command\TokenTrait; +use Tienvx\Bundle\MbtBundle\Command\WorkflowRegisterTrait; +use Tienvx\Bundle\MbtBundle\Entity\Bug; +use Tienvx\Bundle\MbtBundle\Helper\WorkflowHelper; use Tienvx\Bundle\MbtBundle\Message\ReduceStepsMessage; +use Tienvx\Bundle\MbtBundle\Reducer\ReducerManager; class ReduceStepsMessageHandler implements MessageHandlerInterface { + use TokenTrait; + use WorkflowRegisterTrait; + use MessageTrait; + /** - * @var CommandRunner + * @var ReducerManager */ - private $commandRunner; + private $reducerManager; - public function __construct(CommandRunner $commandRunner) - { - $this->commandRunner = $commandRunner; + /** + * @var EntityManager + */ + protected $entityManager; + + public function __construct( + ReducerManager $reducerManager, + EntityManagerInterface $entityManager, + MessageBusInterface $messageBus + ) { + $this->reducerManager = $reducerManager; + $this->entityManager = $entityManager; + $this->messageBus = $messageBus; } /** @@ -31,6 +53,22 @@ public function __invoke(ReduceStepsMessage $message) $length = $message->getLength(); $from = $message->getFrom(); $to = $message->getTo(); - $this->commandRunner->run(['mbt:steps:reduce', $bugId, $reducer, $length, $from, $to]); + $bug = $this->entityManager->find(Bug::class, $bugId); + + if (!$bug || !$bug instanceof Bug) { + throw new Exception(sprintf('No bug found for id %d', $bugId)); + } + + $workflow = WorkflowHelper::get($this->workflowRegistry, $bug->getModel()->getName()); + if (WorkflowHelper::checksum($workflow) !== $bug->getModelHash()) { + throw new Exception(sprintf('Model checksum of bug with id %d does not match', $bugId)); + } + + $this->setAnonymousToken(); + + $reducerService = $this->reducerManager->getReducer($reducer); + $reducerService->handle($bug, $workflow, $length, $from, $to); + + $this->finishReduceSteps($bug); } } diff --git a/src/MessageHandler/RemoveScreenshotsMessageHandler.php b/src/MessageHandler/RemoveScreenshotsMessageHandler.php index 3225e413..58db29c0 100644 --- a/src/MessageHandler/RemoveScreenshotsMessageHandler.php +++ b/src/MessageHandler/RemoveScreenshotsMessageHandler.php @@ -2,21 +2,38 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\ORM\EntityManagerInterface; use Exception; +use League\Flysystem\FilesystemInterface; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; use Tienvx\Bundle\MbtBundle\Message\RemoveScreenshotsMessage; +use Tienvx\Bundle\MbtBundle\Subject\SubjectManager; class RemoveScreenshotsMessageHandler implements MessageHandlerInterface { /** - * @var CommandRunner + * @var EntityManagerInterface */ - private $commandRunner; + private $entityManager; - public function __construct(CommandRunner $commandRunner) - { - $this->commandRunner = $commandRunner; + /** + * @var SubjectManager + */ + protected $subjectManager; + + /** + * @var FilesystemInterface + */ + protected $mbtStorage; + + public function __construct( + EntityManagerInterface $entityManager, + SubjectManager $subjectManager, + FilesystemInterface $mbtStorage + ) { + $this->entityManager = $entityManager; + $this->subjectManager = $subjectManager; + $this->mbtStorage = $mbtStorage; } /** @@ -28,6 +45,9 @@ public function __invoke(RemoveScreenshotsMessage $message) { $bugId = $message->getBugId(); $model = $message->getModel(); - $this->commandRunner->run(['mbt:bug:remove-screenshots', $bugId, $model]); + + $subject = $this->subjectManager->createSubject($model); + $subject->setFilesystem($this->mbtStorage); + $subject->removeScreenshots($bugId); } } diff --git a/src/MessageHandler/ReportBugMessageHandler.php b/src/MessageHandler/ReportBugMessageHandler.php index 157685bb..b50e1b72 100644 --- a/src/MessageHandler/ReportBugMessageHandler.php +++ b/src/MessageHandler/ReportBugMessageHandler.php @@ -2,21 +2,31 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\ORM\EntityManagerInterface; use Exception; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; +use Tienvx\Bundle\MbtBundle\Entity\Bug; use Tienvx\Bundle\MbtBundle\Message\ReportBugMessage; +use Tienvx\Bundle\MbtBundle\Reporter\ReporterManager; class ReportBugMessageHandler implements MessageHandlerInterface { /** - * @var CommandRunner + * @var EntityManagerInterface */ - private $commandRunner; + private $entityManager; - public function __construct(CommandRunner $commandRunner) - { - $this->commandRunner = $commandRunner; + /** + * @var ReporterManager + */ + protected $reporterManager; + + public function __construct( + EntityManagerInterface $entityManager, + ReporterManager $reporterManager + ) { + $this->entityManager = $entityManager; + $this->reporterManager = $reporterManager; } /** @@ -28,6 +38,14 @@ public function __invoke(ReportBugMessage $message) { $bugId = $message->getBugId(); $reporter = $message->getReporter(); - $this->commandRunner->run(['mbt:bug:report', $bugId, $reporter]); + + $bug = $this->entityManager->find(Bug::class, $bugId); + + if (!$bug instanceof Bug) { + throw new Exception(sprintf('No bug found for id %d', $bugId)); + } + + $reporterService = $this->reporterManager->getReporter($reporter); + $reporterService->report($bug); } } diff --git a/src/MessageHandler/TestBugMessageHandler.php b/src/MessageHandler/TestBugMessageHandler.php index 7e6b78f3..822d55d6 100644 --- a/src/MessageHandler/TestBugMessageHandler.php +++ b/src/MessageHandler/TestBugMessageHandler.php @@ -2,21 +2,55 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\ORM\EntityManager; +use Doctrine\ORM\EntityManagerInterface; use Exception; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; +use Symfony\Component\Messenger\MessageBusInterface; +use Throwable; +use Tienvx\Bundle\MbtBundle\Command\DefaultBugTitleTrait; +use Tienvx\Bundle\MbtBundle\Command\MessageTrait; +use Tienvx\Bundle\MbtBundle\Command\SubjectTrait; +use Tienvx\Bundle\MbtBundle\Command\TokenTrait; +use Tienvx\Bundle\MbtBundle\Command\WorkflowRegisterTrait; +use Tienvx\Bundle\MbtBundle\Entity\Bug; +use Tienvx\Bundle\MbtBundle\Entity\Steps; +use Tienvx\Bundle\MbtBundle\Generator\GeneratorManager; +use Tienvx\Bundle\MbtBundle\Helper\BugHelper; +use Tienvx\Bundle\MbtBundle\Helper\StepsRunner; +use Tienvx\Bundle\MbtBundle\Helper\WorkflowHelper; use Tienvx\Bundle\MbtBundle\Message\TestBugMessage; +use Tienvx\Bundle\MbtBundle\Subject\SubjectManager; +use Tienvx\Bundle\MbtBundle\Workflow\BugWorkflow; class TestBugMessageHandler implements MessageHandlerInterface { + use TokenTrait; + use SubjectTrait; + use MessageTrait; + use WorkflowRegisterTrait; + use DefaultBugTitleTrait; + /** - * @var CommandRunner + * @var GeneratorManager */ - private $commandRunner; + private $generatorManager; - public function __construct(CommandRunner $commandRunner) - { - $this->commandRunner = $commandRunner; + /** + * @var EntityManager + */ + private $entityManager; + + public function __construct( + SubjectManager $subjectManager, + GeneratorManager $generatorManager, + EntityManagerInterface $entityManager, + MessageBusInterface $messageBus + ) { + $this->subjectManager = $subjectManager; + $this->generatorManager = $generatorManager; + $this->entityManager = $entityManager; + $this->messageBus = $messageBus; } /** @@ -27,6 +61,38 @@ public function __construct(CommandRunner $commandRunner) public function __invoke(TestBugMessage $message) { $bugId = $message->getBugId(); - $this->commandRunner->run(['mbt:bug:test', $bugId]); + $bug = $this->entityManager->find(Bug::class, $bugId); + + if (!$bug instanceof Bug) { + throw new Exception(sprintf('No bug found for id %d', $bugId)); + } + + if (BugWorkflow::CLOSED !== $bug->getStatus()) { + throw new Exception(sprintf('Can not test bug with id %d, only closed bug can be tested again', $bugId)); + } + + $workflow = WorkflowHelper::get($this->workflowRegistry, $bug->getModel()->getName()); + if (WorkflowHelper::checksum($workflow) !== $bug->getModelHash()) { + throw new Exception(sprintf('Model checksum of bug with id %d does not match', $bugId)); + } + + $subject = $this->getSubject($bug->getModel()->getName()); + $this->setAnonymousToken(); + + $recorded = new Steps(); + try { + StepsRunner::record($bug->getSteps(), $workflow, $subject, $recorded); + } catch (Throwable $throwable) { + if ($throwable->getMessage() === $bug->getBugMessage()) { + if ($recorded->getLength() < $bug->getSteps()->getLength()) { + BugHelper::updateSteps($this->entityManager, $bug, $recorded); + } + $this->applyBugTransition($bugId, BugWorkflow::REOPEN); + } else { + $this->createBug($this->defaultBugTitle, $recorded, $throwable->getMessage(), null, $bug->getModel()->getName()); + } + } finally { + $subject->tearDown(); + } } } diff --git a/src/MessageHandler/TestPredefinedCaseMessageHandler.php b/src/MessageHandler/TestPredefinedCaseMessageHandler.php index 917cfe5f..d0ec81ca 100644 --- a/src/MessageHandler/TestPredefinedCaseMessageHandler.php +++ b/src/MessageHandler/TestPredefinedCaseMessageHandler.php @@ -2,21 +2,60 @@ namespace Tienvx\Bundle\MbtBundle\MessageHandler; +use Doctrine\ORM\EntityManager; +use Doctrine\ORM\EntityManagerInterface; use Exception; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -use Tienvx\Bundle\MbtBundle\Command\CommandRunner; +use Symfony\Component\Messenger\MessageBusInterface; +use Throwable; +use Tienvx\Bundle\MbtBundle\Command\DefaultBugTitleTrait; +use Tienvx\Bundle\MbtBundle\Command\MessageTrait; +use Tienvx\Bundle\MbtBundle\Command\SubjectTrait; +use Tienvx\Bundle\MbtBundle\Command\TokenTrait; +use Tienvx\Bundle\MbtBundle\Command\WorkflowRegisterTrait; +use Tienvx\Bundle\MbtBundle\Entity\Steps; +use Tienvx\Bundle\MbtBundle\Generator\GeneratorManager; +use Tienvx\Bundle\MbtBundle\Helper\StepsRunner; +use Tienvx\Bundle\MbtBundle\Helper\WorkflowHelper; use Tienvx\Bundle\MbtBundle\Message\TestPredefinedCaseMessage; +use Tienvx\Bundle\MbtBundle\PredefinedCase\PredefinedCaseManager; +use Tienvx\Bundle\MbtBundle\Subject\SubjectManager; class TestPredefinedCaseMessageHandler implements MessageHandlerInterface { + use TokenTrait; + use SubjectTrait; + use MessageTrait; + use WorkflowRegisterTrait; + use DefaultBugTitleTrait; + /** - * @var CommandRunner + * @var GeneratorManager */ - private $commandRunner; + private $generatorManager; - public function __construct(CommandRunner $commandRunner) - { - $this->commandRunner = $commandRunner; + /** + * @var EntityManager + */ + private $entityManager; + + /** + * @var PredefinedCaseManager + */ + private $predefinedCaseManager; + + public function __construct( + SubjectManager $subjectManager, + GeneratorManager $generatorManager, + EntityManagerInterface $entityManager, + MessageBusInterface $messageBus, + PredefinedCaseManager $predefinedCaseManager + ) { + $this->subjectManager = $subjectManager; + $this->generatorManager = $generatorManager; + $this->entityManager = $entityManager; + $this->messageBus = $messageBus; + $this->predefinedCaseManager = $predefinedCaseManager; } /** @@ -26,7 +65,26 @@ public function __construct(CommandRunner $commandRunner) */ public function __invoke(TestPredefinedCaseMessage $message) { - $predefinedCase = $message->getPredefinedCase(); - $this->commandRunner->run(['mbt:predefined-case:test', $predefinedCase]); + $name = $message->getPredefinedCase(); + + if (!$this->predefinedCaseManager->has($name)) { + throw new Exception(sprintf('No pre-defined case found for name %s', $name)); + } + + $predefinedCase = $this->predefinedCaseManager->get($name); + $model = $predefinedCase->getModel()->getName(); + $workflow = WorkflowHelper::get($this->workflowRegistry, $model); + $subject = $this->getSubject($model); + + $this->setAnonymousToken(); + + $recorded = new Steps(); + try { + StepsRunner::record($predefinedCase->getSteps(), $workflow, $subject, $recorded); + } catch (Throwable $throwable) { + $this->createBug($this->defaultBugTitle, $recorded, $throwable->getMessage(), null, $model); + } finally { + $subject->tearDown(); + } } } diff --git a/tests/TestCase.php b/tests/TestCase.php index af89f9d8..771c77ce 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -28,9 +28,7 @@ protected function setUp(): void */ protected function runCommand($command) { - $command = sprintf('%s --quiet', $command); - - return $this->application->run(new StringInput($command)); + return $this->application->run(new StringInput(sprintf('%s --quiet', $command))); } protected function getApplication() diff --git a/tests/app/config/services.yaml b/tests/app/config/services.yaml index 78b97a4d..7b8e3bcd 100644 --- a/tests/app/config/services.yaml +++ b/tests/app/config/services.yaml @@ -10,5 +10,3 @@ services: Tienvx\Messenger\MemoryTransport\MemoryTransportFactory: tags: ['messenger.transport_factory'] - - Tienvx\Bundle\MbtBundle\Command\CommandRunner: '@App\Command\CommandRunner' diff --git a/tests/app/src/Command/CommandRunner.php b/tests/app/src/Command/CommandRunner.php deleted file mode 100644 index ca510135..00000000 --- a/tests/app/src/Command/CommandRunner.php +++ /dev/null @@ -1,39 +0,0 @@ -kernel); - $application->setAutoExit(false); - $map = [ - 'mbt:bug:capture-screenshots' => ['command', 'bug-id'], - 'mbt:bug:create' => ['command', 'title', 'steps', 'message', 'task-id', 'status', 'model'], - 'mbt:task:execute' => ['command', 'task-id'], - 'mbt:bug:reduce' => ['command', 'bug-id', 'reducer'], - 'mbt:steps:reduce' => ['command', 'bug-id', 'reducer', 'length', 'from', 'to'], - 'mbt:bug:report' => ['command', 'bug-id', 'reporter'], - 'mbt:task:apply-transition' => ['command', 'task-id', 'transition'], - 'mbt:bug:apply-transition' => ['command', 'bug-id', 'transition'], - 'mbt:bug:remove-screenshots' => ['command', 'bug-id', 'model'], - 'mbt:bug:finish-reduce' => ['command', 'bug-id'], - 'mbt:steps:finish-reduce' => ['command', 'bug-id'], - 'mbt:bug:test' => ['command', 'bug-id'], - 'mbt:predefined-case:test' => ['command', 'name'], - ]; - $command = $parameters[0]; - $application->run(new ArrayInput(array_combine($map[$command], $parameters))); - } -}