예제 #1
0
 public function testSequence()
 {
     $actStatuses = array_flip(\CRM_Core_PseudoConstant::activityStatus('name'));
     $caseStatuses = array_flip(\CRM_Case_PseudoConstant::caseStatus('name'));
     // Create case; schedule first activity
     \CRM_Utils_Time::setTime('2013-11-30 01:00:00');
     $case = $this->callAPISuccess('case', 'create', $this->_params);
     $analyzer = new \Civi\CCase\Analyzer($case['id']);
     $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id'));
     $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time'));
     $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id'));
     $this->assertFalse($analyzer->hasActivity('Mental health evaluation'));
     $this->assertFalse($analyzer->hasActivity('Secure temporary housing'));
     // Edit details of first activity -- but don't finish it yet!
     \CRM_Utils_Time::setTime('2013-11-30 01:30:00');
     $this->callApiSuccess('Activity', 'create', array('id' => self::ag($analyzer->getSingleActivity('Medical evaluation'), 'id'), 'subject' => 'This is the new subject'));
     $analyzer = new \Civi\CCase\Analyzer($case['id']);
     $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id'));
     $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time'));
     $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id'));
     $this->assertFalse($analyzer->hasActivity('Mental health evaluation'));
     $this->assertFalse($analyzer->hasActivity('Secure temporary housing'));
     // Complete first activity; schedule second
     \CRM_Utils_Time::setTime('2013-11-30 02:00:00');
     $this->callApiSuccess('Activity', 'create', array('id' => self::ag($analyzer->getSingleActivity('Medical evaluation'), 'id'), 'status_id' => $actStatuses['Completed']));
     $analyzer->flush();
     $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id'));
     $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time'));
     $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id'));
     $this->assertApproxTime('2013-11-30 02:00:00', self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'activity_date_time'));
     $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'status_id'));
     $this->assertFalse($analyzer->hasActivity('Secure temporary housing'));
     // Complete second activity; schedule third
     \CRM_Utils_Time::setTime('2013-11-30 03:00:00');
     $this->callApiSuccess('Activity', 'create', array('id' => self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'id'), 'status_id' => $actStatuses['Completed']));
     $analyzer->flush();
     $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id'));
     $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time'));
     $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id'));
     $this->assertApproxTime('2013-11-30 02:00:00', self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'activity_date_time'));
     $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'status_id'));
     $this->assertApproxTime('2013-11-30 03:00:00', self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'activity_date_time'));
     $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'status_id'));
     // Complete third activity; close case
     \CRM_Utils_Time::setTime('2013-11-30 04:00:00');
     $this->callApiSuccess('Activity', 'create', array('id' => self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'id'), 'status_id' => $actStatuses['Completed']));
     $analyzer->flush();
     $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time'));
     $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id'));
     $this->assertApproxTime('2013-11-30 02:00:00', self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'activity_date_time'));
     $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'status_id'));
     $this->assertApproxTime('2013-11-30 03:00:00', self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'activity_date_time'));
     $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'status_id'));
     $this->assertEquals($caseStatuses['Closed'], self::ag($analyzer->getCase(), 'status_id'));
     // */
 }
 /**
  * @param null $now
  * @param array $params
  *
  * @return array
  */
 static function processQueue($now = NULL, $params = array())
 {
     $now = $now ? CRM_Utils_Time::setTime($now) : CRM_Utils_Time::getTime();
     $mappings = self::getMapping();
     foreach ($mappings as $mappingID => $mapping) {
         self::buildRecipientContacts($mappingID, $now, $params);
         self::sendMailings($mappingID, $now);
     }
     $result = array('is_error' => 0, 'messages' => ts('Sent all scheduled reminders successfully'));
     return $result;
 }
예제 #3
0
 /**
  * First download of new doc is OK.
  * The update fails (due to some bad web response).
  * The old data is retained in the cache.
  * The failure eventually expires.
  * A new update succeeds.
  *
  * @dataProvider badWebResponses
  * @param array $badWebResponse
  *   Description of a web request that returns some kind of failure.
  */
 public function testGetDocument_NewOK_UpdateFailure_CacheOK_UpdateOK($badWebResponse)
 {
     $this->assertNotEmpty($badWebResponse);
     // first try, good response
     CRM_Utils_Time::setTime('2013-03-01 10:00:00');
     $communityMessages = new CRM_Core_CommunityMessages($this->cache, $this->expectOneHttpRequest(self::$webResponses['first-valid-response']));
     $doc1 = $communityMessages->getDocument();
     $this->assertEquals('<h1>First valid response</h1>', $doc1['messages'][0]['markup']);
     $this->assertApproxEquals(strtotime('2013-03-01 10:10:00'), $doc1['expires'], self::APPROX_TIME_EQUALITY);
     // second try, $doc1 has expired; bad response; keep old data
     CRM_Utils_Time::setTime('2013-03-01 12:00:02');
     // more than 2 hours later (DEFAULT_RETRY)
     $communityMessages = new CRM_Core_CommunityMessages($this->cache, $this->expectOneHttpRequest($badWebResponse));
     $doc2 = $communityMessages->getDocument();
     $this->assertEquals('<h1>First valid response</h1>', $doc2['messages'][0]['markup']);
     $this->assertTrue($doc2['expires'] > CRM_Utils_Time::getTimeRaw());
     // third try, $doc2 hasn't expired yet; no request; keep old data
     CRM_Utils_Time::setTime('2013-03-01 12:09:00');
     $communityMessages = new CRM_Core_CommunityMessages($this->cache, $this->expectNoHttpRequest());
     $doc3 = $communityMessages->getDocument();
     $this->assertEquals('<h1>First valid response</h1>', $doc3['messages'][0]['markup']);
     $this->assertEquals($doc2['expires'], $doc3['expires']);
     // fourth try, $doc2 has expired yet; new request; replace data
     CRM_Utils_Time::setTime('2013-03-01 12:10:02');
     $communityMessages = new CRM_Core_CommunityMessages($this->cache, $this->expectOneHttpRequest(self::$webResponses['second-valid-response']));
     $doc4 = $communityMessages->getDocument();
     $this->assertEquals('<h1>Second valid response</h1>', $doc4['messages'][0]['markup']);
     $this->assertApproxEquals(strtotime('2013-03-01 12:20:02'), $doc4['expires'], self::APPROX_TIME_EQUALITY);
 }
예제 #4
0
 /**
  * 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);
         }
     }
 }
예제 #5
0
 /**
  * Run a series of cron jobs and make an assertion about email deliveries.
  *
  * @param array $cronRuns
  *   array specifying when to run cron and what messages to expect; each item is an array with keys:
  *   - time: string, e.g. '2012-06-15 21:00:01'
  *   - recipients: array(array(string)), list of email addresses which should receive messages
  */
 public function assertCronRuns($cronRuns)
 {
     foreach ($cronRuns as $cronRun) {
         CRM_Utils_Time::setTime($cronRun['time']);
         $this->callAPISuccess('job', 'send_reminder', array());
         $this->mut->assertRecipients($cronRun['recipients']);
         if (array_key_exists('subjects', $cronRun)) {
             $this->mut->assertSubjects($cronRun['subjects']);
         }
         $this->mut->clearMessages();
     }
 }
예제 #6
0
 /**
  * Test that item leases can be ignored.
  *
  * @dataProvider getQueueSpecs
  * @param $queueSpec
  */
 public function testStealItem($queueSpec)
 {
     $this->queue = $this->queueService->create($queueSpec);
     $this->assertTrue($this->queue instanceof CRM_Queue_Queue);
     require_once 'CRM/Utils/Time.php';
     CRM_Utils_Time::setTime('2012-04-01 1:00:00');
     $this->queue->createItem(array('test-key' => 'a'));
     $item = $this->queue->claimItem();
     $this->assertEquals('a', $item->data['test-key']);
     $this->assertEquals(1, $this->queue->numberOfItems());
     // forget to release
     // haven't reached expiration yet, so claimItem fails
     CRM_Utils_Time::setTime('2012-04-01 1:59:00');
     $item2 = $this->queue->claimItem();
     $this->assertEquals(FALSE, $item2);
     // but stealItem works
     $item3 = $this->queue->stealItem();
     $this->assertEquals('a', $item3->data['test-key']);
     $this->assertEquals(1, $this->queue->numberOfItems());
     $this->queue->deleteItem($item3);
     $this->assertEquals(0, $this->queue->numberOfItems());
 }
 /**
  * Run a series of cron jobs and make an assertion about email deliveries
  *
  * @param $cronRuns
  *
  * @internal param array $jobSchedule specifying when to run cron and what messages to expect; each item is an array with keys:
  *  - time: string, e.g. '2012-06-15 21:00:01'
  *  - recipients: array(array(string)), list of email addresses which should receive messages
  */
 function assertCronRuns($cronRuns)
 {
     foreach ($cronRuns as $cronRun) {
         CRM_Utils_Time::setTime($cronRun['time']);
         $result = civicrm_api('job', 'send_reminder', array('version' => 3));
         $this->assertAPISuccess($result);
         $this->mut->assertRecipients($cronRun['recipients']);
         $this->mut->clearMessages();
     }
 }