You are here

public function BmTestEmail::testAddEmailDestination in Backup and Migrate 7.3

Confirm the whole email process.

File

tests/BmTestEmail.test, line 37
Test email delivery.

Class

BmTestEmail
Test email delivery.

Code

public function testAddEmailDestination() {

  // See if we can add a destination.
  // Load the email destination Add page.
  $this
    ->drupalGet(BACKUP_MIGRATE_MENU_PATH . '/settings/destination/add/email');
  $this
    ->assertResponse(200);

  // Verify all of the expected fields exist.
  $this
    ->assertFieldByName('name');
  $this
    ->assertFieldByName('name', 'Untitled Destination');
  $this
    ->assertFieldByName('machine_name');
  $this
    ->assertFieldByName('location');

  // Set up test values.
  $test_source = strtolower($this
    ->randomName(16));
  $address = strtolower($this
    ->randomName(10)) . '@example.com';
  $test_destination = strtolower($this
    ->randomName(16));

  // Submit e-mail destination form with invalid values.
  $this
    ->submitDestinationEmail('', $test_destination, $address);
  $this
    ->assertText(t('Destination name field is required.'), 'Name required.');
  $this
    ->submitDestinationEmail($this
    ->randomString(16), '', $address);
  $this
    ->assertText(t('Machine-readable name field is required.'), 'Machine name required.');
  $this
    ->submitDestinationEmail($this
    ->randomString(16), $test_destination, '');
  $this
    ->assertText(t('Email Address field is required.'), 'E-mail required.');

  // Step 1, set-up.
  // Create a test destination.
  $this
    ->submitDestinationEmail($this
    ->randomString(16), $test_destination, $address);
  $this
    ->assertText(t('Your destination was saved'));

  // Create a test source.
  // @todo Test the source add form.
  // @todo Maybe add a note somewhere about how we are using a small
  // source on purpose, so as to not break the testing system.
  $this
    ->submitSourceFiles($this
    ->randomString(16), $test_source, drupal_get_path('module', 'backup_migrate') . '/tests/files/');
  $this
    ->assertText(t('Your source was saved'));

  // Run a manual back-up so we have a file to compare against.
  $this
    ->runBackup('manual', $test_source);
  $files = $this
    ->listBackupFiles();
  $key = key($files);

  // Confirm the back-up file exists.
  $this
    ->assertNotEqual($key, NULL, 'A backup file was found.');
  $file = $files[$key];

  // Copied from destinations.email.inc to build a compatible parameter.
  $attachment = new stdClass();
  $attachment->filename = $file->name;
  $attachment->path = $file->path;

  // Step 2, e-mail generated through the Quick Backup form.
  // Run a backup per e-mail.
  $this
    ->runBackup($test_destination, $test_source);

  // Confirm that an e-mail was sent.
  $captured_emails = $this
    ->drupalGetMails(array(
    'id' => 'backup_migrate_destination_mail',
    'to' => $address,
  ));
  $this
    ->verboseEmail();
  $this
    ->assertEqual(count($captured_emails), 1, 'A back-up was mailed.');

  // Does the attachment occur in the captured e-mail?
  // Note that the e-mail from Step 2 is tested against the back-up file from
  // Step 1.
  $file_data = fread(fopen($attachment->path, "r"), filesize($attachment->path));
  $encoded_file_data = chunk_split(base64_encode($file_data), 70, "\r\n");
  $this
    ->assertMailString('body', $encoded_file_data, 1);

  // Step 3, e-mail generated through the main helper function.
  // Make sure the new $address is never the same as the old one.
  $address = strtolower($this
    ->randomName(1 + strlen($address))) . '@example.com';
  _backup_migrate_destination_email_mail_backup($attachment, $address);

  // Confirm that an e-mail is sent.
  $captured_emails = $this
    ->drupalGetMails(array(
    'id' => 'backup_migrate_destination_mail',
    'to' => $address,
  ));
  $this
    ->verboseEmail();
  $this
    ->assertEqual(count($captured_emails), 1, 'A back-up was mailed.');

  // Check if the Subject field contains the filename.
  $this
    ->assertMailString('subject', $attachment->filename, 1);

  // Check if the body contains the filename.
  $this
    ->assertMailString('body', $attachment->filename, 1);

  // Step 4, (partial) e-mail generated through a mime_mail() object.
  // Build an e-mail.
  $test_mail = new mime_mail();
  $boundary = "b" . md5(uniqid(time()));

  // Make sure the new $address is never the same as the old one.
  $address = strtolower($this
    ->randomName(1 + strlen($address))) . '@example.com';
  $attach = fread(fopen($attachment->path, "r"), filesize($attachment->path));
  $test_mail
    ->add_attachment($attach, $attachment->filename, "application/octet-stream");
  $message = $test_mail
    ->build_multipart($boundary);
  $params = array(
    'body' => $message,
    'subject' => 'test',
    'headers' => array(
      'MIME-Version' => "1.0",
      'Content-Type' => "multipart/mixed; boundary=\"{$boundary}\"",
    ),
  );
  drupal_mail('backup_migrate', 'destination_mail', $address, '', $params);
  $captured_emails = $this
    ->drupalGetMails(array(
    'id' => 'backup_migrate_destination_mail',
    'to' => $address,
  ));
  $this
    ->verboseEmail();

  // Confirm that an e-mail was sent.
  $this
    ->assertEqual(count($captured_emails), 1, 'A back-up was mailed.');

  // Does the boundary occur in the captured e-mail?
  $this
    ->assertMailString('body', '--' . $boundary, 1);

  // How many boundaries?
  $expected = count($test_mail->parts) + 1;
  $this
    ->assertMailStringCount('body', '--' . $boundary, $expected, 1);

  // Cleanup - purge all backups.
  $this
    ->deleteBackups();
}