/**
  * Execute the default schedule, without any special recipient selections.
  *
  * @dataProvider createTestCases
  *
  * @param string $targetDate
  * @param string $setupFuncs
  * @param array $expectMessages
  *
  * @throws \Exception
  */
 public function testDefault($targetDate, $setupFuncs, $expectMessages)
 {
     $this->targetDate = $targetDate;
     foreach (explode(' ', $setupFuncs) as $setupFunc) {
         $this->{$setupFunc}();
     }
     $this->schedule->save();
     $actualMessages = array();
     foreach ($this->cronTimes() as $time) {
         \CRM_Utils_Time::setTime($time);
         $this->callAPISuccess('job', 'send_reminder', array());
         foreach ($this->mut->getAllMessages('ezc') as $message) {
             /** @var \ezcMail $message */
             $simpleMessage = array('time' => $time, 'to' => \CRM_Utils_Array::collect('email', $message->to), 'subject' => $message->subject);
             sort($simpleMessage['to']);
             $actualMessages[] = $simpleMessage;
             $this->mut->clearMessages();
         }
     }
     $errorText = "Incorrect messages: " . print_r(array('actualMessages' => $actualMessages, 'expectMessages' => $expectMessages), 1);
     $this->assertEquals(count($expectMessages), count($actualMessages), $errorText);
     usort($expectMessages, array(__CLASS__, 'compareSimpleMsgs'));
     usort($actualMessages, array(__CLASS__, 'compareSimpleMsgs'));
     foreach ($expectMessages as $offset => $expectMessage) {
         $actualMessage = $actualMessages[$offset];
         $this->assertApproxEquals(strtotime($expectMessage['time']), strtotime($actualMessage['time']), $this->dateTolerance, $errorText);
         if (isset($expectMessage['to'])) {
             sort($expectMessage['to']);
             $this->assertEquals($expectMessage['to'], $actualMessage['to'], $errorText);
         }
         if (isset($expectMessage['subject'])) {
             $this->assertRegExp($expectMessage['subject'], $actualMessage['subject'], $errorText);
         }
     }
 }
 /**
  * This generates a single mailing through the scheduled-reminder
  * system (using an activity-reminder as a baseline) and
  * checks that the resulting message satisfies various
  * regular expressions.
  *
  * @param array $schedule
  *   Values to set/override in the schedule.
  *   Ex: array('subject' => 'Hello, {contact.first_name}!').
  * @param array $patterns
  *   A list of regexes to compare with the actual email.
  *   Ex: array('subject' => '/^Hello, Alice!/').
  *   Keys: subject, body_text, body_html, from_name, from_email.
  * @dataProvider mailerExamples
  */
 public function testMailer($schedule, $patterns)
 {
     $actionSchedule = array_merge($this->fixtures['sched_activity_1day'], $schedule);
     $actionScheduleDao = CRM_Core_BAO_ActionSchedule::add($actionSchedule);
     $this->assertTrue(is_numeric($actionScheduleDao->id));
     $activity = $this->createTestObject('CRM_Activity_DAO_Activity', $this->fixtures['phonecall']);
     $this->assertTrue(is_numeric($activity->id));
     $contact = $this->callAPISuccess('contact', 'create', $this->fixtures['contact']);
     $activity->save();
     $source['contact_id'] = $contact['id'];
     $source['activity_id'] = $activity->id;
     $source['record_type_id'] = 2;
     $activityContact = $this->createTestObject('CRM_Activity_DAO_ActivityContact', $source);
     $activityContact->save();
     CRM_Utils_Time::setTime('2012-06-14 15:00:00');
     $this->callAPISuccess('job', 'send_reminder', array());
     $this->mut->assertRecipients(array(array('*****@*****.**')));
     foreach ($this->mut->getAllMessages('ezc') as $message) {
         /** @var ezcMail $message */
         $messageArray = array();
         $messageArray['subject'] = $message->subject;
         $messageArray['from_name'] = $message->from->name;
         $messageArray['from_email'] = $message->from->email;
         $messageArray['body_text'] = '--UNDEFINED--';
         $messageArray['body_html'] = '--UNDEFINED--';
         foreach ($message->fetchParts() as $part) {
             /** @var ezcMailText ezcMailText */
             if ($part instanceof ezcMailText && $part->subType == 'html') {
                 $messageArray['body_html'] = $part->text;
             }
             if ($part instanceof ezcMailText && $part->subType == 'plain') {
                 $messageArray['body_text'] = $part->text;
             }
         }
         foreach ($patterns as $field => $pattern) {
             $this->assertRegExp($pattern, $messageArray[$field], "Check that '{$field}'' matches regex. " . print_r(array('expected' => $patterns, 'actual' => $messageArray), 1));
         }
     }
     $this->mut->clearMessages();
 }