public function testOnEnterWorkflowError()
 {
     $this->model->on(WorkflowEvent::beforeEnterWorkflow('Item04Workflow'), function ($event) {
         $this->eventsBefore[] = $event;
         $event->isValid = false;
     });
     $this->model->on(WorkflowEvent::afterEnterWorkflow('Item04Workflow'), function ($event) {
         $this->eventsAfter[] = $event;
     });
     verify('event handler handlers have been called', count($this->eventsBefore) == 0 && count($this->eventsAfter) == 0)->true();
     $this->model->enterWorkflow();
     verify('current status is not set', $this->model->hasWorkflowStatus())->false();
     expect('beforeChangeStatus handler has been called', count($this->eventsBefore))->equals(1);
     expect('afterChangeStatus handler has not been called', count($this->eventsAfter))->equals(0);
 }
 public function testChangeStatusEventOnSaveFails()
 {
     $this->model->on(WorkflowEvent::beforeChangeStatus('Item04Workflow/A', 'Item04Workflow/B'), function ($event) {
         $this->eventsBefore[] = $event;
         $event->isValid = false;
     });
     $this->model->on(WorkflowEvent::afterChangeStatus('Item04Workflow/A', 'Item04Workflow/B'), function ($event) {
         $this->eventsAfter[] = $event;
     });
     $this->model->enterWorkflow();
     verify('current status is set', $this->model->hasWorkflowStatus())->true();
     verify('event handlers have never been called', count($this->eventsBefore) == 0 && count($this->eventsAfter) == 0)->true();
     $this->model->status = 'Item04Workflow/B';
     verify('save fails', $this->model->save())->false();
     expect('model has not changed status', $this->model->getWorkflowStatus()->getId())->equals('Item04Workflow/A');
     expect('beforeChangeStatus handler has been called', count($this->eventsBefore))->equals(1);
     expect('afterChangeStatus handler has not been called', count($this->eventsAfter))->equals(0);
 }
 /**
  * Produces the following sequence when a model changes from status A to status B:
  *
  * - beforeLeaveStatus(A)
  * - beforeChangeStatus(A,B)
  * - beforeEnterStatus(B)
  *
  * - afterLeaveStatus(A)
  * - afterChangeStatus(A,B)
  * - afterEnterStatus(B)
  * @param Transition $transition
  * @param Object $sender
  * @return array|\yii\base\Event[]
  * @see \fproject\workflow\events\IEventSequenceScheme::createChangeStatusSequence()
  */
 public function createChangeStatusSequence($transition, $sender)
 {
     return ['before' => [new WorkflowEvent(WorkflowEvent::beforeLeaveStatus($transition->getStartStatus()->getId()), ['start' => $transition->getStartStatus(), 'sender' => $sender]), new WorkflowEvent(WorkflowEvent::beforeChangeStatus($transition->getStartStatus()->getId(), $transition->getEndStatus()->getId()), ['start' => $transition->getStartStatus(), 'end' => $transition->getEndStatus(), 'transition' => $transition, 'sender' => $sender]), new WorkflowEvent(WorkflowEvent::beforeEnterStatus($transition->getEndStatus()->getId()), ['end' => $transition->getEndStatus(), 'sender' => $sender])], 'after' => [new WorkflowEvent(WorkflowEvent::afterLeaveStatus($transition->getStartStatus()->getId()), ['start' => $transition->getStartStatus(), 'sender' => $sender]), new WorkflowEvent(WorkflowEvent::afterChangeStatus($transition->getStartStatus()->getId(), $transition->getEndStatus()->getId()), ['start' => $transition->getStartStatus(), 'end' => $transition->getEndStatus(), 'transition' => $transition, 'sender' => $sender]), new WorkflowEvent(WorkflowEvent::afterEnterStatus($transition->getEndStatus()->getId()), ['end' => $transition->getEndStatus(), 'sender' => $sender])]];
 }
 public function testReturnReportWithEventsOnEnterWorkflow()
 {
     /** @var Item04|ActiveWorkflowBehavior $model */
     $model = new Item04();
     $model->on(WorkflowEvent::beforeEnterStatus('Item04Workflow/A'), function ($event) {
         /** @var WorkflowEvent $event*/
         $event->invalidate('my error message');
     });
     $report = $model->getNextStatuses(false, true);
     $this->assertCount(1, $report);
     $this->assertArrayHasKey('Item04Workflow/A', $report);
     $this->assertInstanceOf('fproject\\workflow\\core\\Status', $report['Item04Workflow/A']['status']);
     $this->assertCount(2, $report['Item04Workflow/A']['event']);
     $this->assertEquals([0 => ['name' => 'beforeEnterWorkflow{Item04Workflow}', 'success' => null], 1 => ['name' => 'beforeEnterStatus{Item04Workflow/A}', 'success' => false, 'messages' => [0 => 'my error message']]], $report['Item04Workflow/A']['event']);
     $this->assertEquals(false, $report['Item04Workflow/A']['isValid']);
 }
Beispiel #5
0
 public function events()
 {
     return [WorkflowEvent::beforeEnterStatus('Item06Workflow/new') => "beforeNew", WorkflowEvent::afterEnterStatus('Item06Workflow/new') => "afterNew", WorkflowEvent::afterEnterStatus('Item06Workflow/correction') => "postToCorrect", WorkflowEvent::beforeLeaveStatus('Item06Workflow/correction') => "postCorrected", WorkflowEvent::beforeEnterStatus('Item06Workflow/published') => "checkCanBePublished", WorkflowEvent::beforeChangeStatus('Item06Workflow/published', 'Item06Workflow/archive') => "canBeArchived"];
 }