You are here

function SimplenewsSchedulerEditionDueTest::testEditionsDue in Simplenews Scheduler 2.0.x

Test simplenews_scheduler_get_newsletters_due().

File

tests/src/Functional/SimplenewsSchedulerEditionDueTest.php, line 75

Class

SimplenewsSchedulerEditionDueTest
Functional tests for simplenews_scheduler_get_newsletters_due().

Namespace

Drupal\Tests\simplenews_scheduler\Functional

Code

function testEditionsDue() {

  // Get the node id of the parent newsletter node.
  $parent_nid = $this->parent_nid;

  // But just check it exists for sanity.
  $this
    ->drupalGet("node/{$parent_nid}");

  // Simulate cron running daily at half past 12 so that an edition due at
  // 12 noon should be picked up.
  $start_date = new \DateTime("2012-01-01 12:00:00");
  $time_offsets = array(
    'before' => "-1 hour",
    'after' => "+1 hour",
  );

  // Number of days to run cron for.
  $days = 150;

  // Index of the days we've done so far.
  $added_days = 0;

  // Iterate over days.
  while ($added_days <= $days) {

    // Create today's date at noon and get the timestamp.
    $date = clone $start_date;
    $date
      ->add(new \DateInterval("P{$added_days}D"));
    $timestamp_noon = $date
      ->getTimestamp();

    // We simulate running cron one hour before and one hour after noon.
    foreach ($time_offsets as $offset_key => $offset) {

      // Create a timestamp based on noon + the offset.
      // This gives us either 11:00 or 13:00 on the current day.
      $timestamp = strtotime($offset, $timestamp_noon);

      // debug("base: $timestamp_noon, off: $offset, result: $timestamp");
      // Get the list of newsletters due.
      $due = simplenews_scheduler_get_newsletters_due($timestamp);

      // An edition is due if it's 13:00 on the edition day.
      $formatted = date(DATE_RFC850, $timestamp);
      if ($offset_key == 'after' && date('d', $timestamp) == $this->edition_day) {
        $this
          ->assertTrue(isset($due[$parent_nid]), "Edition due at day {$added_days}, {$formatted}, {$timestamp}");
      }
      else {
        $this
          ->assertFalse(isset($due[$parent_nid]), "Edition not due at day {$added_days}, {$formatted}, {$timestamp}");
      }

      // Get some debug output to figure out what is going on in
      // simplenews_scheduler_get_newsletters_due().
      $intervals['hour'] = 3600;
      $intervals['day'] = 86400;
      $intervals['week'] = $intervals['day'] * 7;
      $intervals['month'] = $intervals['day'] * date('t', $timestamp);
      if (isset($due[$parent_nid])) {

        // Output what we got back from the function.
        // debug($due);
        $newsletter_parent_data = $due[$parent_nid];
        $edition_time = simplenews_scheduler_calculate_edition_time($newsletter_parent_data, $timestamp);
        $eid = _simplenews_scheduler_new_edition($newsletter_parent_data->nid, $timestamp);

        // Output the last_run as a sanity check.
        $result = \Drupal::database()
          ->query("SELECT last_run FROM {simplenews_scheduler} WHERE nid = :nid", array(
          ':nid' => $parent_nid,
        ));
        $last_run = $result
          ->fetchField();
        $formatted = date(DATE_RFC850, $last_run);

        // debug("Last run: $formatted, $last_run");
        // Output the calculated edition time.
        $formatted = date(DATE_RFC850, $edition_time);

        // debug("Edition time: $formatted, $edition_time");
        // Check the edition time is 12:00.
        $this
          ->assertEqual(date('H:i', $edition_time), '12:00', t('Edition time is at 12:00.'));

        // Fake sending it: update the 'last_run' for subsequent iterations.
        \Drupal::database()
          ->update('simplenews_scheduler')
          ->fields(array(
          'last_run' => $timestamp,
        ))
          ->condition('nid', $parent_nid)
          ->execute();

        // Update the edition record.
        simplenews_scheduler_scheduler_update($newsletter_parent_data, $timestamp);

        // Check the node exists.
        $this
          ->drupalGet("node/{$eid}");
      }

      // handling the request for a new edition
    }

    // foreach offset timestamp
    // Increment our counter.
    $added_days++;
  }

  // foreach day
}