* @package Combodo\iTop\Test\UnitTest\Service\Notification * @covers \Combodo\iTop\Service\Notification\NotificationsService */ class NotificationsServiceTest extends ItopDataTestCase { public const CREATE_TEST_ORG = true; /** * @covers \Combodo\iTop\Service\Notification\NotificationsService::IsSubscribed * @return void */ public function testIsSubscribed(): void { // Prepare base data /** @var \Contact $oPerson */ $oPerson = $this->createObject(\Person::class, [ "name" => "Khalo", "first_name" => "Frida", "org_id" => $this->getTestOrgId(), ]); $iPersonID = $oPerson->GetKey(); /** @var \Location $oLocation */ $oLocation = $this->createObject(\Location::class, [ "name" => "Test location", "org_id" => $this->getTestOrgId(), ]); /** @var \Trigger $oTrigger */ $oTrigger = $this->createObject(\TriggerOnObjectCreate::class, [ "description" => "Test trigger", "subscription_policy" => SubscriptionPolicy::AllowNoChannel->value, ]); $iTriggerID = $oTrigger->GetKey(); /** @var \ActionNotification $oActionNotification */ $oActionNotification = $this->createObject(\ActionEmail::class, [ "name" => "Test action", "from" => "test@test.com", "to" => "SELECT Person WHERE id = $iPersonID", "subject" => "Test subject", "body" => "Test body", ]); $iActionNotificationID = $oActionNotification->GetKey(); $oService = NotificationsService::GetInstance(); // Case 1: Person hasn't received action so far, so it is implicitly subscribed by default // - Assert $this->assertTrue($oService->IsSubscribed($oTrigger, $oActionNotification, $oPerson)); // Case 2: Activate an action, the person should have an explicit subscription // - Prepare $oActionNotification->DoExecute($oTrigger, [ "this->object()" => $oLocation, "trigger->object()" => $oTrigger, ]); // - Assert $iSubscribedCount = NotificationsRepository::GetInstance()->SearchSubscribedSubscriptionsByTriggerContactAndAction($iTriggerID, $iActionNotificationID, $iPersonID)->Count(); $this->assertEquals(1, $iSubscribedCount, "There should be 1 explicit subscription"); $this->assertTrue($oService->IsSubscribed($oTrigger, $oActionNotification, $oPerson)); // Case 3: Unsubscribe, person should have an explicit unsubscribe // - Prepare $oSubscription = NotificationsRepository::GetInstance()->SearchSubscribedSubscriptionsByTriggerContactAndAction($iTriggerID, $iActionNotificationID, $iPersonID)->Fetch(); $oSubscription->Set('subscribed', false); $oSubscription->DBUpdate(); // - Assert $iSubscribedCount = NotificationsRepository::GetInstance()->SearchSubscribedSubscriptionsByTriggerContactAndAction($iTriggerID, $iActionNotificationID, $iPersonID)->Count(); $this->assertEquals(0, $iSubscribedCount, "There should be 0 explicit subscription"); $iUnsubscribedCount = NotificationsRepository::GetInstance()->SearchUnsubscribedSubscriptionsByTriggerContactAndAction($iTriggerID, $iActionNotificationID, $iPersonID)->Count(); $this->assertEquals(1, $iUnsubscribedCount, "There should be 1 explicit unsubscription"); $this->assertFalse($oService->IsSubscribed($oTrigger, $oActionNotification, $oPerson)); } }