Skip to content
Snippets Groups Projects
Unverified Commit 5120879b authored by DaveD's avatar DaveD Committed by GitHub
Browse files

Merge pull request #21553 from eileenmcnaughton/email2

[Ref] Extend email trait test, process more sanely
parents b599743f ecb32107
Branches 4.7.9-rc
Tags 4.7.9
No related merge requests found
......@@ -37,6 +37,13 @@ trait CRM_Contact_Form_Task_EmailTrait {
*/
public $_templates;
/**
* Email addresses to send to.
*
* @var array
*/
protected $emails = [];
/**
* Store "to" contact details.
* @var array
......@@ -138,24 +145,6 @@ trait CRM_Contact_Form_Task_EmailTrait {
// are having to re-write contactIds afterwards due to this inappropriate variable setting
// If we don't have any contact IDs, use the logged in contact ID
$form->_contactIds = $form->_contactIds ?: [CRM_Core_Session::getLoggedInContactID()];
$fromEmailValues = CRM_Core_BAO_Email::getFromEmail();
if (empty($fromEmailValues)) {
CRM_Core_Error::statusBounce(ts('Your user record does not have a valid email address and no from addresses have been configured.'));
}
$form->_emails = $fromEmailValues;
$defaults = [];
$form->_fromEmails = $fromEmailValues;
if (is_numeric(key($form->_fromEmails))) {
$emailID = (int) key($form->_fromEmails);
$defaults = CRM_Core_BAO_Email::getEmailSignatureDefaults($emailID);
}
if (!Civi::settings()->get('allow_mail_from_logged_in_contact')) {
$defaults['from_email_address'] = current(CRM_Core_BAO_Domain::getNameAndEmail(FALSE, TRUE));
}
$form->setDefaults($defaults);
}
/**
......@@ -208,10 +197,8 @@ trait CRM_Contact_Form_Task_EmailTrait {
if ($to->getValue()) {
foreach ($this->getEmails($to) as $value) {
$contactId = $value['contact_id'];
$email = $value['email'];
if ($contactId) {
$this->_contactIds[] = $this->_toContactIds[] = $contactId;
$this->_toContactEmails[] = $email;
$this->_allContactIds[] = $contactId;
}
}
......@@ -269,7 +256,7 @@ trait CRM_Contact_Form_Task_EmailTrait {
$this->add('text', 'subject', ts('Subject'), ['size' => 50, 'maxlength' => 254], TRUE);
$this->add('select', 'from_email_address', ts('From'), $this->_fromEmails, TRUE);
$this->add('select', 'from_email_address', ts('From'), $this->getFromEmails(), TRUE);
CRM_Mailing_BAO_Mailing::commonCompose($this);
......@@ -353,6 +340,27 @@ trait CRM_Contact_Form_Task_EmailTrait {
CRM_Core_Resources::singleton()->addScriptFile('civicrm', 'templates/CRM/Contact/Form/Task/EmailCommon.js', 0, 'html-header');
}
/**
* Set relevant default values.
*
* @return array
*
* @throws \API_Exception
* @throws \CRM_Core_Exception
*/
public function setDefaultValues(): array {
$defaults = parent::setDefaultValues();
$fromEmails = $this->getFromEmails();
if (is_numeric(key($fromEmails))) {
$emailID = (int) key($fromEmails);
$defaults = CRM_Core_BAO_Email::getEmailSignatureDefaults($emailID);
}
if (!Civi::settings()->get('allow_mail_from_logged_in_contact')) {
$defaults['from_email_address'] = current(CRM_Core_BAO_Domain::getNameAndEmail(FALSE, TRUE));
}
return $defaults;
}
/**
* Process the form after the input has been submitted and validated.
*
......@@ -363,8 +371,6 @@ trait CRM_Contact_Form_Task_EmailTrait {
*/
public function postProcess() {
$this->bounceIfSimpleMailLimitExceeded(count($this->_contactIds));
// check and ensure that
$formValues = $this->controller->exportValues($this->getName());
$this->submit($formValues);
}
......@@ -375,7 +381,7 @@ trait CRM_Contact_Form_Task_EmailTrait {
* @param int $count
* The number of emails the user is attempting to send
*/
protected function bounceIfSimpleMailLimitExceeded($count) {
protected function bounceIfSimpleMailLimitExceeded($count): void {
$limit = Civi::settings()->get('simple_mail_limit');
if ($count > $limit) {
CRM_Core_Error::statusBounce(ts('Please do not use this task to send a lot of emails (greater than %1). Many countries have legal requirements when sending bulk emails and the CiviMail framework has opt out functionality and domain tokens to help meet these.',
......@@ -396,7 +402,7 @@ trait CRM_Contact_Form_Task_EmailTrait {
* @throws \Civi\API\Exception\UnauthorizedException
* @throws \API_Exception
*/
public function submit($formValues) {
public function submit($formValues): void {
$this->saveMessageTemplate($formValues);
$from = $formValues['from_email_address'] ?? NULL;
......@@ -421,7 +427,7 @@ trait CRM_Contact_Form_Task_EmailTrait {
if (!isset($this->_contactDetails[$contactId])) {
continue;
}
$email = $this->_toContactEmails[$key];
$email = $this->getEmail($key);
// prevent duplicate emails if same email address is selected CRM-4067
// we should allow same emails for different contacts
$details = $this->_contactDetails[$contactId];
......@@ -726,4 +732,34 @@ trait CRM_Contact_Form_Task_EmailTrait {
return NULL;
}
/**
* @return array
*/
protected function getFromEmails(): array {
$fromEmailValues = CRM_Core_BAO_Email::getFromEmail();
if (empty($fromEmailValues)) {
CRM_Core_Error::statusBounce(ts('Your user record does not have a valid email address and no from addresses have been configured.'));
}
return $fromEmailValues;
}
/**
* Get the relevant emails.
*
* @param int $index
*
* @return string
*/
protected function getEmail(int $index): string {
if (empty($this->emails)) {
$toEmails = explode(',', $this->getSubmittedValue('to'));
foreach ($toEmails as $value) {
$parts = explode('::', $value);
$this->emails[] = $parts[1];
}
}
return $this->emails[$index];
}
}
......@@ -80,19 +80,6 @@ class CRM_Contact_Form_Task_EmailCommonTest extends CiviUnitTestCase {
Civi::settings()->set('allow_mail_from_logged_in_contact', 1);
$loggedInContactID = $this->createLoggedInUser();
/* @var CRM_Contact_Form_Task_Email $form*/
$form = $this->getFormObject('CRM_Contact_Form_Task_Email');
for ($i = 0; $i < 27; $i++) {
$email = 'spy' . $i . '@secretsquirrels.com';
$contactID = $this->individualCreate(['email' => $email]);
$form->_contactIds[$contactID] = $contactID;
$form->_toContactEmails[$this->callAPISuccessGetValue('Email', ['return' => 'id', 'email' => $email])] = $email;
}
$deceasedContactID = $this->individualCreate(['is_deceased' => 1, 'email' => 'dead@example.com']);
$form->_contactIds[$deceasedContactID] = $deceasedContactID;
$form->_toContactEmails[$this->callAPISuccessGetValue('Email', ['return' => 'id', 'email' => 'dead@example.com'])] = 'dead@example.com';
$loggedInEmail = $this->callAPISuccess('Email', 'create', [
'email' => 'mickey@mouse.com',
'location_type_id' => 1,
......@@ -101,15 +88,35 @@ class CRM_Contact_Form_Task_EmailCommonTest extends CiviUnitTestCase {
'signature_text' => 'This is a test Signature',
'signature_html' => '<p>This is a test Signature</p>',
]);
$to = $form_contactIds = $form_toContactEmails = [];
for ($i = 0; $i < 27; $i++) {
$email = 'spy' . $i . '@secretsquirrels.com';
$contactID = $this->individualCreate(['email' => $email]);
$form_contactIds[$contactID] = $contactID;
$to[] = $contactID . '::' . $email;
}
$deceasedContactID = $this->individualCreate(['is_deceased' => 1, 'email' => 'dead@example.com']);
$to[] = $deceasedContactID . '::' . 'email@example.com';
/* @var CRM_Contact_Form_Task_Email $form*/
$form = $this->getFormObject('CRM_Contact_Form_Task_Email', [
'to' => implode(',', $to),
]);
$form->_contactIds = $form_contactIds;
$form->_contactIds[$deceasedContactID] = $deceasedContactID;
$form->_allContactIds = $form->_toContactIds = $form->_contactIds;
$form->_emails = [$loggedInEmail['id'] => 'mickey@mouse.com'];
$form->_fromEmails = [$loggedInEmail['id'] => 'mickey@mouse.com'];
// This rule somehow disappears if there's a form-related test before us,
// so register it again. See packages/HTML/QuickForm/file.php.
// update - actually - it's never registered. Even in form made
// I can see it missing - It's really weird.
$form->registerRule('maxfilesize', 'callback', '_ruleCheckMaxFileSize', 'HTML_QuickForm_file');
$form->isSearchContext = FALSE;
$form->buildForm();
$form->submit(array_merge($form->_defaultValues, [
// @todo - it's better to pass these into getForm
// and access them on the form using $this->getSubmittedValue().
'from_email_address' => $loggedInEmail['id'],
'subject' => 'Really interesting stuff',
'bcc_id' => $bcc,
......
<?php
/*
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC. All rights reserved. |
| |
| This work is published under the GNU AGPLv3 license with some |
| permitted exceptions and without any warranty. For full license |
| and copyright information, see https://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/
/**
* Test Email task.
*
* @package CiviCRM_APIv3
* @subpackage API_Contribution
* @group headless
*/
class CRM_Contribute_Form_Task_EmailTest extends CiviUnitTestCase {
/**
* Clean up after each test.
*
* @throws \CRM_Core_Exception
* @throws \API_Exception
*/
public function tearDown(): void {
$this->quickCleanUpFinancialEntities();
parent::tearDown();
}
/**
* Test that email tokens are rendered.
*/
public function testEmailTokens(): void {
Civi::settings()->set('max_attachments', 0);
$contact1 = $this->individualCreate();
$contact2 = $this->individualCreate();
$userID = $this->createLoggedInUser();
Civi::settings()->set('allow_mail_from_logged_in_contact', TRUE);
$this->callAPISuccess('Email', 'create', [
'contact_id' => $userID,
'email' => 'benny_jetts@example.com',
'signature_html' => 'Benny, Benny',
'is_primary' => 1,
]);
$contribution1 = $this->contributionCreate(['contact_id' => $contact2]);
$contribution2 = $this->contributionCreate(['total_amount' => 999, 'contact_id' => $contact1]);
$form = $this->getFormObject('CRM_Contribute_Form_Task_Email', [
'cc_id' => '',
'bcc_id' => '',
'to' => implode(',', [
$contact1 . '::teresajensen-nielsen65@spamalot.co.in',
$contact2 . '::bob@example.com',
]),
'subject' => '{contact.display_name}',
'text_message' => '{contribution.total_amount}',
'html_message' => '{domain.name}',
], [], [
'radio_ts' => 'ts_sel',
'task' => CRM_Core_Task::TASK_EMAIL,
'mark_x_' . $contribution1 => 1,
'mark_x_' . $contribution2 => 1,
]);
$form->set('cid', $contact1 . ',' . $contact2);
$form->buildForm();
$this->assertEquals('<br/><br/>--Benny, Benny', $form->_defaultValues['html_message']);
$form->postProcess();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment