resetAll(); // Add text formats Directly. $filtered_html_format = array( 'format' => 'filtered_html', 'name' => 'Filtered HTML', 'weight' => 0, 'filters' => array( // URL filter. 'filter_url' => array( 'weight' => 0, 'status' => 1, ), // HTML filter. 'filter_html' => array( 'weight' => 1, 'status' => 1, ), // Line break filter. 'filter_autop' => array( 'weight' => 2, 'status' => 1, ), // HTML corrector filter. 'filter_htmlcorrector' => array( 'weight' => 10, 'status' => 1, ), ), ); $filtered_html_format = (object) $filtered_html_format; filter_format_save($filtered_html_format); // Create a user and log her in for node type config. $this->admin_user = $this->drupalCreateUser(array( 'access content', 'administer site configuration', 'administer feeds', 'administer nodes', 'administer content types', 'bypass node access', )); $this->drupalLogin($this->admin_user); $types = array( array( 'type' => 'page', 'name' => 'Basic page', 'node_options[status]' => 1, 'node_options[promote]' => 0, ), array( 'type' => 'article', 'name' => 'Article', 'node_options[status]' => 1, 'node_options[promote]' => 1, ), ); foreach ($types as $type) { $this->drupalPost('admin/structure/types/add', $type, 'Save content type'); $this->assertText("The content type " . $type['name'] . " has been added."); } } /** * Absolute path to Drupal root. */ public function absolute() { return realpath(getcwd()); } /** * Get the absolute directory path of the feeds module. */ public function absolutePath() { return $this->absolute() .'/'. drupal_get_path('module', 'feeds'); } /** * Generate an OPML test feed. * * The purpose of this function is to create a dynamic OPML feed that points * to feeds included in this test. */ public function generateOPML() { $path = $GLOBALS['base_url'] .'/'. drupal_get_path('module', 'feeds') .'/tests/feeds/'; $output = ' Feeds test OPML Fri, 16 Oct 2009 02:53:17 GMT '; // UTF 8 encode output string and write it to disk $output = utf8_encode($output); $filename = file_default_scheme() . '://test-opml-'. $this->randomName() . '.opml'; $filename = file_unmanaged_save_data($output, $filename); return $filename; } /** * Create an importer configuration. * * @param $name * The natural name of the feed. * @param $id * The persistent id of the feed. * @param $edit * Optional array that defines the basic settings for the feed in a format * that can be posted to the feed's basic settings form. */ public function createImporterConfiguration($name = 'Syndication', $id = 'syndication') { // Create new feed configuration. $this->drupalGet('admin/structure/feeds'); $this->clickLink('New importer'); $edit = array( 'name' => $name, 'id' => $id, ); $this->drupalPost('admin/structure/feeds/create', $edit, 'Create'); // Assert message and presence of default plugins. $this->assertText('Your configuration has been created with default settings.'); $this->assertPlugins($id, 'FeedsHTTPFetcher', 'FeedsSyndicationParser', 'FeedsNodeProcessor'); // Per default attach to page content type. $this->setSettings($id, NULL, array('content_type' => 'page')); } /** * Choose a plugin for a importer configuration and assert it. * * @param $id * The importer configuration's id. * @param $plugin_key * The key string of the plugin to choose (one of the keys defined in * feeds_feeds_plugins()). */ public function setPlugin($id, $plugin_key) { if ($type = FeedsPlugin::typeOf($plugin_key)) { $edit = array( 'plugin_key' => $plugin_key, ); $this->drupalPost("admin/structure/feeds/edit/$id/$type", $edit, 'Save'); // Assert actual configuration. $config = unserialize(db_query("SELECT config FROM {feeds_importer} WHERE id = :id", array(':id' => $id))->fetchField()); $this->assertEqual($config[$type]['plugin_key'], $plugin_key, 'Verified correct '. $type .' ('. $plugin_key .').'); } } /** * Set importer or plugin settings. * * @param $id * The importer configuration's id. * @param $plugin * The plugin (class) name, or NULL to set importer's settings * @param $settings * The settings to set. */ public function setSettings($id, $plugin, $settings) { $this->drupalPost('admin/structure/feeds/edit/'. $id .'/settings/'. $plugin, $settings, 'Save'); $this->assertText('Your changes have been saved.'); } /** * Create a test feed node. Test user has to have sufficient permissions: * * * create [type] content * * use feeds * * Assumes that page content type has been configured with * createImporterConfiguration() as a feed content type. * * @return * The node id of the node created. */ public function createFeedNode($id = 'syndication', $feed_url = NULL, $title = '', $content_type = NULL) { if (empty($feed_url)) { $feed_url = $GLOBALS['base_url'] .'/'. drupal_get_path('module', 'feeds') .'/tests/feeds/developmentseed.rss2'; } // If content type not given, retrieve it. if (!$content_type) { $result= db_select('feeds_importer', 'f') ->condition('f.id', $id, '=') ->fields('f', array('config')) ->execute(); $config = unserialize($result->fetchField()); $content_type = $config['content_type']; $this->assertFalse(empty($content_type), 'Valid content type found: '. $content_type); } // Create a feed node. $edit = array( 'title' => $title, 'feeds[FeedsHTTPFetcher][source]' => $feed_url, ); $this->drupalPost('node/add/'. str_replace('_', '-', $content_type), $edit, 'Save'); $this->assertText('has been created.'); // Get the node id from URL. $nid = $this->getNid($this->getUrl()); // Check whether feed got recorded in feeds_source table. $query = db_select('feeds_source', 's') ->condition('s.id', $id, '=') ->condition('s.feed_nid', $nid, '='); $query->addExpression("COUNT(*)"); $result = $query->execute()->fetchField(); $this->assertEqual(1, $result); $source = db_select('feeds_source', 's') ->condition('s.id', $id, '=') ->condition('s.feed_nid', $nid, '=') ->fields('s', array('config')) ->execute()->fetch(); $config = unserialize($source->config); $this->assertEqual($config['FeedsHTTPFetcher']['source'], $feed_url, t('URL in DB correct.')); return $nid; } /** * Edit the configuration of a feed node to test update behavior. * * @param $nid * The nid to edit. * @param $feed_url * The new (absolute) feed URL to use. * @param $title * Optional parameter to change title of feed node. */ public function editFeedNode($nid, $feed_url, $title = '') { $edit = array( 'title' => $title, 'feeds[FeedsHTTPFetcher][source]' => $feed_url, ); // Check that the update was saved. $this->drupalPost('node/' . $nid . '/edit', $edit, 'Save'); $this->assertText('has been updated.'); // Check that the URL was updated in the feeds_source table. //$source = db_query("SELECT * FROM {feeds_source} WHERE feed_nid = :nid", array(':nid' => $nid))->fetch(); $source = db_select('feeds_source', 's') ->condition('s.feed_nid', $nid, '=') ->fields('s', array('config')) ->execute()->fetch(); $config = unserialize($source->config); $this->assertEqual($config['FeedsHTTPFetcher']['source'], $feed_url, t('URL in DB correct.')); } /** * Batch create a variable amount of feed nodes. All will have the * same URL configured. * * @return * An array of node ids of the nodes created. */ public function createFeedNodes($id = 'syndication', $num = 20, $content_type = NULL) { $nids = array(); for ($i = 0; $i < $num; $i++) { $nids[] = $this->createFeedNode($id, NULL, $this->randomName(), $content_type); } return $nids; } /** * Import a URL through the import form. Assumes FeedsHTTPFetcher in place. */ public function importURL($id, $feed_url = NULL) { if (empty($feed_url)) { $feed_url = $GLOBALS['base_url'] .'/'. drupal_get_path('module', 'feeds') .'/tests/feeds/developmentseed.rss2'; } $edit = array( 'feeds[FeedsHTTPFetcher][source]' => $feed_url, ); $nid = $this->drupalPost('import/'. $id, $edit, 'Import'); // Check whether feed got recorded in feeds_source table. $this->assertEqual(1, db_query("SELECT COUNT(*) FROM {feeds_source} WHERE id = :id AND feed_nid = 0", array(':id' => $id))->fetchField()); $source = db_query("SELECT * FROM {feeds_source} WHERE id = :id AND feed_nid = 0", array(':id' => $id))->fetch(); $config = unserialize($source->config); $this->assertEqual($config['FeedsHTTPFetcher']['source'], $feed_url, t('URL in DB correct.')); // Check whether feed got properly added to scheduler. $this->assertEqual(1, db_query("SELECT COUNT(*) FROM {job_schedule} WHERE type = :id AND id = 0 AND name = 'feeds_source_import' AND last <> 0 AND scheduled = 0", array(':id' => $id))->fetchField()); // There must be only one entry for callback 'expire' - no matter what the feed_nid is. $this->assertEqual(0, db_query("SELECT COUNT(*) FROM {job_schedule} WHERE type = :id AND name = 'feeds_importer_expire' AND last <> 0 AND scheduled = 0", array(':id' => $id))->fetchField()); } /** * Import a file through the import form. Assumes FeedsFileFetcher in place. */ public function importFile($id, $file) { $this->assertTrue(file_exists($file), 'Source file exists'); $edit = array( 'files[feeds]' => $file, ); $this->drupalPost('import/'. $id, $edit, 'Import'); } /** * Assert a feeds configuration's plugins. * * @deprecated: * Use setPlugin() instead. * * @todo Refactor users of assertPlugin() and make them use setPugin() instead. */ public function assertPlugins($id, $fetcher, $parser, $processor) { // Assert actual configuration. $config = unserialize(db_query("SELECT config FROM {feeds_importer} WHERE id = :id", array(':id' => $id))->fetchField()); $this->assertEqual($config['fetcher']['plugin_key'], $fetcher, 'Correct fetcher'); $this->assertEqual($config['parser']['plugin_key'], $parser, 'Correct parser'); $this->assertEqual($config['processor']['plugin_key'], $processor, 'Correct processor'); } /** * Add mappings to a given configuration. * * @param $mappings * An array of mapping arrays. Each mapping array must have a source and * an target key and can have a unique key. * * @see FeedsRSStoDataTest class. */ public function addMappings($id, $mappings) { $path = 'admin/structure/feeds/edit/'. $id .'/mapping'; // Iterate through all mappings and add the via the form. foreach ($mappings as $i => $mapping) { // Get unique flag and unset it - otherwise drupalPost will complain that // there is no form element named "unique". $unique = !empty($mapping['unique']); unset($mapping['unique']); $this->drupalPost($path, $mapping, t('Add')); // If unique was set, set the last mapping's unique flag. if ($unique) { $edit = array( 'unique_flags['. $i .']' => 1, ); $this->drupalPost($path, $edit, t('Save')); } } } /** * Helper function, retrieves node id from a URL. */ public function getNid($url) { $matches = array(); preg_match('/node\/(\d+?)$/', $url, $matches); $nid = $matches[1]; if (!is_numeric($nid)) { $this->error(t('Could not find node id, found @nid instead.', array('@nid' => $nid))); } return $nid; } /** * Copies a directory. */ public function copyDir($source, $dest) { $result = file_prepare_directory($dest, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS); foreach (@scandir($source) as $file) { if (is_file("$source/$file")) { $file = file_unmanaged_copy("$source/$file", "$dest/$file"); } } } }