From 6cb1cf7b7efbf043e4e51bb043b882990047fe78 Mon Sep 17 00:00:00 2001 From: XavierGR Date: Thu, 14 Nov 2024 09:06:41 +0100 Subject: [PATCH] =?UTF-8?q?N=C2=B07726=20-=20Fatal=20error=20if=20a=20news?= =?UTF-8?q?room=20is=20sent=20without=20any=20message?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/datamodel.core.xml | 32 +++- dictionaries/cs.dictionary.itop.core.php | 2 + dictionaries/da.dictionary.itop.core.php | 2 + dictionaries/de.dictionary.itop.core.php | 2 + dictionaries/en.dictionary.itop.core.php | 2 + dictionaries/es_cr.dictionary.itop.core.php | 2 + dictionaries/fr.dictionary.itop.core.php | 2 + dictionaries/hu.dictionary.itop.core.php | 2 + dictionaries/it.dictionary.itop.core.php | 2 + dictionaries/ja.dictionary.itop.core.php | 2 + dictionaries/nl.dictionary.itop.core.php | 2 + dictionaries/pl.dictionary.itop.core.php | 2 + dictionaries/pt_br.dictionary.itop.core.php | 2 + dictionaries/ru.dictionary.itop.core.php | 2 + dictionaries/sk.dictionary.itop.core.php | 2 + dictionaries/tr.dictionary.itop.core.php | 2 + dictionaries/zh_cn.dictionary.itop.core.php | 2 + .../src/BaseTestCase/ItopDataTestCase.php | 25 +++ .../unitary-tests/core/ActionNewsroomTest.php | 160 ++++++++++++++++++ 19 files changed, 241 insertions(+), 8 deletions(-) create mode 100644 tests/php-unit-tests/unitary-tests/core/ActionNewsroomTest.php diff --git a/core/datamodel.core.xml b/core/datamodel.core.xml index f99367904..9e599eb2b 100644 --- a/core/datamodel.core.xml +++ b/core/datamodel.core.xml @@ -355,14 +355,30 @@ } } - if ($bIsAsync === true) { - AsyncSendNewsroom::AddToQueue($this->GetKey(), $oTrigger->GetKey(), $aRecipientsIds, $sMessage, $sTitle, $sUrl, $iObjectId, $sObjectClass); - } else { - foreach ($aRecipientsIds as $iRecipientId) { - $oEvent = Combodo\iTop\Service\Notification\Event\EventNotificationNewsroomService::MakeEventFromAction($this, $iRecipientId, $oTrigger->GetKey(), $sMessage, $sTitle, $sUrl, $iObjectId, $sObjectClass); - $oEvent->DBInsertNoReload(); - } - } + try { + if ($bIsAsync === true) { + AsyncSendNewsroom::AddToQueue($this->GetKey(), $oTrigger->GetKey(), $aRecipientsIds, $sMessage, $sTitle, $sUrl, $iObjectId, $sObjectClass); + } else { + foreach ($aRecipientsIds as $iRecipientId) { + $oEvent = Combodo\iTop\Service\Notification\Event\EventNotificationNewsroomService::MakeEventFromAction($this, $iRecipientId, $oTrigger->GetKey(), $sMessage, $sTitle, $sUrl, $iObjectId, $sObjectClass); + $oEvent->DBInsertNoReload(); + } + } + } catch (CoreCannotSaveObjectException $e) { + ExceptionLog::LogException($e); + foreach($aRecipientsIds as $iRecipientId) { + $oEvent = Combodo\iTop\Service\Notification\Event\EventNotificationNewsroomService::MakeEventFromAction($this, + $iRecipientId, + $oTrigger->GetKey(), + Dict::S('Core:EventNotificationNewsroom:ErrorOnDBInsert'), + Dict::S('Core:EventNotificationNewsroom:ErrorNotificationNotSent'), + $sUrl, + $iObjectId, + $sObjectClass + ); + $oEvent->DBInsertNoReload(); + } + } $this->SetNotificationLanguage($sPreviousLanguage, $aPreviousPluginProperties['language_code'] ?? null); } diff --git a/dictionaries/cs.dictionary.itop.core.php b/dictionaries/cs.dictionary.itop.core.php index 3e95c1cc4..c43f4d475 100755 --- a/dictionaries/cs.dictionary.itop.core.php +++ b/dictionaries/cs.dictionary.itop.core.php @@ -807,6 +807,8 @@ Je-li čas vynechán, bude nastaveno 00:00:00 'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds', 'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds', 'Core:Duration_Seconds' => '%1$ds', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => 'Chybní příkaz, nebo příkaz skončil s chybou (např chybný název skriptu)', 'Core:ExecProcess:Code255' => 'PHP Error (parsing/runtime)', 'Core:ExplainWTC:ElapsedTime' => 'Uplynulý čas ("%1$s")', diff --git a/dictionaries/da.dictionary.itop.core.php b/dictionaries/da.dictionary.itop.core.php index dc26d990f..185db25be 100644 --- a/dictionaries/da.dictionary.itop.core.php +++ b/dictionaries/da.dictionary.itop.core.php @@ -806,6 +806,8 @@ If the time is omitted, it defaults to 00:00:00 'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds', 'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds', 'Core:Duration_Seconds' => '%1$ds', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => 'Forkert kommando eller kommandoen afsluttede med fejl (f.eks. forkert script navn)', 'Core:ExecProcess:Code255' => 'PHP Error (parsing, or runtime)', 'Core:ExplainWTC:ElapsedTime' => 'Time elapsed (stored as "%1$s")~~', diff --git a/dictionaries/de.dictionary.itop.core.php b/dictionaries/de.dictionary.itop.core.php index fa214dfd3..1dd0b2f68 100644 --- a/dictionaries/de.dictionary.itop.core.php +++ b/dictionaries/de.dictionary.itop.core.php @@ -808,6 +808,8 @@ Falls der Zeit-Wert weggelassen wird, ist der Standardwert 00:00:00 'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds', 'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds', 'Core:Duration_Seconds' => '%1$ds', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => 'Falscher Befehl oder Befehl mit Fehler beendet (z.B. falscher Skriptname).', 'Core:ExecProcess:Code255' => 'PHP-Fehler (Parsing oder Laufzeit)', 'Core:ExplainWTC:ElapsedTime' => 'Abgelaufene Zeit (gespeichert als \"%1$s\")', diff --git a/dictionaries/en.dictionary.itop.core.php b/dictionaries/en.dictionary.itop.core.php index 8bca06e4a..ea41deadb 100644 --- a/dictionaries/en.dictionary.itop.core.php +++ b/dictionaries/en.dictionary.itop.core.php @@ -514,6 +514,8 @@ Dict::Add('EN US', 'English', 'English', array( 'Class:EventNotificationNewsroom/Attribute:read_date+' => '', 'Class:EventNotificationNewsroom/Attribute:contact_id' => 'Contact', 'Class:EventNotificationNewsroom/Attribute:contact_id+' => '', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification', )); // diff --git a/dictionaries/es_cr.dictionary.itop.core.php b/dictionaries/es_cr.dictionary.itop.core.php index 16f7273ab..4450cdfc9 100644 --- a/dictionaries/es_cr.dictionary.itop.core.php +++ b/dictionaries/es_cr.dictionary.itop.core.php @@ -792,6 +792,8 @@ Si se omite el tiempo, por omisión es 00:00:00 'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds', 'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds', 'Core:Duration_Seconds' => '%1$ds', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => 'Comando equivocado o comando terminó con errores (ejem. nombre incorrecto de script)', 'Core:ExecProcess:Code255' => 'PHP Error (parsing, or runtime)', 'Core:ExplainWTC:ElapsedTime' => 'Tiempo transcurrido (almacenado como \"%1$s\")', diff --git a/dictionaries/fr.dictionary.itop.core.php b/dictionaries/fr.dictionary.itop.core.php index e45f7f39e..80e61b61e 100644 --- a/dictionaries/fr.dictionary.itop.core.php +++ b/dictionaries/fr.dictionary.itop.core.php @@ -835,6 +835,8 @@ Si l\'heure n\'est pas spécifiée, cela revient à 00:00:00 (minuit) 'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds', 'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds', 'Core:Duration_Seconds' => '%1$ds', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification non envoyée', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'Une erreur est survenue lors de l\'envoi de la notification', 'Core:ExecProcess:Code1' => 'Mauvaise commande ou commande se finissant avec des erreurs (e.g. mauvais nom de script)', 'Core:ExecProcess:Code255' => 'Erreur PHP (analyse de fichier, ou exécution)', 'Core:ExplainWTC:ElapsedTime' => 'Temps écoulé (enregistré dans "%1$s")', diff --git a/dictionaries/hu.dictionary.itop.core.php b/dictionaries/hu.dictionary.itop.core.php index 0f13da3f2..2c297c8b7 100755 --- a/dictionaries/hu.dictionary.itop.core.php +++ b/dictionaries/hu.dictionary.itop.core.php @@ -801,6 +801,8 @@ Ha az időpontot nem adja meg, akkor az alapértelmezett értéke 00:00:00 'Core:Duration_Hours_Minutes_Seconds' => '%1$d óra %2$d perc %3$d mp', 'Core:Duration_Minutes_Seconds' => '%1$d perc %2$d mp', 'Core:Duration_Seconds' => '%1$d mp', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => 'Helytelen parancs vagy hibásan befejezett parancs (pl. helytelen szkriptnév)', 'Core:ExecProcess:Code255' => 'PHP hiba (parsing, vagy runtime)', 'Core:ExplainWTC:ElapsedTime' => 'Eltelt idő (tárolva mint %1$s)', diff --git a/dictionaries/it.dictionary.itop.core.php b/dictionaries/it.dictionary.itop.core.php index a8c358f3d..aaa3ba74a 100644 --- a/dictionaries/it.dictionary.itop.core.php +++ b/dictionaries/it.dictionary.itop.core.php @@ -802,6 +802,8 @@ Se \'oraè omessa, di default è 00:00:00 'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$sec', 'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds', 'Core:Duration_Seconds' => '%1$ds', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => 'Comando errato o comando finito con errori (es. errato nome dello script)', 'Core:ExecProcess:Code255' => 'Errore PHP (parsing o runtime)', 'Core:ExplainWTC:ElapsedTime' => 'Tempo trascorso (memorizzato come \"%1$s\")', diff --git a/dictionaries/ja.dictionary.itop.core.php b/dictionaries/ja.dictionary.itop.core.php index 82e19a181..636535713 100644 --- a/dictionaries/ja.dictionary.itop.core.php +++ b/dictionaries/ja.dictionary.itop.core.php @@ -812,6 +812,8 @@ Operators:
'Core:ExplainWTC:StopWatch-TimeSpent' => 'Time spent for "%1$s"~~', 'Core:FriendlyName-Description' => 'Friendly name', 'Core:FriendlyName-Label' => 'Name', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:Placeholder:CannotBeResolved' => '(%1$s : cannot be resolved)~~', 'Core:SyncDataExchangeComment' => '(データ同期)', 'Core:SyncDataSourceAccessRestriction' => '管理者またはデータ·ソースに指定されたユーザーのみ、この操作を実行することができます。操作はキャンセルされました。', diff --git a/dictionaries/nl.dictionary.itop.core.php b/dictionaries/nl.dictionary.itop.core.php index 7c4e514bb..6d6e29552 100644 --- a/dictionaries/nl.dictionary.itop.core.php +++ b/dictionaries/nl.dictionary.itop.core.php @@ -804,6 +804,8 @@ Hier wordt standaard \'00:00:00\' van gemaakt als er geen tijd wordt opgegeven. 'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds', 'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds', 'Core:Duration_Seconds' => '%1$ds', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => 'Verkeerde commando of commando beëindigd met fouten (bijvoorbeeld verkeerde scriptnaam)', 'Core:ExecProcess:Code255' => 'PHP Error (parsing, of runtime)', 'Core:ExplainWTC:ElapsedTime' => 'Tijd voorbij (opgeslagen als "%1$s")', diff --git a/dictionaries/pl.dictionary.itop.core.php b/dictionaries/pl.dictionary.itop.core.php index afac1a3cf..11f5ec951 100644 --- a/dictionaries/pl.dictionary.itop.core.php +++ b/dictionaries/pl.dictionary.itop.core.php @@ -803,6 +803,8 @@ Jeśli czas zostanie pominięty, domyślnie to 00:00:00 'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds', 'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds', 'Core:Duration_Seconds' => '%1$ds', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => 'Niewłaściwe polecenie lub polecenie zakończone błędami (np. zła nazwa skryptu)', 'Core:ExecProcess:Code255' => 'Błąd PHP (parsowanie lub środowisko uruchomieniowe)', 'Core:ExplainWTC:ElapsedTime' => 'Czas, który upłynął (przechowywany jako "%1$s")', diff --git a/dictionaries/pt_br.dictionary.itop.core.php b/dictionaries/pt_br.dictionary.itop.core.php index 340b8a643..1f04ff704 100644 --- a/dictionaries/pt_br.dictionary.itop.core.php +++ b/dictionaries/pt_br.dictionary.itop.core.php @@ -801,6 +801,8 @@ Se o tempo for omitido, o padrão é 00:00:00 'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds', 'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds', 'Core:Duration_Seconds' => '%1$ds', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => 'Comando incorreto ou comando terminou com erros (por exemplo, nome do script errado)', 'Core:ExecProcess:Code255' => 'Erro PHP (parsing, ou runtime)', 'Core:ExplainWTC:ElapsedTime' => 'Tempo decorrido (armazenado como \"%1$s\")', diff --git a/dictionaries/ru.dictionary.itop.core.php b/dictionaries/ru.dictionary.itop.core.php index 816c20f50..cac2d6edc 100644 --- a/dictionaries/ru.dictionary.itop.core.php +++ b/dictionaries/ru.dictionary.itop.core.php @@ -806,6 +806,8 @@ If omitted the From (label) is used.~~', 'Core:Duration_Hours_Minutes_Seconds' => '%1$d ч %2$d мин %3$d с', 'Core:Duration_Minutes_Seconds' => '%1$d мин %2$d с', 'Core:Duration_Seconds' => '%1$d с', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => 'Неверная команда или команда завершена с ошибкой (возможно, неверное имя скрипта)', 'Core:ExecProcess:Code255' => 'Ошибка PHP (parsing, or runtime)', 'Core:ExplainWTC:ElapsedTime' => 'Time elapsed (stored as "%1$s")', diff --git a/dictionaries/sk.dictionary.itop.core.php b/dictionaries/sk.dictionary.itop.core.php index 784039d88..83a8251b4 100644 --- a/dictionaries/sk.dictionary.itop.core.php +++ b/dictionaries/sk.dictionary.itop.core.php @@ -825,6 +825,8 @@ Ak je čas vynechaný, predvolený čas je 00:00:00 'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds', 'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds', 'Core:Duration_Seconds' => '%1$ds', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => 'Nesprávny príkaz alebo príkaz skončil s chybami (napr. nesprávne meno skriptu)', 'Core:ExecProcess:Code255' => 'PHP chyba (pri parsovaní, alebo počas behu)', 'Core:ExplainWTC:ElapsedTime' => 'Time elapsed (stored as "%1$s")~~', diff --git a/dictionaries/tr.dictionary.itop.core.php b/dictionaries/tr.dictionary.itop.core.php index 9df114c0b..95226c149 100644 --- a/dictionaries/tr.dictionary.itop.core.php +++ b/dictionaries/tr.dictionary.itop.core.php @@ -806,6 +806,8 @@ If the time is omitted, it defaults to 00:00:00 'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds', 'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds', 'Core:Duration_Seconds' => '%1$ds', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => 'Yanlış komut veya komut hataları ile bitti (örneğin, yanlış senaryo adı)', 'Core:ExecProcess:Code255' => 'PHP hatası (ayrıştırma veya çalışma zamanı)', 'Core:ExplainWTC:ElapsedTime' => 'Geçen zaman (\"%1$s\" olarak saklanır)', diff --git a/dictionaries/zh_cn.dictionary.itop.core.php b/dictionaries/zh_cn.dictionary.itop.core.php index a6406d76d..3fa64b0af 100644 --- a/dictionaries/zh_cn.dictionary.itop.core.php +++ b/dictionaries/zh_cn.dictionary.itop.core.php @@ -822,6 +822,8 @@ Operators:
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds', 'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds', 'Core:Duration_Seconds' => '%1$ds', + 'Core:EventNotificationNewsroom:ErrorNotificationNotSent' => 'Notification not sent~~', + 'Core:EventNotificationNewsroom:ErrorOnDBInsert' => 'An error occurred while saving the notification~~', 'Core:ExecProcess:Code1' => '命令错误或命令执行出错 (例如错误的脚本名称)', 'Core:ExecProcess:Code255' => 'PHP错误 (解析, 或运行时)', 'Core:ExplainWTC:ElapsedTime' => '耗时 (储存为 "%1$s")', diff --git a/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php b/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php index c682070cf..c48f5d695 100644 --- a/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php +++ b/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php @@ -18,6 +18,8 @@ use CMDBObject; use CMDBSource; use Combodo\iTop\Service\Events\EventService; use Contact; +use CoreException; +use CoreUnexpectedValue; use DBObject; use DBObjectSet; use DBSearch; @@ -29,6 +31,9 @@ use lnkContactToFunctionalCI; use lnkContactToTicket; use lnkFunctionalCIToTicket; use MetaModel; +use MissingQueryArgument; +use MySQLException; +use MySQLHasGoneAwayException; use Person; use PluginManager; use Server; @@ -1439,4 +1444,24 @@ abstract class ItopDataTestCase extends ItopTestCase self::markTestSkipped("Test skipped: module '$sModule' is not present"); } } + + /** + * @throws CoreException + * @throws CoreUnexpectedValue + * @throws ArchivedObjectException + * @throws MissingQueryArgument + * @throws MySQLException + * @throws MySQLHasGoneAwayException + * @throws Exception + */ + protected function AssertUniqueObjectInDB(string $sClass, array $aCriteria, string $sMessage = ''): void + { + $oSearch = new \DBObjectSearch($sClass); + foreach($aCriteria as $sAttCode => $value) + { + $oSearch->AddCondition($sAttCode, $value); + } + $oSet = new DBObjectSet($oSearch); + $this->assertEquals(1, $oSet->Count(), $sMessage); + } } diff --git a/tests/php-unit-tests/unitary-tests/core/ActionNewsroomTest.php b/tests/php-unit-tests/unitary-tests/core/ActionNewsroomTest.php new file mode 100644 index 000000000..d630736e3 --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/core/ActionNewsroomTest.php @@ -0,0 +1,160 @@ + +// + +namespace Combodo\iTop\Test\UnitTest\Core; + +use ArchivedObjectException; +use Combodo\iTop\Test\UnitTest\ItopDataTestCase; +use CoreException; +use CoreUnexpectedValue; +use DBObjectSearch; +use DBObjectSet; +use Exception; +use MetaModel; +use MissingQueryArgument; +use MySQLException; +use MySQLHasGoneAwayException; + + +class ActionNewsroomTest extends ItopDataTestCase +{ + const CREATE_TEST_ORG = true; + private int $iTrigger; + private int $iRecipientId; + + protected function setUp(): void + { + parent::setUp(); + $this->iTrigger = $this->GivenObjectInDB('TriggerOnObjectCreate', + array( + 'description' => '[TEST] TriggerOnObjectCreate', + 'target_class' => 'UserRequest', + ) + ); + $this->iRecipientId = $this->GivenPersonInDB(1); + } + + private function ActionNewsroomProvider(): array + { + return [ + 'With Sync ActionNewsroom' => ['bIsAsynchronous' => false], + 'With Async ActionNewsroom' => ['bIsAsynchronous' => true] + ]; + } + + /** + * @throws CoreException + * @throws MissingQueryArgument + * @throws CoreUnexpectedValue + * @throws ArchivedObjectException + * @throws MySQLException + * @throws MySQLHasGoneAwayException + * @throws Exception + */ + public function testActionNewsroomRecordsEvent() + { + $iActionNewsroomId = $this->GivenActionNewsroomInDB(false, 'Body of the notification'); + + $this->CreateUserRequest(1, + [ + 'title' => '[TEST] ActionNewsroom', + 'org_id' => $this->getTestOrgId(), + 'caller_id' => $this->iRecipientId, + 'description' => 'PHPUnit Test', + ] + ); + + $this->AssertUniqueObjectInDB( + 'EventNotificationNewsroom', + [ + 'action_id' => $iActionNewsroomId, + 'message' => 'Body of the notification', + 'title' => 'Title' + ] + ); + } + + /** + * @dataProvider ActionNewsroomProvider + * @return void + * @throws Exception + */ + public function testActionNewsroomRecordsSpecificEventIfAMandatoryFieldIsEmpty(bool $bIsAsynchronous) + { + $iActionNewsroomId = $this->GivenActionNewsroomInDB($bIsAsynchronous, '$this->service_name$'); + + $this->CreateUserRequest(1, + [ + 'title' => '[TEST] ActionNewsroom', + 'org_id' => $this->getTestOrgId(), + 'caller_id' => $this->iRecipientId, + 'description' => 'PHPUnit Test', + 'service_id' => 0 + ] + ); + + $this->AssertUniqueObjectInDB( + 'EventNotificationNewsroom', + [ + 'action_id' => $iActionNewsroomId, + 'title' => 'Notification not sent', + 'message' => 'An error occurred while saving the notification' + ] + ); + } + + /** + * @throws Exception + */ + private function GivenActionNewsroomInDB(bool $bIsAsynchronous, string $sMessage): int + { + $this->GivenObjectInDB('UserLocal', [ + 'login' => 'demo_test_'.uniqid(__CLASS__, true), + 'password' => 'admin_123', + 'language' => 'EN US', + 'profile_list' => ['profileid:'.self::$aURP_Profiles['Administrator']], + 'contactid' => $this->iRecipientId + ]); + + return $this->GivenObjectInDB('ActionNewsroom', [ + 'name' => 'ActionNewsroom TriggerOnObjectCreate', + 'status' => 'test', + 'test_recipient_id' => $this->iRecipientId, + 'title' => 'Title', + 'message' => $sMessage, + 'recipients' => "SELECT Person WHERE id = $this->iRecipientId", + 'asynchronous' => $bIsAsynchronous ? 'yes' : 'no', + 'trigger_list' => [ + "trigger_id:$this->iTrigger" + ], + ]); + } + + /** + * @throws Exception + */ + private function GivenService(string $sName): int + { + return $this->GivenObjectInDB('Service', [ + 'name' => $sName, + 'org_id' => $this->getTestOrgId() + ] + ); + } +} \ No newline at end of file