t('Blog API functionality'), 'description' => t('Create, edit, and delete post; upload file; and set/get categories.'), 'group' => t('Blog API'), ); } function setUp() { parent::setUp('blog', 'blogapi', 'taxonomy'); // Force loading the xmlrpc.inc to have the xmlrpc() function. drupal_function_exists('xmlrpc'); } /** * Create, edit, and delete post; upload file; set/get categories. */ function testBlogAPI() { global $base_url; // Create user. $web_user = $this->drupalCreateUser(array('create blog content', 'delete own blog content', 'edit own blog content', 'administer content with blog api')); // Create admin user and taxonomy for later use. $admin_user = $this->drupalCreateUser(array('administer taxonomy')); $this->drupalLogin($admin_user); $vid = $this->addVocabulary('simpletest_vocab'); $term_1 = $this->addTerm($vid, 'simpletest_term1'); $term_2 = $this->addTerm($vid, 'simpletest_term2'); // Init common variables. $local = url($base_url . '/xmlrpc.php', array('external' => TRUE)); $appid = 'simpletest'; // Get user's blog. $result = xmlrpc($local, 'blogger.getUsersBlogs', $appid, $web_user->name, $web_user->pass_raw); $this->assertTrue($result, t('Request for user\'s blogs returned correctly.')); if ($result !== FALSE) { if ($this->assertTrue(array_key_exists('blogid', $result[0]), t('Blog found.'))) { $blog_id = $result[0]['blogid']; } } // Create post. $content = $this->randomName(32); $result = xmlrpc($local, 'blogger.newPost', $appid, $blog_id, $web_user->name, $web_user->pass_raw, $content, TRUE); $this->assertTrue($result, t('Post created.')); $nid = $result; // Check recent posts. $result = xmlrpc($local, 'blogger.getRecentPosts', $appid, $blog_id, $web_user->name, $web_user->pass_raw, 5); $this->assertTrue($result, t('Recent post list retrieved.')); if ($result !== FALSE && array_key_exists('title', $result[0])) { $this->assertEqual($content, $result[0]['title'], t('Post found.')); } else { $this->fail(t('Post found.')); } // Edit post. $content_new = $this->randomName(10); $result = xmlrpc($local, 'blogger.editPost', $appid, $nid, $web_user->name, $web_user->pass_raw, $content_new, TRUE); $this->assertTrue($result, t('Post successfully modified.')); // Upload file. $file = current($this->drupalGetTestFiles('text')); $file_contents = file_get_contents($file->filepath); $file = array(); $file['name'] = $this->randomName() . '.txt'; $file['type'] = 'text'; $file['bits'] = xmlrpc_base64($file_contents); $result = xmlrpc($local, 'metaWeblog.newMediaObject', $blog_id, $web_user->name, $web_user->pass_raw, $file); $this->assertTrue($result, t('File successfully uploaded.')); $url = (array_key_exists('url', $result) ? $result['url'] : ''); // Check uploaded file. $this->drupalGet($url); $this->assertEqual($this->drupalGetContent(), $file_contents, t('Uploaded contents verified.')); // Set post categories. $categories = array(array('categoryId' => $term_1)); $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, $categories); $this->assertTrue($result, t('Post categories set.')); // Get post categories. $result = xmlrpc($local, 'mt.getPostCategories', $nid, $web_user->name, $web_user->pass_raw); $this->assertTrue($result, t('Category list successfully retrieved.')); if ($result !== FALSE && isset($result[0]['categoryId'])) { $this->assertEqual($term_1, $result[0]['categoryId'], t('Category list verified.')); } // Test validation of category assignment. // Set post categories. $categories[] = array('categoryId' => $term_2); $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, $categories); $this->assertFalse($result, t('Post categories fail validation (attempt to post two when one is allowed).')); // Change to required. $this->updateVocabulary($vid, 'simpletest_vocab1', FALSE, TRUE); $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, array()); $this->assertFalse($result, t("Post categories fail validation (none posted when it's required).")); // Change to allowing multiple, not required. $this->updateVocabulary($vid, 'simpletest_vocab1', TRUE, FALSE); $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, $categories); $this->assertTrue($result, t('Post categories pass validation (multiple allowed).')); $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, array()); $this->assertTrue($result, t('Post categories pass validation (multiple allowed, none posted).')); // Change to multiple, but required. $this->updateVocabulary($vid, 'simpletest_vocab1', TRUE, TRUE); $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, $categories); $this->assertTrue($result, t('Post categories pass validation (multiple allowed).')); $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, array()); $this->assertFalse($result, t("Post categories fail validation (none posted when it's required).")); // Try to add a non-existent term. $categories[] = array('categoryId' => $term_2 + 1); $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, $categories); $this->assertFalse($result, t('Post categories fail validation (unknown term).')); // Delete post. $result = xmlrpc($local, 'blogger.deletePost', $appid, $nid, $web_user->name, $web_user->pass_raw, TRUE); $this->assertTrue($result, t('Post successfully deleted.')); } /** * Add taxonomy vocabulary. * * @param string $vocab * Vocabulary name. * @return integer * The vocab ID. */ function addVocabulary($vocab) { // Create a vocabulary. $vocabulary = new stdClass(); $vocabulary->name = $vocab; $vocabulary->description = $this->randomName(); $vocabulary->machine_name = $this->randomName(); $vocabulary->help = ''; $vocabulary->nodes = array('blog' => 'blog'); $vocabulary->weight = mt_rand(0, 10); taxonomy_vocabulary_save($vocabulary); return $vocabulary->vid; } /** * Update a taxonomy vocabulary. * * @param $vocab * Vocabulary name. * @return integer * The vocab ID. */ function updateVocabulary($vid, $vocab, $multiple = FALSE, $required = FALSE) { $vocabulary = taxonomy_vocabulary_load($vid); $vocabulary->name = $vocab; $vocabulary->nodes = array('blog' => 'blog'); $vocabulary->multiple = $multiple; $vocabulary->required = $required; taxonomy_vocabulary_save($vocabulary); } /** * Add a taxonomy term to vocabulary. * * @param integer $vid * Vocabulary ID. * @param string $term * Term name. * @return integer * The Term ID. */ function addTerm($vid, $term_name) { $term = new stdClass(); $term->name = $term_name; $term->vid = $vid; taxonomy_term_save($term); return $term->tid; } }