<?php

/**
 * @file
 * Tests the profiles functionality.
 */

/**
 * Test that the front page still loads.
 */
class BmTestProfiles extends BmTestBase {

  /**
   * Define this test class.
   */
  public static function getInfo() {
    return array(
      'name' => 'Profiles tests',
      'description' => 'Run through basic scenarios and functionality.',
      'group' => 'backup_migrate',
    );
  }

  /**
   * {@inheritdoc}
   */
  public function setUp(array $modules = array()) {
    parent::setUp($modules);

    // Log in as user 1, so that permissions are irrelevant.
    $this->loginUser1();
  }

  /**
   * Verify the profile page has the expected functionality available.
   */
  public function testProfilePage() {
    // Load the main B&M page.
    $this->drupalGet(BACKUP_MIGRATE_MENU_PATH . '/settings');
    $this->assertResponse(200);

    // Confirm the page has the expected settings details.
    $this->assertText('Settings Profiles');
    $this->assertText('Default Settings');
    $this->assertLink('Create a new settings profile');
  }

  /**
   * Confirm adding a new backup process works.
   */
  public function testAddDefaultProfile() {
    require_once dirname(__FILE__) . '/../includes/files.inc';
    require_once dirname(__FILE__) . '/../includes/profiles.inc';

    // Load the main B&M page.
    $this->drupalGet(BACKUP_MIGRATE_MENU_PATH . '/settings/profile/add');
    $this->assertResponse(200);

    $filename = _backup_migrate_default_filename();
    $defaults = _backup_migrate_profile_default_profile();

    // Verify all of the expected fields exist.
    $this->assertFieldByName('name');
    $this->assertFieldByName('name', 'Untitled Profile');
    $this->assertFieldByName('machine_name');
    $this->assertFieldByName('filename');
    $this->assertFieldByName('filename', $filename);
    // @todo Confirm all of the expected options are present.
    $this->assertFieldByName('append_timestamp');
    $this->assertFieldByName('timestamp_format');
    $this->assertFieldByName('timestamp_format', $defaults['timestamp_format']);
    $this->assertFieldByName('filters[compression]');
    $items = $this->supportedCompressors();
    $this->assertSelectOptions('edit-filters-compression', $items);
    $this->assertOptionSelected('edit-filters-compression', 'gzip');
    $this->assertFieldByName('filters[sources][db][exclude_tables][]');
    $this->assertFieldByName('filters[sources][db][nodata_tables][]');
    $this->assertFieldByName('filters[sources][db][utils_lock_tables]');
    $this->assertFieldByName('filters[sources][files][exclude_filepaths]');
    $this->assertFieldByName('filters[sources][archive][exclude_filepaths]');
    $this->assertFieldByName('filters[utils_site_offline]');
    $this->assertFieldByName('filters[utils_site_offline_message]');
    $this->assertFieldByName('filters[utils_description]');
    $this->assertFieldByName('filters[use_cli]');
    $this->assertFieldByName('filters[ignore_errors]');
    $this->assertFieldByName('filters[notify_success_enable]');
    $this->assertFieldByName('filters[notify_success_email]');
    $this->assertFieldByName('filters[notify_failure_enable]');
    $this->assertFieldByName('filters[notify_failure_email]');
  }

  /**
   * Confirm the backup filename processes work as expected.
   */
  public function testFilenameOptions() {
    // Load the profile. This will be interacted with directly because otherwise
    // the number of form fields will likely make it impossible to execute
    // properly due to the max_input_vars setting defaulting to 1000.
    $profile = $this->getProfile();

    // Run a backup.
    $this->runBackup();

    // Confirm that there is only one file and it has a timestamp of some sort.
    $files1 = $this->listBackupFiles();
    $this->verbose($files1);
    $this->assertTrue(count($files1) === 1, 'One backup file was found.');
    $this->assertFileTimestamp(array_shift($files1));

    // Run another backup.
    $this->runBackup();

    // Confirm that there are two backup files.
    $files1b = $this->listBackupFiles();
    $this->verbose($files1b);
    $this->assertTrue(count($files1b) === 2, 'Two backup files were found.');

    // Cleanup before the next test - purge existing backups.
    $this->deleteBackups();

    // Change settings to "create separate backups".
    $profile->append_timestamp = 0;
    $profile->save();

    // Run a backup.
    $this->runBackup();

    // Confirm that separate files are retained.
    $files2 = $this->listBackupFiles();
    $this->verbose($files2);
    $this->assertTrue(count($files2) === 1, 'One backup file was found.');
    $this->assertNoFileTimestamp(array_shift($files2));

    // Run another backup.
    $this->runBackup();

    // Confirm that separate files are retained.
    $files2b = $this->listBackupFiles();
    $this->verbose($files2b);
    $this->assertTrue(count($files2b) === 2, 'Two backup files were found.');

    // Cleanup before the next test - purge existing backups.
    $this->deleteBackups();

    // Change settings to "overwrite".
    $profile->append_timestamp = 2;
    $profile->save();

    // Run a backup.
    $this->runBackup();

    // Confirm that a new file was created.
    $files3 = $this->listBackupFiles();
    $this->verbose($files3);
    $this->assertTrue(count($files3) === 1, 'One backup file was found.');
    $this->assertNoFileTimestamp(array_shift($files3));

    // Run the backup again.
    $this->runBackup();

    // Confirm that a new file was not created.
    $files3b = $this->listBackupFiles();
    $this->verbose($files3b);
    $this->assertTrue(count($files3b) === 1, 'One backup file was found.');

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

}
