You are here

smtp.unit.test in SMTP Authentication Support 7

Same filename and directory in other branches
  1. 7.2 tests/smtp.unit.test

Some tests for the SMTP module.

File

tests/smtp.unit.test
View source
<?php

/**
 * @file
 * Some tests for the SMTP module.
 */
class SmtpUnitTest extends DrupalWebTestCase {

  /**
   * {@inheritdoc}
   */
  public static function getInfo() {
    return array(
      'name' => 'SMTP unit tests',
      'description' => 'Test the SMTP module.',
      'group' => 'SMTP',
    );
  }

  /**
   * {@inheritdoc}
   */
  function setUp(array $modules = array()) {

    // Requirements.
    $modules[] = 'smtp';

    // Some extra logic for fully testing the module.
    $modules[] = 'smtp_tests';

    // This module is used to log all emails so that the delivery can be
    // confirmed.
    $modules[] = 'maillog';
    parent::setUp($modules);

    // Take over the email system.
    variable_set('mail_system', array(
      'default-system' => 'SmtpMailSystem',
    ));

    // Turn on the mail module.
    variable_set('smtp_on', TRUE);

    // Do not actually deliver the emails.
    variable_set('smtp_deliver', FALSE);

    // Use Maillog to log all emails.
    variable_set('maillog_log', TRUE);
  }

  /**
   * Confirm that SMTP has taken over the 'mail_system' variable.
   */
  function testSetup() {
    $enabled = variable_get('mail_system', array());
    $should_be = array(
      'default-system' => 'SmtpMailSystem',
    );
    $this
      ->assertEqual($enabled, $should_be, 'SMTP is controlling mail delivery.');
    $delivery = variable_get('smtp_on', TRUE);
    $this
      ->assertEqual($delivery, TRUE, 'SMTP is enabled.');
    $delivery = variable_get('smtp_deliver', FALSE);
    $this
      ->assertEqual($delivery, FALSE, 'Email delivery is disabled.');
    $logging = variable_get('maillog_log', TRUE);
    $this
      ->assertEqual($logging, TRUE, 'Email delivery is being logged.');
  }

  /**
   * Tests logging mail with maillog module.
   */
  public function testLogging() {
    $langcode = language_default('language');

    // This is automatically assigned by Simpletest.
    $sender = 'simpletest@example.com';

    // Send an email.
    $to_email = 'to_test@example.com';
    $reply_email = 'reply_test@example.com';
    $params = array();
    drupal_mail('smtp_tests', 'smtp_basic_test', $to_email, $langcode, $params);

    // The SMTP module controls the 'from' address but defaults to using the
    // site's system email address.
    $from_email = variable_get('site_mail', '');

    // Compare the maillog db entry with the sent mail.
    $logged_email = $this
      ->getLatestMaillogEntry();
    $this
      ->assertTrue(!empty($logged_email), 'The test email was captured.');
    $this
      ->assertEqual($to_email, $logged_email['header_to']);

    //, 'Email "to" address is correct.');
    $this
      ->assertEqual($from_email, $logged_email['header_from']);

    //, 'Email "from" address is correct.');
    $this
      ->assertEqual($from_email, $logged_email['header_all']['From']);

    //, 'Email "from" header is correct.');
    $this
      ->assertEqual($sender, $logged_email['header_all']['Sender']);

    //, 'Email "sender" header is correct.');
    $this
      ->assertEqual($sender, $logged_email['header_all']['Return-Path']);

    //, 'Email "return-path" header is correct.');
    $this
      ->assertEqual('Drupal', $logged_email['header_all']['X-Mailer']);

    //, 'Email "x-mailer" header is correct.');
    $this
      ->assertEqual(t('Test email subject'), $logged_email['subject']);

    //, 'Email subject is correct.');
    $this
      ->assertEqual(t('Test email body.') . "\n", $logged_email['body']);

    //, 'Email body is correct.');
  }

  /**
   * Confirm the queue works.
   */
  public function testQueue() {

    // Turn on the queue.
    variable_set('smtp_queue', TRUE);

    // Send a test message.
    $langcode = language_default('language');
    $sender = 'simpletest@example.com';
    $to_email = 'to_test@example.com';
    $reply_email = 'reply_test@example.com';
    $params = array();
    drupal_mail('smtp_tests', 'smtp_basic_test', $to_email, $langcode, $params);

    // Check the queue for messages.
    $queue_count = $this
      ->getQueueCount();
    $this
      ->assertEqual($queue_count, 1, 'An email was found in the send queue.');
  }

  /**
   * Confirm the queue works.
   */
  public function testFailQueue() {

    // Turn on the queue failover.
    variable_set('smtp_queue_fail', TRUE);

    // Make sure the queue is disabled.
    variable_set('smtp_queue', FALSE);

    // Turn on email delivery.
    variable_set('smtp_deliver', TRUE);

    // Set some fake values for the delivery, it should fail and then cause the
    // email to go in to the queue.
    variable_set('smtp_from', 'drupal@example.com');
    variable_set('smtp_fromname', 'Drupal Simpletest');
    variable_set('smtp_host', 'smtp.gmail.com');
    variable_set('smtp_hostbackup', '');
    variable_set('smtp_password', 'THIS WILL NOT WORK!');
    variable_set('smtp_port', '465');
    variable_set('smtp_protocol', 'ssl');
    variable_set('smtp_username', 'hello@example.com');

    // Send a test message.
    $langcode = language_default('language');
    $sender = 'simpletest@example.com';
    $to_email = 'to_test@example.com';
    $reply_email = 'reply_test@example.com';
    $params = array();
    drupal_mail('smtp_tests', 'smtp_basic_test', $to_email, $langcode, $params);

    // Check the queue for messages.
    $queue_count = $this
      ->getQueueCount('smtp_failure_queue');
    $this
      ->assertEqual($queue_count, 1, 'An email was found in the failure queue.');
    $queue_count = $this
      ->getQueueCount();
    $this
      ->assertEqual($queue_count, 0, 'An email was not found in the regular email queue.');

    // Run the queue so that messages can be moved to the normal email queue.
    drupal_cron_run();

    // Check the queue for messages.
    $queue_count = $this
      ->getQueueCount();
    $this
      ->assertEqual($queue_count, 1, 'An email was found in the regular email queue.');
    $queue_count = $this
      ->getQueueCount('smtp_failure_queue');
    $this
      ->assertEqual($queue_count, 0, 'An email was not found in the failure queue.');
  }

  /**
   * Tests email address parsing.
   */
  public function testAddressParsing() {
    $scenarios = array(
      array(
        // Input.
        'name@example.com',
        // Expected.
        array(
          'email' => 'name@example.com',
        ),
      ),
      array(
        ' name@example.com',
        array(
          'input' => 'name@example.com',
          'email' => 'name@example.com',
        ),
      ),
      array(
        'name@example.com ',
        array(
          'input' => 'name@example.com',
          'email' => 'name@example.com',
        ),
      ),
      array(
        'some name <address@example.com>',
        array(
          'name' => 'some name',
          'email' => 'address@example.com',
        ),
      ),
      array(
        '"some name" <address@example.com>',
        array(
          'name' => 'some name',
          'email' => 'address@example.com',
        ),
      ),
      array(
        '<address@example.com>',
        array(
          'email' => 'address@example.com',
        ),
      ),
    );
    $mail_system = new SmtpMailSystemWrapper();
    foreach ($scenarios as $scenario) {
      list($input, $expected) = $scenario;
      $ret = $mail_system
        ->getComponents($input);
      if (!empty($expected['input'])) {
        $this
          ->assertIdentical($expected['input'], $ret['input']);
      }
      else {
        $this
          ->assertIdentical($input, $ret['input']);
      }
      $this
        ->assertIdentical(!empty($expected['name']) ? $expected['name'] : '', $ret['name']);
      $this
        ->assertIdentical(!empty($expected['email']) ? $expected['email'] : '', $ret['email']);
    }
  }

  /**
   * Gets the latest Maillog entry.
   *
   * @return array
   *   Maillog entry.
   */
  protected function getLatestMaillogEntry() {
    $query = 'SELECT id, header_from, header_to, header_reply_to, header_all, subject, body FROM {maillog} ORDER BY id DESC';
    $result = db_query_range($query, 0, 1);
    if ($maillog = $result
      ->fetchAssoc()) {

      // Unserialize values.
      $maillog['header_all'] = unserialize($maillog['header_all']);
    }
    return $maillog;
  }

  /**
   * Get the number of emails in a specific queue.
   *
   * @param string $queue
   *   The name of the queue to add the emails to.
   *
   * @return int
   *   The number of messages found in the requested queue.
   */
  protected function getQueueCount($queue = 'smtp_send_queue') {
    return db_query("SELECT count('name') FROM {queue} WHERE name = :queue", array(
      ':queue' => $queue,
    ))
      ->fetchField();
  }

}

Classes

Namesort descending Description
SmtpUnitTest @file Some tests for the SMTP module.