public function testPostFlush()
 {
     $serializedData = 'serializedData';
     $processDefinition = new ProcessDefinition();
     $processDefinition->setRelatedEntity(self::TEST_CLASS);
     $processTrigger = new ProcessTrigger();
     $processTrigger->setDefinition($processDefinition);
     $processData = new ProcessData();
     $processData->set('test', 'value');
     $processJob = new ProcessJob();
     $processJob->setProcessTrigger($processTrigger)->setData($processData);
     $unitOfWork = $this->getMockBuilder('Doctrine\\ORM\\UnitOfWork')->disableOriginalConstructor()->getMock();
     $unitOfWork->expects($this->at(0))->method('getScheduledEntityInsertions')->will($this->returnValue(array($processJob)));
     $unitOfWork->expects($this->at(1))->method('getScheduledEntityUpdates')->will($this->returnValue(array($processJob)));
     $entityId = 1;
     $entityHash = ProcessJob::generateEntityHash(self::TEST_CLASS, $entityId);
     $this->serializer->expects($this->exactly(2))->method('serialize')->with($processJob->getData(), 'json', array('processJob' => $processJob))->will($this->returnCallback(function () use($processJob, $entityId, $serializedData) {
         $processJob->setEntityId($entityId);
         return $serializedData;
     }));
     $entityManager = $this->getMockBuilder('Doctrine\\ORM\\EntityManager')->disableOriginalConstructor()->getMock();
     $entityManager->expects($this->any())->method('getUnitOfWork')->will($this->returnValue($unitOfWork));
     $entityManager->expects($this->once())->method('flush');
     $this->listener->onFlush(new OnFlushEventArgs($entityManager));
     $this->listener->postFlush(new PostFlushEventArgs($entityManager));
     $this->assertEquals($serializedData, $processJob->getSerializedData());
     $this->assertEquals($entityId, $processJob->getEntityId());
     $this->assertEquals($entityHash, $processJob->getEntityHash());
     $this->assertFalse($processJob->getData()->isModified());
 }
 /**
  * Schedules EmailBody for processing.
  *
  * @param EmailBody $emailBody
  */
 protected function scheduleProcess(EmailBody $emailBody)
 {
     /*
      * Retrieve all process definitions to trigger
      */
     $definitions = $this->processStorage->getService()->getProcessDefinitionNames();
     $definitions = $this->getDefinitionRepository()->findBy(['name' => $definitions]);
     /*
      * Trigger process definitions with provided data
      */
     foreach ($definitions as $definition) {
         $trigger = new ProcessTrigger();
         $trigger->setDefinition($definition);
         $data = new ProcessData();
         $data->set('data', $emailBody);
         $this->handler->handleTrigger($trigger, $data);
     }
 }
 /**
  * Schedules EmailBody for processing.
  *
  * @param EmailBody $emailBody
  */
 protected function scheduleProcess(EmailBody $emailBody)
 {
     /*
      * Retrieve all process definitions to trigger
      */
     $definitions = $this->processStorage->getService()->getProcessDefinitionNames();
     $definitions = $this->getDefinitionRepository()->findBy(['name' => $definitions]);
     /*
      * Trigger process definitions with provided data
      */
     foreach ($definitions as $definition) {
         $trigger = new ProcessTrigger();
         //id must be unique otherwise in cache will be saved and runned first definition with id = null
         $trigger->setId($definition->getName());
         $trigger->setDefinition($definition);
         $data = new ProcessData();
         $data->set('data', $emailBody);
         $this->handler->handleTrigger($trigger, $data);
     }
 }
 /**
  * @param ProcessData $object
  * @param array $context
  * @dataProvider normalizeDataProvider
  */
 public function testNormalize($object, array $context)
 {
     $entity = $object['data'];
     $entityId = 1;
     $format = 'json';
     /** @var ProcessJob $processJob */
     $processJob = $context['processJob'];
     $triggerEvent = $processJob->getProcessTrigger()->getEvent();
     $normalizedData = array('serialized', 'data');
     if ($triggerEvent == ProcessTrigger::EVENT_DELETE) {
         $this->doctrineHelper->expects($this->never())->method('getSingleEntityIdentifier');
     } else {
         $this->doctrineHelper->expects($this->once())->method('getSingleEntityIdentifier')->with($entity)->will($this->returnValue($entityId));
     }
     $this->serializer->expects($this->once())->method('normalize')->with($object->getValues(), $format, $context)->will($this->returnValue($normalizedData));
     $this->assertEquals($normalizedData, $this->normalizer->normalize($object, $format, $context));
     if ($triggerEvent == ProcessTrigger::EVENT_DELETE) {
         $this->assertNull($processJob->getEntityId());
     } else {
         $this->assertEquals($entityId, $processJob->getEntityId());
     }
 }
 /**
  * @param ProcessTrigger $trigger
  * @param object $entity
  * @param mixed|null $old
  * @param mixed|null $new
  */
 protected function scheduleProcess(ProcessTrigger $trigger, $entity, $old = null, $new = null)
 {
     $entityClass = ClassUtils::getClass($entity);
     // important to set modified flag to true
     $data = new ProcessData();
     $data->set('data', $entity);
     if ($old || $new) {
         $data->set('old', $old)->set('new', $new);
     }
     if (!$this->schedulePolicy->isScheduleAllowed($trigger, $data)) {
         $this->logger->debug('Policy declined process scheduling', $trigger, $data);
         return;
     }
     $this->scheduledProcesses[$entityClass][] = array('trigger' => $trigger, 'data' => $data);
 }
 /**
  * @param array $data
  * @param bool $modified
  * @return ProcessData
  */
 protected function createProcessData(array $data, $modified = true)
 {
     $processData = new ProcessData($data);
     $processData->setModified($modified);
     return $processData;
 }
 /**
  * @param integer $count
  * @return array
  */
 protected function createProcessJobs($count)
 {
     $definition = $this->entityManager->find('OroWorkflowBundle:ProcessDefinition', LoadProcessEntities::FIRST_DEFINITION);
     $trigger = $this->entityManager->getRepository('OroWorkflowBundle:ProcessTrigger')->findOneBy(['definition' => $definition]);
     $entity = $this->getUser();
     $entityHashes = [];
     for ($i = 0; $i < $count; $i++) {
         $processData = new ProcessData();
         $processData->set('data', $entity);
         $job = new ProcessJob();
         $job->setProcessTrigger($trigger)->setEntityId($i)->setData($processData);
         $this->entityManager->persist($job);
         $entityHashes[] = $job->getEntityHash();
     }
     $this->entityManager->flush();
     return $entityHashes;
 }