summaryrefslogtreecommitdiff
path: root/modules/simpletest/drupal_unit_test_case.php
blob: 7a780709505e703e7fd1f4bb78f4178c5003792f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
// $Id$

/**
 * Test case Drupal unit tests.
 */
class DrupalUnitTestCase extends UnitTestCase {
  protected $created_temp_environment = FALSE;
  protected $db_prefix_original;
  protected $original_file_directory;

  /**
   * Retrieve the test information from getInfo().
   *
   * @param string $label Name of the test to be used by the SimpleTest library.
   */
  function __construct($label = NULL) {
    if (!$label) {
      if (method_exists($this, 'getInfo')) {
        $info  = $this->getInfo();
        $label = $info['name'];
      }
    }
    parent::__construct($label);
  }

  /**
   * Generates a random database prefix and runs the install scripts on the prefixed database.
   * After installation many caches are flushed and the internal browser is setup so that the page
   * requests will run on the new prefix. A temporary files directory is created with the same name
   * as the database prefix.
   *
   * @param ... List modules to enable.
   */
  public function setUp() {
    parent::setUp();
  }

  /**
   * Create a temporary environment for tests to take place in so that changes
   * will be reverted and other tests won't be affected.
   *
   * Generates a random database prefix and runs the install scripts on the prefixed database.
   * After installation many caches are flushed and the internal browser is setup so that the page
   * requests will run on the new prefix. A temporary files directory is created with the same name
   * as the database prefix.
   */
  protected function createTempEnvironment() {
    global $db_prefix, $simpletest_ua_key;
    $this->created_temp_environment = TRUE;
    if ($simpletest_ua_key) {
      $this->db_prefix_original = $db_prefix;
      $clean_url_original = variable_get('clean_url', 0);
      $db_prefix = 'simpletest'. mt_rand(1000, 1000000);
      include_once './includes/install.inc';
      drupal_install_system();
      $modules = array_unique(array_merge(func_get_args(), drupal_verify_profile('default', 'en')));
      drupal_install_modules($modules);
      $this->_modules = drupal_map_assoc($modules);
      $this->_modules['system'] = 'system';
      $task = 'profile';
      default_profile_tasks($task, '');
      menu_rebuild();
      actions_synchronize();
      _drupal_flush_css_js();
      variable_set('install_profile', 'default');
      variable_set('install_task', 'profile-finished');
      variable_set('clean_url', $clean_url_original);

      // Use temporary files directory with the same prefix as database.
      $this->original_file_directory = file_directory_path();
      variable_set('file_directory_path', file_directory_path() .'/'. $db_prefix);
      file_check_directory(file_directory_path(), TRUE); // Create the files directory.
    }
  }

  /**
   * Delete created files and temporary files directory, delete the tables created by setUp(),
   * and reset the database prefix.
   */
  public function tearDown() {
    global $db_prefix;
    if ($this->created_temp_environment && preg_match('/simpletest\d+/', $db_prefix)) {
      // Delete temporary files directory and reset files directory path.
      simpletest_clean_temporary_directory(file_directory_path());
      variable_set('file_directory_path', $this->original_file_directory);

      $schema = drupal_get_schema(NULL, TRUE);
      $ret = array();
      foreach ($schema as $name => $table) {
        db_drop_table($ret, $name);
      }
      $db_prefix = $this->db_prefix_original;
    }
    parent::tearDown();
  }
}