From 6d93344eef2a43772e3042d6b337fdd76496e8dc Mon Sep 17 00:00:00 2001 From: Eileen McNaughton Date: Wed, 5 Oct 2022 14:56:58 +0100 Subject: [PATCH] Add unit test for GroupTokens --- CRM/Mailing/Event/BAO/Confirm.php | 17 ++-- CRM/Mailing/Event/BAO/Subscribe.php | 4 +- Civi/Core/Container.php | 4 + Civi/Test/ContactTestTrait.php | 2 +- tests/phpunit/CRM/Mailing/BAO/ConfirmTest.php | 80 +++++++++++++++++++ .../CRM/Mailing/BAO/MailingJobTest.php | 2 +- tests/phpunit/CRM/Mailing/BAO/MailingTest.php | 23 +++--- 7 files changed, 107 insertions(+), 25 deletions(-) create mode 100644 tests/phpunit/CRM/Mailing/BAO/ConfirmTest.php diff --git a/CRM/Mailing/Event/BAO/Confirm.php b/CRM/Mailing/Event/BAO/Confirm.php index 79a61fe090..8a446143d2 100644 --- a/CRM/Mailing/Event/BAO/Confirm.php +++ b/CRM/Mailing/Event/BAO/Confirm.php @@ -36,9 +36,10 @@ class CRM_Mailing_Event_BAO_Confirm extends CRM_Mailing_Event_DAO_Confirm { * * @return bool * True on success + * @throws \CRM_Core_Exception */ - public static function confirm($contact_id, $subscribe_id, $hash) { - $se = &CRM_Mailing_Event_BAO_Subscribe::verify( + public static function confirm(int $contact_id, int $subscribe_id, string $hash) { + $se = CRM_Mailing_Event_BAO_Subscribe::verify( $contact_id, $subscribe_id, $hash @@ -52,7 +53,7 @@ class CRM_Mailing_Event_BAO_Confirm extends CRM_Mailing_Event_DAO_Confirm { // if so, we should ignore this request and hence avoid sending multiple // emails - CRM-11157 $details = CRM_Contact_BAO_GroupContact::getMembershipDetail($contact_id, $se->group_id); - if ($details && $details->status == 'Added') { + if ($details && $details->status === 'Added') { // This contact is already subscribed // lets return the group title return CRM_Core_DAO::getFieldValue( @@ -79,9 +80,9 @@ class CRM_Mailing_Event_BAO_Confirm extends CRM_Mailing_Event_DAO_Confirm { $transaction->commit(); - list($domainEmailName, $domainEmailAddress) = CRM_Core_BAO_Domain::getNameAndEmail(); + [$domainEmailName, $domainEmailAddress] = CRM_Core_BAO_Domain::getNameAndEmail(); - list($display_name, $email) = CRM_Contact_BAO_Contact_Location::getEmailDetails($se->contact_id); + [$display_name, $email] = CRM_Contact_BAO_Contact_Location::getEmailDetails($se->contact_id); $group = new CRM_Contact_DAO_Group(); $group->id = $se->group_id; @@ -118,12 +119,12 @@ class CRM_Mailing_Event_BAO_Confirm extends CRM_Mailing_Event_DAO_Confirm { $tokenProcessor = new TokenProcessor(\Civi::dispatcher(), [ 'controller' => __CLASS__, 'smarty' => FALSE, - 'schema' => ['contactId'], + 'schema' => ['contactId', 'groupId'], ]); $tokenProcessor->addMessage('body_html', $html, 'text/html'); $tokenProcessor->addMessage('body_text', $text, 'text/plain'); - $tokenProcessor->addRow(['contactId' => $contact_id]); + $tokenProcessor->addRow(['contactId' => $contact_id, 'groupId' => $group->id]); $tokenProcessor->evaluate(); $html = $tokenProcessor->getRow(0)->render('body_html'); $text = $tokenProcessor->getRow(0)->render('body_text'); @@ -140,7 +141,7 @@ class CRM_Mailing_Event_BAO_Confirm extends CRM_Mailing_Event_DAO_Confirm { 'text' => $text, ]; // send - ignore errors because the desired status change has already been successful - $unused_result = CRM_Utils_Mail::send($mailParams); + CRM_Utils_Mail::send($mailParams); return $group->title; } diff --git a/CRM/Mailing/Event/BAO/Subscribe.php b/CRM/Mailing/Event/BAO/Subscribe.php index 5c9044b2bc..7c59da9d6d 100644 --- a/CRM/Mailing/Event/BAO/Subscribe.php +++ b/CRM/Mailing/Event/BAO/Subscribe.php @@ -151,7 +151,7 @@ SELECT civicrm_email.id as email_id * @return object|null * The subscribe event object, or null on failure */ - public static function &verify($contact_id, $subscribe_id, $hash) { + public static function verify(int $contact_id, int $subscribe_id, $hash) { $success = NULL; $se = new CRM_Mailing_Event_BAO_Subscribe(); $se->contact_id = $contact_id; @@ -175,7 +175,7 @@ SELECT civicrm_email.id as email_id $domain = CRM_Core_BAO_Domain::getDomain(); //get the default domain email address. - list($domainEmailName, $domainEmailAddress) = CRM_Core_BAO_Domain::getNameAndEmail(); + [$domainEmailName, $domainEmailAddress] = CRM_Core_BAO_Domain::getNameAndEmail(); $localpart = CRM_Core_BAO_MailSettings::defaultLocalpart(); $emailDomain = CRM_Core_BAO_MailSettings::defaultDomain(); diff --git a/Civi/Core/Container.php b/Civi/Core/Container.php index 2590876664..23e2639a6b 100644 --- a/Civi/Core/Container.php +++ b/Civi/Core/Container.php @@ -363,6 +363,10 @@ class Container { 'CRM_Contribute_RecurTokens', [] ))->addTag('kernel.event_subscriber')->setPublic(TRUE); + $container->setDefinition('crm_group_tokens', new Definition( + 'CRM_Core_GroupTokens', + [] + ))->addTag('kernel.event_subscriber')->setPublic(TRUE); $container->setDefinition('crm_domain_tokens', new Definition( 'CRM_Core_DomainTokens', [] diff --git a/Civi/Test/ContactTestTrait.php b/Civi/Test/ContactTestTrait.php index 1aced05b67..80b3a5b48b 100644 --- a/Civi/Test/ContactTestTrait.php +++ b/Civi/Test/ContactTestTrait.php @@ -191,7 +191,7 @@ trait ContactTestTrait { * @return int * groupId of created group */ - public function groupCreate($params = []) { + public function groupCreate(array $params = []): int { $params = array_merge([ 'name' => 'Test Group 1', 'domain_id' => 1, diff --git a/tests/phpunit/CRM/Mailing/BAO/ConfirmTest.php b/tests/phpunit/CRM/Mailing/BAO/ConfirmTest.php new file mode 100644 index 0000000000..d1c439545e --- /dev/null +++ b/tests/phpunit/CRM/Mailing/BAO/ConfirmTest.php @@ -0,0 +1,80 @@ +quickCleanup(['civicrm_group', 'civicrm_group_contact', 'civicrm_mailing', 'civicrm_mailing_group', 'civicrm_mailing_event_subscribe']); + parent::tearDown(); + } + + /** + * Test confirm function, with group token. + * + * @throws CRM_Core_Exception + */ + public function testConfirm(): void { + $mailUtil = new CiviMailUtils($this); + $contactID = $this->individualCreate(); + $groupID = Group::create()->setValues([ + 'name' => 'Test Group', + 'title' => 'Test Group', + 'frontend_title' => 'Test Group', + ])->execute()->first()['id']; + GroupContact::create()->setValues(['contact_id' => $contactID, 'status' => 'Added', 'group_id' => $groupID])->execute(); + SubscriptionHistory::create()->setValues([ + 'contact_id' => $contactID, + 'group_id' => $groupID, + 'method' => 'Email', + ])->execute(); + $mailingID = Mailing::create()->execute()->first()['id']; + MailingGroup::create()->setValues([ + 'mailing_id' => $mailingID, + 'group_type' => 'Include', + 'entity_table' => 'civicrm_group', + 'entity_id' => $groupID, + ])->execute()->first()['id']; + + $mailingComponentID = $this->callAPISuccess('MailingComponent', 'get', ['component_type' => 'Welcome'])['id']; + $this->callAPISuccess('MailingComponent', 'create', [ + // Swap {welcome.group} to {group.frontend_title} which is the standardised token. + // The intent is to make this version the default, but need to ensure it is required. + 'body_html' => 'Welcome. Your subscription to the {group.frontend_title} mailing list has been activated.', + 'body_text' => 'Welcome. Your subscription to the {group.frontend_title} mailing list has been activated.', + 'id' => $mailingComponentID, + ]); + $hash = 4; + CRM_Core_DAO::executeQuery(" + INSERT INTO civicrm_mailing_event_subscribe (group_id, contact_id, hash) VALUES ($groupID, $contactID, $hash) + "); + + CRM_Mailing_Event_BAO_Confirm::confirm($contactID, 1, $hash); + $mailUtil->checkAllMailLog([ + 'From: "FIXME" ', + 'To: "Mr. Anthony Anderson II" ', + 'Subject: Your Subscription has been Activated', + 'Welcome. Your subscription to the Test Group mailing list has been activated.', + ]); + } + +} diff --git a/tests/phpunit/CRM/Mailing/BAO/MailingJobTest.php b/tests/phpunit/CRM/Mailing/BAO/MailingJobTest.php index 04f4e8b300..85e9b1f1bb 100644 --- a/tests/phpunit/CRM/Mailing/BAO/MailingJobTest.php +++ b/tests/phpunit/CRM/Mailing/BAO/MailingJobTest.php @@ -20,7 +20,7 @@ class CRM_Mailing_BAO_MailingJobTest extends CiviUnitTestCase { /** * Tests CRM_Mailing_BAO_MailingJob::isTemporaryError() method. */ - public function testIsTemporaryError() { + public function testIsTemporaryError(): void { $testcases[] = ['return' => TRUE, 'message' => 'Failed to set sender: test@example.org [SMTP: Invalid response code received from SMTP server while sending email. This is often caused by a misconfiguration in Outbound Email settings. Please verify the settings at Administer CiviCRM >> Global Settings >> Outbound Email (SMTP). (code: 421, response: Timeout waiting for data from client.)]']; $testcases[] = ['return' => TRUE, 'message' => 'Failed to send data [SMTP: Invalid response code received from SMTP server while sending email. This is often caused by a misconfiguration in Outbound Email settings. Please verify the settings at Administer CiviCRM >> Global Settings >> Outbound Email (SMTP). (code: 454, response: Throttling failure: Maximum sending rate exceeded.)]']; $testcases[] = ['return' => TRUE, 'message' => 'Failed to set sender: test@example.org [SMTP: Failed to write to socket: not connected (code: -1, response: )]']; diff --git a/tests/phpunit/CRM/Mailing/BAO/MailingTest.php b/tests/phpunit/CRM/Mailing/BAO/MailingTest.php index bcea77dc58..93d2289539 100644 --- a/tests/phpunit/CRM/Mailing/BAO/MailingTest.php +++ b/tests/phpunit/CRM/Mailing/BAO/MailingTest.php @@ -55,9 +55,10 @@ class CRM_Mailing_BAO_MailingTest extends CiviUnitTestCase { * @param $mailingID * @param $groupID * @param string $type + * * @return array|int */ - private function createMailingGroup($mailingID, $groupID, $type = 'Include') { + private function createMailingGroup($mailingID, $groupID, string $type = 'Include') { return $this->callAPISuccess('MailingGroup', 'create', [ 'mailing_id' => $mailingID, 'group_type' => $type, @@ -69,7 +70,7 @@ class CRM_Mailing_BAO_MailingTest extends CiviUnitTestCase { /** * Test to ensure that using ACL permitted contacts are correctly fetched for bulk mailing */ - public function testgetRecipientsUsingACL() { + public function testgetRecipientsUsingACL(): void { $this->prepareForACLs(); $this->createLoggedInUser(); // create hook to build ACL where clause which choses $this->allowedContactId as the only contact to be considered as mail recipient @@ -77,7 +78,7 @@ class CRM_Mailing_BAO_MailingTest extends CiviUnitTestCase { CRM_Core_Config::singleton()->userPermissionClass->permissions = ['access CiviCRM', 'view my contact']; // Create dummy group and assign 2 contacts - $name = 'Test static group ' . substr(sha1(rand()), 0, 7); + $name = 'Test static group 1'; $groupID = $this->groupCreate([ 'name' => $name, 'title' => $name, @@ -111,20 +112,16 @@ class CRM_Mailing_BAO_MailingTest extends CiviUnitTestCase { } /** - * Test mailing receipients when using previous mailing as include and contact is in exclude as well + * Test mailing recipients when using previous mailing as include and contact is in exclude as well */ - public function testMailingIncludePreviousMailingExcludeGroup() { - $groupName = 'Test static group ' . substr(sha1(rand()), 0, 7); - $groupName2 = 'Test static group 2' . substr(sha1(rand()), 0, 7); + public function testMailingIncludePreviousMailingExcludeGroup(): void { $groupID = $this->groupCreate([ - 'name' => $groupName, - 'title' => $groupName, - 'is_active' => 1, + 'name' => 'Test static group 1', + 'title' => 'Test static group 1', ]); $groupID2 = $this->groupCreate([ - 'name' => $groupName2, - 'title' => $groupName2, - 'is_active' => 1, + 'name' => 'Test static group 2', + 'title' => 'Test static group 2', ]); $contactID = $this->individualCreate([], 0); $contactID2 = $this->individualCreate([], 2); -- 2.25.1