summaryrefslogtreecommitdiff
path: root/modules/update/tests/update_test.module
blob: fb7d3abfbad7b56c8e14d2c5392a077331c27e57 (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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php
// $Id$

/**
 * Implements hook_menu().
 */
function update_test_menu() {
  $items = array();

  $items['update-test'] = array(
    'title' => t('Update test'),
    'page callback' => 'update_test_mock_page',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );

  return $items;
}

/**
 * Implements hook_system_info_alter().
 *
 * This checks the 'update_test_system_info' variable and sees if we need to
 * alter the system info for the given $file based on the setting. The setting
 * is expected to be a nested associative array. If the key '#all' is defined,
 * its subarray will include .info keys and values for all modules and themes
 * on the system. Otherwise, the settings array is keyed by the module or
 * theme short name ($file->name) and the subarrays contain settings just for
 * that module or theme.
 */
function update_test_system_info_alter(&$info, $file) {
  $setting = variable_get('update_test_system_info', array());
  foreach (array('#all', $file->name) as $id) {
    if (!empty($setting[$id])) {
      foreach ($setting[$id] as $key => $value) {
        $info[$key] = $value;
      }
    }
  }
}

/**
 * Implements hook_update_status_alter().
 *
 * This checks the 'update_test_update_status' variable and sees if we need to
 * alter the update status for the given project based on the setting. The
 * setting is expected to be a nested associative array. If the key '#all' is
 * defined, its subarray will include .info keys and values for all modules
 * and themes on the system. Otherwise, the settings array is keyed by the
 * module or theme short name and the subarrays contain settings just for that
 * module or theme.
 */
function update_test_update_status_alter(&$projects) {
  $setting = variable_get('update_test_update_status', array());
  if (!empty($setting)) {
    foreach ($projects as $project_name => &$project) {
      foreach (array('#all', $project_name) as $id) {
        if (!empty($setting[$id])) {
          foreach ($setting[$id] as $key => $value) {
            $project[$key] = $value;
          }
        }
      }
    }
  }
}

/**
 * Page callback, prints mock XML for the update module.
 *
 * The specific XML file to print depends on two things: the project we're
 * trying to fetch data for, and the desired "availability scenario" for that
 * project which we're trying to test. Before attempting to fetch this data
 * (by checking for updates on the available updates report), callers need to
 * define the 'update_test_xml_map' variable as an array, keyed by project
 * name, indicating which availability scenario to use for that project.
 *
 * @param $project_name
 *   The project short name update.module is trying to fetch data for (the
 *   fetch URLs are of the form: [base_url]/[project_name]/[core_version]).
 */
function update_test_mock_page($project_name) {
  $xml_map = variable_get('update_test_xml_map', FALSE);
  if (isset($xml_map[$project_name])) {
    $availability_scenario = $xml_map[$project_name];
  }
  elseif (isset($xml_map['#all'])) {
    $availability_scenario = $xml_map['#all'];
  }
  else {
    // The test didn't specify (for example, the webroot has other modules and
    // themes installed but they're disabled by the version of the site
    // running the test. So, we default to a file we know won't exist, so at
    // least we'll get an empty page from readfile instead of a bunch of
    // Drupal page output.
    $availability_scenario = '#broken#';
  }

  $path = drupal_get_path('module', 'update_test');
  readfile("$path/$project_name.$availability_scenario.xml");
}

/**
 * Implement hook_archiver_info().
 */
function update_test_archiver_info() {
  return array(
    'update_test_archiver' => array(
      // This is bogus, we only care about the extensions for now.
      'class' => 'ArchiverUpdateTest',
      'extensions' => array('update-test-extension'),
    ),
  );
}

/**
 * Implements hook_filetransfer_info().
 */
function update_test_filetransfer_info() {
  // Define a mock file transfer method, to ensure that there will always be
  // at least one method available in the user interface (regardless of the
  // environment in which the update manager tests are run).
  return array(
    'system_test' => array(
      'title' => t('Update Test FileTransfer'),
      // This should be in an .inc file, but for testing purposes, it is OK to
      // leave it in the main module file.
      'file' => 'update_test.module',
      'class' => 'UpdateTestFileTransfer',
      'weight' => -20,
    ),
  );
}

/**
 * Mock FileTransfer object to test the settings form functionality.
 */
class UpdateTestFileTransfer {
  public static function factory() {
    return new UpdateTestFileTransfer;
  }

  public function getSettingsForm() {
    $form = array();
    $form['udpate_test_username'] = array(
      '#type' => 'textfield',
      '#title' => t('Update Test Username'),
    );
    return $form;
  }
}