6 class CRM_Mailing_TokensTest
extends \CiviUnitTestCase
{
8 protected function setUp() {
9 $this->useTransaction();
11 $this->callAPISuccess('mail_settings', 'get',
12 array('api.mail_settings.create' => array('domain' => 'chaos.org')));
15 public function getExampleTokens() {
18 $cases[] = array('text/plain', 'The {mailing.id}!', ';The [0-9]+!;');
19 $cases[] = array('text/plain', 'The {mailing.name}!', ';The Example Name!;');
20 $cases[] = array('text/plain', 'The {mailing.editUrl}!', ';The http.*civicrm/mailing/send.*!;');
21 $cases[] = array('text/plain', 'To subscribe: {action.subscribeUrl}!', ';To subscribe: http.*civicrm/mailing/subscribe.*!;');
22 $cases[] = array('text/plain', 'To optout: {action.optOutUrl}!', ';To optout: http.*civicrm/mailing/optout.*!;');
23 $cases[] = array('text/plain', 'To unsubscribe: {action.unsubscribe}!', ';To unsubscribe: u\.123\.456\.abcd1234@chaos.org!;');
25 // TODO: Think about supporting dynamic tokens like "{action.subscribe.\d+}"
31 * Check that mailing-tokens are generated (given a mailing_id as input).
33 * @param string $inputTemplateFormat
34 * Ex: 'text/plain' or 'text/html'
35 * @param string $inputTemplate
36 * Ex: 'Hello, {contact.first_name}'.
37 * @param string $expectRegex
38 * @dataProvider getExampleTokens
40 public function testTokensWithMailingId($inputTemplateFormat, $inputTemplate, $expectRegex) {
41 $mailing = CRM_Core_DAO
::createTestObject('CRM_Mailing_DAO_Mailing', array(
42 'name' => 'Example Name',
44 $contact = CRM_Core_DAO
::createTestObject('CRM_Contact_DAO_Contact');
46 $p = new \Civi\Token\
TokenProcessor(Civi
::service('dispatcher'), array(
47 'mailingId' => $mailing->id
,
49 $p->addMessage('example', $inputTemplate, $inputTemplateFormat);
50 $p->addRow()->context(array(
51 'contactId' => $contact->id
,
52 'mailingJobId' => 123,
53 'mailingActionTarget' => array(
56 'email' => 'someone@example.com',
61 foreach ($p->getRows() as $row) {
62 $this->assertRegExp($expectRegex, $row->render('example'));
65 $this->assertEquals(1, $count);
69 * Check that mailing-tokens are generated (given a mailing DAO as input).
71 public function testTokensWithMailingObject() {
72 // We only need one case to see that the mailing-object works as
73 // an alternative to the mailing-id.
74 $inputTemplateFormat = 'text/plain';
75 $inputTemplate = 'To optout: {action.optOutUrl}!';
76 $expectRegex = ';To optout: http.*civicrm/mailing/optout.*!;';
78 $mailing = CRM_Core_DAO
::createTestObject('CRM_Mailing_DAO_Mailing', array(
79 'name' => 'Example Name',
81 $contact = CRM_Core_DAO
::createTestObject('CRM_Contact_DAO_Contact');
83 $p = new \Civi\Token\
TokenProcessor(Civi
::service('dispatcher'), array(
84 'mailing' => $mailing,
86 $p->addMessage('example', $inputTemplate, $inputTemplateFormat);
87 $p->addRow()->context(array(
88 'contactId' => $contact->id
,
89 'mailingJobId' => 123,
90 'mailingActionTarget' => array(
93 'email' => 'someone@example.com',
98 foreach ($p->getRows() as $row) {
99 $this->assertRegExp($expectRegex, $row->render('example'));
102 $this->assertEquals(1, $count);
106 * Check the behavior in the erroneous situation where someone uses
107 * a mailing-related token without providing a mailing ID.
109 public function testTokensWithoutMailing() {
110 // We only need one case to see that the mailing-object works as
111 // an alternative to the mailing-id.
112 $inputTemplateFormat = 'text/plain';
113 $inputTemplate = 'To optout: {action.optOutUrl}!';
115 $mailing = CRM_Core_DAO
::createTestObject('CRM_Mailing_DAO_Mailing', array(
116 'name' => 'Example Name',
118 $contact = CRM_Core_DAO
::createTestObject('CRM_Contact_DAO_Contact');
120 $p = new \Civi\Token\
TokenProcessor(Civi
::service('dispatcher'), array(
121 'mailing' => $mailing,
123 $p->addMessage('example', $inputTemplate, $inputTemplateFormat);
124 $p->addRow()->context(array(
125 'contactId' => $contact->id
,
129 $this->fail('TokenProcessor::evaluate() should have thrown an exception');
131 catch (CRM_Core_Exception
$e) {
132 $this->assertRegExp(';Cannot use action tokens unless context defines mailingJobId and mailingActionTarget;', $e->getMessage());