View source
<?php
require_once 'ServicesWebTestCase.php';
class ServicesResourceNodetests extends ServicesWebtestCase {
protected $privilegedUser = NULL;
protected $endpoint = NULL;
public function setUp() {
parent::setUp('taxonomy', 'autoload', 'ctools', 'services', 'rest_server', 'inputstream', 'upload', 'comment');
$this->endpoint = $this
->saveNewEndpoint();
}
public static function getInfo() {
return array(
'name' => t('Resource Node'),
'description' => t('Test the resource Node methods and actions.'),
'group' => t('Services'),
);
}
public function testNewEndpointResourceNodeIndex() {
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
'perform unlimited index queries',
));
$this
->drupalLogin($this->privilegedUser);
$nodes = array();
$count = 50;
for ($i = 0; $i < $count; $i++) {
$node = $this
->drupalCreateNode();
$nodes[$node->nid] = $node;
}
$page_count = ceil(count($nodes) / 20);
$retrieved_nodes = array();
for ($page = 0; $page < $page_count; $page++) {
$responseArray = $this
->servicesGet($this->endpoint->path . '/node', array(
'page' => $page,
'fields' => 'nid,title',
));
$this
->assertTrue(count($responseArray['body']) <= 20, t('Correct number of items returned'));
foreach ($responseArray['body'] as $node) {
if (isset($retrieved_nodes[$node->nid])) {
$this
->fail(t('Duplicate node @nid returned.', array(
'@nid' => $node->nid,
)));
}
$retrieved_nodes[$node->nid] = TRUE;
$this
->assertTrue($nodes[$node->nid]->title == $node->title, t('Successfully received Node info'), 'NodeResource: Index');
}
}
$expected_nids = array_keys($nodes);
sort($expected_nids);
$retrieved_nids = array_keys($retrieved_nodes);
sort($retrieved_nids);
$this
->assertEqual($expected_nids, $retrieved_nids, t('Retrieved all nodes'));
$responseArray = $this
->servicesGet($this->endpoint->path . '/node', array(
'page' => $page_count + 1,
));
$this
->assertEqual(count($responseArray['body']), 0, t('The n+1 page is empty'));
$responseArray = $this
->servicesGet($this->endpoint->path . '/node', array(
'fields' => 'nid,title',
'pagesize' => 40,
));
$this
->assertTrue(count($responseArray['body']) == 40, t('Correct number of items returned'));
$this->lessPrivilegedUser = $this
->drupalCreateUser(array(
'administer services',
));
$this
->drupalLogin($this->lessPrivilegedUser);
$responseArray = $this
->servicesGet($this->endpoint->path . '/node', array(
'fields' => 'nid,title',
'pagesize' => 40,
));
$this
->assertTrue(count($responseArray['body']) == 20, t('Correct number of items returned'));
}
public function testNewEndpointResourceNodeGet() {
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
));
$this
->drupalLogin($this->privilegedUser);
$node = $this
->drupalCreateNode();
$responseArray = $this
->servicesGet($this->endpoint->path . '/node/' . $node->nid);
$this
->assertTrue($node->title == $responseArray['body']->title, t('Successfully received Node info'), 'NodeResource: Retrieve');
unset($node);
$responseArray = $this
->servicesGet($this->endpoint->path . '/node/99');
$this
->assertTrue($responseArray['code'] == '404', t('Successfully was rejected to non existent node'), 'NodeResource: Retrieve');
}
public function testEndpointResourceNodeCreate() {
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
'administer nodes',
));
$this
->drupalLogin($this->privilegedUser);
$node = array(
'title' => 'testing',
'body' => 'bodytest',
'type' => 'story',
'name' => $this->privilegedUser->name,
);
$responseArray = $this
->servicesPost($this->endpoint->path . '/node', $node);
$nodeResourceCreateReturn = $responseArray['body'];
$this
->assertTrue(isset($nodeResourceCreateReturn['nid']), t('Node was successfully created'), 'NodeResource: Create');
if (isset($nodeResourceCreateReturn['nid'])) {
$newNode = node_load($nodeResourceCreateReturn['nid']);
$this
->assertTrue($newNode->title = $node['title'], t('Title was the same'), 'NodeResource: Create');
$this
->assertTrue($newNode->body = $node['body'], t('Body was the same'), 'NodeResource: Create');
}
}
public function testEndpointResourceNodeCreateLegacy() {
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
'administer nodes',
));
$this
->drupalLogin($this->privilegedUser);
$node = array(
'title' => 'testing',
'body' => 'bodytest',
'type' => 'story',
'name' => $this->privilegedUser->name,
);
$responseArray = $this
->servicesPost($this->endpoint->path . '/node', array(
'node' => $node,
));
$nodeResourceCreateReturn = $responseArray['body'];
$this
->assertTrue(isset($nodeResourceCreateReturn['nid']), t('Node was successfully created'), 'NodeResource: Create (Legacy)');
if (isset($nodeResourceCreateReturn['nid'])) {
$newNode = node_load($nodeResourceCreateReturn['nid']);
$this
->assertTrue($newNode->title = $node['title'], t('Title was the same'), 'NodeResource: Create (Legacy)');
$this
->assertTrue($newNode->body = $node['body'], t('Body was the same'), 'NodeResource: Create (Legacy)');
}
}
public function testEndpointResourceNodeCreateFail() {
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
));
$this
->drupalLogin($this->privilegedUser);
$node = array(
'title' => 'testing',
'body' => 'bodytest',
'type' => 'story',
'name' => $this->privilegedUser->name,
);
$responseArray = $this
->servicesPost($this->endpoint->path . '/node', $node);
$this
->assertTrue($responseArray['code'] == 401, t('User with not sufficient permissions cannot create node'), 'NodeResource: Create');
}
public function testEndpointResourceNodeCreateMissingTitle() {
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
'administer nodes',
));
$this
->drupalLogin($this->privilegedUser);
$node = array(
'title' => '',
'body' => 'bodytest',
'name' => $this->privilegedUser->name,
'type' => 'page',
);
$response_array = $this
->servicesPost($this->endpoint->path . '/node', $node);
$this
->assertEqual($response_array['body'], t('Title field is required.'), t('Node was not created without title.'), 'NodeResource: Created');
}
public function testEndpointResourceNodeCreateWithTaxonomyTerms() {
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
'administer nodes',
'administer taxonomy',
));
$this
->drupalLogin($this->privilegedUser);
$edit = array(
'name' => $this
->randomName(),
'multiple' => 1,
'nodes[page]' => 1,
);
$this
->drupalPost('admin/content/taxonomy/add/vocabulary', $edit, t('Save'));
for ($i = 0; $i < 3; $i++) {
$term = array(
'name' => $this
->randomName(),
);
$this
->drupalPost('admin/content/taxonomy/1/add/term', $term, t('Save'));
}
$node = array(
'nid' => NULL,
'title' => $this
->randomString(),
'body' => $this
->randomString(),
'name' => $this->privilegedUser->name,
'type' => 'page',
'taxonomy' => array(
1 => array(
1 => 1,
2 => 2,
),
),
);
$response = $this
->servicesPost($this->endpoint->path . '/node', $node);
$terms_number = db_result(db_query('SELECT COUNT(*) result FROM {term_node} r INNER JOIN {node} n ON n.vid = r.vid WHERE n.nid = %d', $response['body']['nid']));
$this
->assertTrue($terms_number == 2, t('Node with two terms was successfully created.'), 'NodeResource: Create');
}
function testCommentLoadNodeComments() {
$path = $this->endpoint->path;
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
));
$this
->drupalLogin($this->privilegedUser);
$settings = array(
'comment' => COMMENT_NODE_READ_WRITE,
);
$node = $this
->drupalCreateNode($settings);
$nid = $node->nid;
$comments = array();
for ($i = 0; $i < 15; $i++) {
$comment = array(
'uid' => $this->privilegedUser->uid,
'nid' => $nid,
'subject' => $this
->randomString(),
'comment' => $this
->randomString(),
);
$cid = comment_save($comment);
$comments[] = _comment_load($cid);
}
$comments = array_reverse($comments);
$settings = array(
'comment' => COMMENT_NODE_READ_WRITE,
);
$node2 = $this
->drupalCreateNode($settings);
for ($i = 0; $i < 5; $i++) {
$comment = array(
'uid' => $this->privilegedUser->uid,
'nid' => $node2->nid,
'subject' => $this
->randomString(),
'comment' => $this
->randomString(),
);
$cid = comment_save($comment);
}
$response = $this
->servicesGet($path . '/node/' . $nid . '/comments');
$this
->assertEqual($comments, $response['body'], t('Received all 15 comments.'), 'NodeResource: comments');
$response = $this
->servicesGet($path . '/node/' . $nid . '/comments', array(
'count' => 5,
));
$this
->assertEqual(array_slice($comments, 0, 5), array_slice($response['body'], 0, 5), t('Received last 5 comments.'), 'NodeResource: comments');
$response = $this
->servicesGet($path . '/node/' . $nid . '/comments', array(
'count' => 5,
'offset' => 5,
));
$this
->assertEqual(array_slice($comments, 5, 5), array_merge(array(), $response['body']), t('Received 5 comments starting from fifth comment.'), 'NodeResource: comments');
}
public function testNodeRelationshipFiles() {
$this->privileged_user = $this
->drupalCreateUser(array(
'get own binary files',
'save file information',
'administer services',
'administer site configuration',
'upload files',
));
$this
->drupalLogin($this->privileged_user);
$testfiles = $this
->drupalGetTestFiles('text');
$testfile1 = $this
->uploadTestFile($testfiles);
$testfile2 = $this
->uploadTestFile($testfiles);
$testfile3 = $this
->uploadTestFile($testfiles);
$testfile1['new'] = TRUE;
$testfile2['new'] = TRUE;
$testfile3['new'] = TRUE;
$testfile1['list'] = 1;
$testfile2['list'] = 1;
$testfile3['list'] = 0;
$settings = array(
'files' => array(
$testfile1['fid'] => (object) $testfile1,
$testfile2['fid'] => (object) $testfile2,
$testfile3['fid'] => (object) $testfile3,
),
);
$node = $this
->drupalCreateNode($settings);
$result = $this
->servicesGet($this->endpoint->path . '/node/' . $node->nid . '/files');
$this
->assertTrue(isset($result['body'][$testfile1['fid']]) && isset($result['body'][$testfile2['fid']]) && !isset($result['body'][$testfile3['fid']]), t('Attached files listed.'), 'FileResource: nodeFiles');
}
public function testEndpointResourceNodeUpdate() {
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
'administer nodes',
));
$this
->drupalLogin($this->privilegedUser);
$node = $this
->drupalCreateNode();
$node_update = array(
'title' => 'testing',
'body' => 'bodytest',
'type' => 'page',
'name' => $this->privilegedUser->name,
);
$responseArray = $this
->servicesPut($this->endpoint->path . '/node/' . $node->nid, $node_update);
$nodeAfterUpdate = node_load($responseArray['body']['nid']);
$this
->assertTrue(isset($nodeAfterUpdate->nid), t('Node was successfully updated'), 'NodeResource: Updated');
if (isset($nodeAfterUpdate->nid)) {
$this
->assertTrue($nodeAfterUpdate->title == $node_update['title'], t('Title was the same'), 'NodeResource: Update');
$this
->assertTrue($nodeAfterUpdate->body == $node_update['body'], t('Body was the same'), 'NodeResource: Update');
}
$node_update_no_type = $node_update;
unset($node_update_no_type['type']);
$node_update_no_type['title'] = $this
->randomName();
$responseArray = $this
->servicesPut($this->endpoint->path . '/node/' . $node->nid, $node_update_no_type);
$this
->assertNotEqual($responseArray['code'], 200, t('Can\'t update node without specifying node type'), 'NodeResource: Update');
}
public function testEndpointResourceNodeUpdateLegacy() {
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
'administer nodes',
));
$this
->drupalLogin($this->privilegedUser);
$node = $this
->drupalCreateNode();
$node_update = array(
'title' => 'testing',
'body' => 'bodytest',
'type' => 'page',
'name' => $this->privilegedUser->name,
);
$responseArray = $this
->servicesPut($this->endpoint->path . '/node/' . $node->nid, array(
'node' => $node_update,
));
$nodeAfterUpdate = node_load($responseArray['body']['nid']);
$this
->assertTrue(isset($nodeAfterUpdate->nid), t('Node was successfully updated'), 'NodeResource: Updated (Legacy)');
if (isset($nodeAfterUpdate->nid)) {
$this
->assertTrue($nodeAfterUpdate->title == $node_update['title'], t('Title was the same'), 'NodeResource: Update (Legacy)');
$this
->assertTrue($nodeAfterUpdate->body == $node_update['body'], t('Body was the same'), 'NodeResource: Update (Legacy)');
}
}
public function testEndpointResourceNodeUpdatePermFail() {
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
'create story content',
'edit own story content',
));
$this
->drupalLogin($this->privilegedUser);
$node = $this
->drupalCreateNode(array(
'uid' => 1,
));
$node_update = array(
'title' => 'testing',
'body' => 'bodytest',
'type' => 'page',
);
$responseArray = $this
->servicesPut($this->endpoint->path . '/node/' . $node->nid, $node_update);
$this
->assertTrue(strpos($responseArray['status'], 'Access denied for user'), t('Updating the node failed without needed permissions. This is good!'), 'NodeResource: Update');
}
public function testEndpointResourceNodeUpdateMissingTitle() {
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
'administer nodes',
));
$this
->drupalLogin($this->privilegedUser);
$node = $this
->drupalCreateNode();
$node_update = array(
'title' => '',
'body' => 'bodytest',
'name' => $this->privilegedUser->name,
'type' => 'page',
);
$responseArray = $this
->servicesPut($this->endpoint->path . '/node/' . $node->nid, $node_update);
$this
->assertTrue(strpos($responseArray['status'], 'Title field is required.'), t('Node was not updated without title.'), 'NodeResource: Update');
}
public function testEndpointResourceNodeDelete() {
$this->privilegedUser = $this
->drupalCreateUser(array(
'administer services',
'administer nodes',
));
$this
->drupalLogin($this->privilegedUser);
$node = $this
->drupalCreateNode();
$data = '';
$responseArray = $this
->servicesDelete($this->endpoint->path . '/node/' . $node->nid, $data);
$deleted_node = node_load($node->nid, NULL, TRUE);
$this
->assertTrue(empty($deleted_node), t('Node was deleted.'), 'NodeResource: Deleted');
$responseArray = $this
->servicesDelete($this->endpoint->path . '/node/' . $node->nid, $data);
$this
->assertFalse($responseArray['code'] == 200, t('Node was deleted. It shoudlnt have been because it doesnt exist'), 'NodeResource: Deleted');
}
public function uploadTestFile($file = NULL) {
if (empty($file)) {
$file = next($this->testfiles);
}
$testfile = array(
'fid' => NULL,
'uid' => $this->privileged_user->uid,
'filename' => trim(basename($file->filename), '.'),
'filepath' => $file->filename,
'filemime' => file_get_mimetype($file->filename),
'filesize' => filesize($file->filename),
'status' => FILE_STATUS_PERMANENT,
'timestamp' => time(),
);
$source = $testfile['filepath'];
$destination = file_directory_path() . '/' . $testfile['filepath'];
$dirname = dirname($destination);
file_check_directory($dirname, FILE_CREATE_DIRECTORY);
file_copy($source, $destination);
drupal_write_record('files', $testfile);
return $testfile;
}
}