diff --git a/modules/update/tests/no-updates.xml b/modules/update/tests/no-updates.xml new file mode 100644 index 00000000000..701e11e3ef9 --- /dev/null +++ b/modules/update/tests/no-updates.xml @@ -0,0 +1,34 @@ + + +Drupal +drupal +Drupal +7.x +7 +7 +7 +published +http://example.com/project/drupal + + ProjectsDrupal project + + + + Drupal 7.0 + 7.0 + DRUPAL-7-0 + 7 + 0 + published + http://example.com/drupal-7-0-release + http://example.com/drupal-7-0.tar.gz + 1250424521 + b966255555d9c9b86d480ca08cfaa98e + 1073741824 + + Release typeNew features + Release typeBug fixes + + + + diff --git a/modules/update/tests/normal-update.xml b/modules/update/tests/normal-update.xml new file mode 100644 index 00000000000..de4cfd00497 --- /dev/null +++ b/modules/update/tests/normal-update.xml @@ -0,0 +1,51 @@ + + +Drupal +drupal +Drupal +7.x +7 +7 +7 +published +http://example.com/project/drupal + + ProjectsDrupal project + + + + Drupal 7.1 + 7.1 + DRUPAL-7-1 + 7 + 1 + published + http://example.com/drupal-7-1-release + http://example.com/drupal-7-1.tar.gz + 1250424581 + b966255555d9c9b86d480ca08cfaa98e + 2147483648 + + Release typeNew features + Release typeBug fixes + + + + Drupal 7.0 + 7.0 + DRUPAL-7-0 + 7 + 0 + published + http://example.com/drupal-7-0-release + http://example.com/drupal-7-0.tar.gz + 1250424521 + b966255555d9c9b86d480ca08cfaa98e + 1073741824 + + Release typeNew features + Release typeBug fixes + + + + diff --git a/modules/update/tests/security-update.xml b/modules/update/tests/security-update.xml new file mode 100644 index 00000000000..1e68c8d5fe3 --- /dev/null +++ b/modules/update/tests/security-update.xml @@ -0,0 +1,69 @@ + + +Drupal +drupal +Drupal +7.x +7 +7 +7 +published +http://example.com/project/drupal + + ProjectsDrupal project + + + + Drupal 7.2 + 7.2 + DRUPAL-7-2 + 7 + 2 + published + http://example.com/drupal-7-2-release + http://example.com/drupal-7-2.tar.gz + 1250424641 + b966255555d9c9b86d480ca08cfaa98e + 4294967296 + + Release typeNew features + Release typeBug fixes + Release typeSecurity update + + + + Drupal 7.1 + 7.1 + DRUPAL-7-1 + 7 + 1 + published + http://example.com/drupal-7-1-release + http://example.com/drupal-7-1.tar.gz + 1250424581 + b966255555d9c9b86d480ca08cfaa98e + 2147483648 + + Release typeNew features + Release typeBug fixes + + + + Drupal 7.0 + 7.0 + DRUPAL-7-0 + 7 + 0 + published + http://example.com/drupal-7-0-release + http://example.com/drupal-7-0.tar.gz + 1250424521 + b966255555d9c9b86d480ca08cfaa98e + 1073741824 + + Release typeNew features + Release typeBug fixes + + + + diff --git a/modules/update/tests/update_test.info b/modules/update/tests/update_test.info new file mode 100644 index 00000000000..10445c29781 --- /dev/null +++ b/modules/update/tests/update_test.info @@ -0,0 +1,8 @@ +; $Id$ +name = Update test +description = Support module for update module testing. +package = Testing +version = VERSION +core = 7.x +files[] = update_test.module +hidden = TRUE diff --git a/modules/update/tests/update_test.module b/modules/update/tests/update_test.module new file mode 100644 index 00000000000..54e497415ad --- /dev/null +++ b/modules/update/tests/update_test.module @@ -0,0 +1,50 @@ + t('Update test'), + 'page callback' => 'update_test_mock_page', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + return $items; +} + +/** + * Implement 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; + } + } + } +} + +/** + * Page callback, prints mock XML for the update module. + */ +function update_test_mock_page() { + $xml = variable_get('update_test_xml', FALSE); + // Note: this will cause an exception to occur if no variable was set and + // $file is FALSE. + readfile(drupal_get_path('module', 'update_test') . "/$xml"); +} diff --git a/modules/update/update.info b/modules/update/update.info index 5e1006c39ad..36ea5d3cfeb 100644 --- a/modules/update/update.info +++ b/modules/update/update.info @@ -4,9 +4,10 @@ description = Checks the status of available updates for Drupal and your install version = VERSION package = Core core = 7.x -files[] = update.module files[] = update.compare.inc files[] = update.fetch.inc +files[] = update.install +files[] = update.module files[] = update.report.inc files[] = update.settings.inc -files[] = update.install +files[] = update.test diff --git a/modules/update/update.test b/modules/update/update.test new file mode 100644 index 00000000000..3ce325056fb --- /dev/null +++ b/modules/update/update.test @@ -0,0 +1,100 @@ + 'Update functionality', + 'description' => 'Tests the update module through a series of functional tests using mock XML data.', + 'group' => 'Update', + ); + } + + function setUp() { + parent::setUp('update_test', 'update'); + $admin_user = $this->drupalCreateUser(array('administer site configuration')); + $this->drupalLogin($admin_user); + variable_set('update_fetch_url', url('update-test', array('absolute' => TRUE))); + } + + /** + * Tests the update module when no updates are available. + */ + function testNoUpdatesAvailable() { + $this->setSystemInfo7_0(); + $this->refreshUpdateData('no-updates.xml'); + $this->drupalGet('admin/reports/updates'); + $this->standardTests(); + $this->assertText(t('Up to date')); + $this->assertNoText(t('Update available')); + $this->assertNoText(t('Security update required!')); + } + + /** + * Tests the update module when one normal update ("7.1") is available. + */ + function testNormalUpdateAvailable() { + $this->setSystemInfo7_0(); + $this->refreshUpdateData('normal-update.xml'); + $this->drupalGet('admin/reports/updates'); + $this->standardTests(); + $this->assertNoText(t('Up to date')); + $this->assertText(t('Update available')); + $this->assertNoText(t('Security update required!')); + $this->assertRaw(l('7.1', 'http://example.com/drupal-7-1-release'), t('Link to release appears.')); + $this->assertRaw(l(t('Download'), 'http://example.com/drupal-7-1.tar.gz'), t('Link to download appears.')); + $this->assertRaw(l(t('Release notes'), 'http://example.com/drupal-7-1-release'), t('Link to release notes appears.')); + } + + /** + * Tests the update module when a security update ("7.2") is available. + */ + function testSecurityUpdateAvailable() { + $this->setSystemInfo7_0(); + $this->refreshUpdateData('security-update.xml'); + $this->drupalGet('admin/reports/updates'); + $this->standardTests(); + $this->assertNoText(t('Up to date')); + $this->assertNoText(t('Update available')); + $this->assertText(t('Security update required!')); + $this->assertRaw(l('7.2', 'http://example.com/drupal-7-2-release'), t('Link to release appears.')); + $this->assertRaw(l(t('Download'), 'http://example.com/drupal-7-2.tar.gz'), t('Link to download appears.')); + $this->assertRaw(l(t('Release notes'), 'http://example.com/drupal-7-2-release'), t('Link to release notes appears.')); + } + + /** + * Helper function: force te update cache to refresh based on the contents of + * the specified XML file. + * + * @param $xml + * The file name of the XML file to use for mock update data. + */ + protected function refreshUpdateData($xml) { + variable_set('update_test_xml', $xml); + $this->drupalGet('admin/reports/updates/check'); + } + + protected function setSystemInfo7_0() { + $setting = array( + '#all' => array( + 'version' => '7.0', + ), + ); + variable_set('update_test_system_info', $setting); + } + + /** + * Helper function: run a series of assertions that are applicable for all + * update statuses. + */ + protected function standardTests() { + $this->assertRaw(l(t('Check manually'), 'admin/reports/updates/check'), t('Link to check available updates manually appears.')); + $this->assertRaw(l(t('Drupal'), 'http://example.com/project/drupal'), t('Link to the Drupal project appears.')); + } +}