'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.'); } /** * Gets the latest Maillog entry. * * @return array * Maillog entry. */ protected function getLatestMaillogEntry() { $query = 'SELECT idmaillog, header_from, header_to, header_reply_to, header_all, subject, body FROM {maillog} ORDER BY idmaillog 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(); } }