Issue #998256 by justafish, Dave Reid: Please let modules know about the original...
authorcatch
Wed, 8 Feb 2012 11:03:32 +0000 (20:03 +0900)
committercatch
Wed, 8 Feb 2012 11:03:32 +0000 (20:03 +0900)
core/includes/path.inc
core/modules/simpletest/tests/path.test
core/modules/simpletest/tests/path_test.info [new file with mode: 0644]
core/modules/simpletest/tests/path_test.module [new file with mode: 0644]

index 44bf3fe..b49d42b 100644 (file)
@@ -431,21 +431,27 @@ function path_load($conditions) {
  *   - langcode: (optional) The language code of the alias.
  */
 function path_save(&$path) {
-  $path += array('pid' => NULL, 'langcode' => LANGUAGE_NONE);
+  $path += array('langcode' => LANGUAGE_NONE);
 
-  // Insert or update the alias.
-  $status = drupal_write_record('url_alias', $path, (!empty($path['pid']) ? 'pid' : array()));
+  // Load the stored alias, if any.
+  if (!empty($path['pid']) && !isset($path['original'])) {
+    $path['original'] = path_load($path['pid']);
+  }
 
-  // Verify that a record was written.
-  if ($status) {
-    if ($status === SAVED_NEW) {
-      module_invoke_all('path_insert', $path);
-    }
-    else {
-      module_invoke_all('path_update', $path);
-    }
-    drupal_clear_path_cache($path['source']);
+  if (empty($path['pid'])) {
+    drupal_write_record('url_alias', $path);
+    module_invoke_all('path_insert', $path);
+  }
+  else {
+    drupal_write_record('url_alias', $path, array('pid'));
+    module_invoke_all('path_update', $path);
   }
+
+  // Clear internal properties.
+  unset($path['original']);
+
+  // Clear the static alias cache.
+  drupal_clear_path_cache($path['source']);
 }
 
 /**
index 18dab6b..308ef64 100644 (file)
@@ -333,3 +333,49 @@ class PathLookupTest extends DrupalWebTestCase {
     $this->assertEqual(drupal_lookup_path('source', $path['alias']), $path['source'], t('Newer alias record is returned when comparing two LANGUAGE_NONE paths with the same alias.'));
   }
 }
+
+/**
+ * Tests the path_save() function.
+ */
+class PathSaveTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => t('Path save'),
+      'description' => t('Tests that path_save() exposes the previous alias value.'),
+      'group' => t('Path API'),
+    );
+  }
+
+  function setUp() {
+    // Enable a helper module that implements hook_path_update().
+    parent::setUp('path_test');
+    path_test_reset();
+  }
+
+  /**
+   * Tests that path_save() makes the original path available to modules.
+   */
+  function testDrupalSaveOriginalPath() {
+    $account = $this->drupalCreateUser();
+    $uid = $account->uid;
+    $name = $account->name;
+
+    // Create a language-neutral alias.
+    $path = array(
+      'source' => "user/$uid",
+      'alias' => 'foo',
+    );
+    $path_original = $path;
+    path_save($path);
+
+    // Alter the path.
+    $path['alias'] = 'bar';
+    path_save($path);
+
+    // Test to see if the original alias is available to modules during
+    // hook_path_update().
+    $results = variable_get('path_test_results', array());
+    $this->assertIdentical($results['hook_path_update']['original']['alias'], $path_original['alias'], t('Old path alias available to modules during hook_path_update.'));
+    $this->assertIdentical($results['hook_path_update']['original']['source'], $path_original['source'], t('Old path alias available to modules during hook_path_update.'));
+  }
+}
diff --git a/core/modules/simpletest/tests/path_test.info b/core/modules/simpletest/tests/path_test.info
new file mode 100644 (file)
index 0000000..d2573a4
--- /dev/null
@@ -0,0 +1,6 @@
+name = "Hook path tests"
+description = "Support module for path hook testing."
+package = Testing
+version = VERSION
+core = 8.x
+hidden = TRUE
diff --git a/core/modules/simpletest/tests/path_test.module b/core/modules/simpletest/tests/path_test.module
new file mode 100644 (file)
index 0000000..0111675
--- /dev/null
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Helper module for the path tests.
+ */
+
+/**
+ * Resets the path test results.
+ */
+function path_test_reset() {
+  variable_set('path_test_results', array());
+}
+
+/**
+ * Implements hook_path_update().
+ */
+function path_test_path_update($path) {
+  $results = variable_get('path_test_results', array());
+  $results['hook_path_update'] = $path;
+  variable_set('path_test_results', $results);
+}