summaryrefslogtreecommitdiff
path: root/modules/node
diff options
context:
space:
mode:
Diffstat (limited to 'modules/node')
-rw-r--r--modules/node/node.module16
-rw-r--r--modules/node/node.test52
2 files changed, 65 insertions, 3 deletions
diff --git a/modules/node/node.module b/modules/node/node.module
index 0fe992e98..468819e43 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -1062,7 +1062,11 @@ function node_submit($node) {
}
/**
- * Save a node object into the database.
+ * Save changes to a node or add a new node.
+ *
+ * @param $node
+ * The $node object to be saved. If $node->nid is
+ * omitted (or $node->is_new is TRUE), a new node will be added.
*/
function node_save(&$node) {
field_attach_presave('node', $node);
@@ -1070,10 +1074,12 @@ function node_save(&$node) {
node_invoke_node($node, 'presave');
global $user;
- $node->is_new = FALSE;
+ if (!isset($node->is_new)) {
+ $node->is_new = empty($node->nid);
+ }
// Apply filters to some default node fields:
- if (empty($node->nid)) {
+ if ($node->is_new) {
// Insert a new node.
$node->is_new = TRUE;
@@ -1098,6 +1104,7 @@ function node_save(&$node) {
}
elseif (!empty($node->revision)) {
$node->old_vid = $node->vid;
+ unset($node->vid);
}
else {
// When updating a node, avoid clobbering an existing log entry with an empty one.
@@ -1153,6 +1160,9 @@ function node_save(&$node) {
// Update the node access table for this node.
node_access_acquire_grants($node);
+
+ // Clear internal properties.
+ unset($node->is_new);
// Clear the page and block caches.
cache_clear_all();
diff --git a/modules/node/node.test b/modules/node/node.test
index 30e3e6971..022b0cf78 100644
--- a/modules/node/node.test
+++ b/modules/node/node.test
@@ -664,3 +664,55 @@ class NodeRSSContentTestCase extends DrupalWebTestCase {
$this->assertText($test_text, t('Extra node content appears in RSS feed.'));
}
}
+
+/**
+ * Test case to check node save related functionality, including import-save
+ */
+class NodeSaveTestCase extends DrupalWebTestCase {
+
+ function getInfo() {
+ return array(
+ 'name' => t('Node save'),
+ 'description' => t('Test node_save() for saving content.'),
+ 'group' => t('Node'),
+ );
+ }
+
+ function setUp() {
+ parent::setUp();
+ // Create a user that is allowed to post; we'll use this to test the submission.
+ $web_user = $this->drupalCreateUser(array('create article content'));
+ $this->drupalLogin($web_user);
+ $this->web_user = $web_user;
+ }
+
+ /**
+ * Import test, to check if custom node ids are saved properly.
+ * Workflow:
+ * - first create a piece of content
+ * - save the content
+ * - check if node exists
+ */
+ function testImport() {
+ // Node ID must be a number that is not in the database.
+ $max_nid = db_result(db_query('SELECT MAX(nid) FROM {node}'));
+ $test_nid = $max_nid + mt_rand(1000, 1000000);
+ $title = $this->randomName(8);
+ $node = array(
+ 'title' => $title,
+ 'body' => $this->randomName(32),
+ 'uid' => $this->web_user->uid,
+ 'type' => 'article',
+ 'nid' => $test_nid,
+ 'is_new' => TRUE,
+ );
+ $node = (object)$node;
+ node_save($node);
+ // Test the import.
+ $node_by_nid = node_load($test_nid);
+ $this->assertTrue($node_by_nid, t('Node load by node ID.'));
+
+ $node_by_title = $this->drupalGetNodeByTitle($title);
+ $this->assertTrue($node_by_title, t('Node load by node title.'));
+ }
+}