diff --git a/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php b/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php index d0a4aa408..fe0f38f3c 100644 --- a/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php +++ b/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php @@ -435,6 +435,14 @@ abstract class ItopDataTestCase extends ItopTestCase $this->RemoveObjects($sTagClass, "SELECT $sTagClass WHERE code = '$sTagCode'"); } + public function RemoveAllObjects($sClassName) + { + $oSet = new \DBObjectSet(new \DBObjectSearch($sClassName)); + while ($oObject = $oSet->Fetch()) { + $oObject->DBDelete(); + } + } + private function RemoveObjects($sClass, $sOQL) { $oFilter = DBSearch::FromOQL($sOQL); diff --git a/tests/php-unit-tests/unitary-tests/core/TriggerOnStateEnterTest.php b/tests/php-unit-tests/unitary-tests/core/TriggerOnStateEnterTest.php new file mode 100644 index 000000000..32134c1e2 --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/core/TriggerOnStateEnterTest.php @@ -0,0 +1,91 @@ +RemoveAllObjects(\Trigger::class); + $this->RemoveAllObjects(\EventNotificationEmail::class); + } + + public function testIsTriggeredOnTransition() + { + $iTrigger = $this->GivenTriggerWithAction('TriggerOnStateEnter', 'assigned'); + $oUserRequest = $this->GivenUserRequest('new'); + + $oUserRequest->ApplyStimulus('ev_assign'); + $this->AssertTriggerExecuted($iTrigger, 1, 'The trigger should have been executed'); + + $oUserRequest->ApplyStimulus('ev_assign'); + $this->AssertTriggerExecuted($iTrigger, 1, 'The trigger should not be executed when stimulus not expected in current state'); + } + + public function testIsTriggeredOnTransitionStayingInSameState() + { + $iTrigger = $this->GivenTriggerWithAction('TriggerOnStateEnter', 'assigned'); + $oUserRequest = $this->GivenUserRequest('new'); + $oUserRequest->ApplyStimulus('ev_assign'); + + $bTransitionned = $oUserRequest->ApplyStimulus('ev_reassign'); + $this->assertTrue($bTransitionned, 'The stimulus should have been accepted'); + return; + + $this->MarkTestSkipped('This test fails because the trigger is not executed'); + $this->AssertTriggerExecuted($iTrigger, 2, 'The trigger should have been executed twice'); + } + public function testIsTriggeredOnNewObject() + { + $iTrigger = $this->GivenTriggerWithAction('TriggerOnStateEnter', 'new'); + $oUserRequest = $this->GivenUserRequest('new'); + $this->AssertTriggerExecuted($iTrigger, 0, 'The trigger TriggerOnStateEnter should not be executed on created object'); + } + + private function GivenTriggerWithAction(string $sTriggerClass, string $sState) + { + $iTrigger = $this->GivenObjectInDB($sTriggerClass, [ + 'description' => 'Description', + 'target_class' => 'UserRequest', + 'state' => $sState, + ]); + $this->GivenObjectInDB('ActionEmail', [ + 'from' => 'test@combodo.com', + 'subject' => 'Subject', + 'body' => 'Body', + 'description' => 'Description', + 'test_recipient' => 'test@combodo.com', + 'name' => 'UserRequest', + 'asynchronous' => 'yes', + 'trigger_list' => [ + "trigger_id:$iTrigger", + ], + ]); + return $iTrigger; + } + + private function AssertTriggerExecuted(int $iTrigger, $iCount, $sMessage = '') + { + $oSearch = new \DBObjectSearch('EventNotificationEmail'); + $oSearch->AddCondition('trigger_id', $iTrigger); + $oSet = new \DBObjectSet($oSearch); + $this->assertEquals($iCount, $oSet->Count(), $sMessage); + } + + public function GivenUserRequest(string $sStatus): ?\DBObject + { + $iUserRequest = $this->GivenObjectInDB('UserRequest', [ + 'title' => 'Title', + 'description' => 'Description', + 'status' => $sStatus, + ]); + return MetaModel::GetObject('UserRequest', $iUserRequest); + } +} \ No newline at end of file