'RSS import to nodes', 'description' => 'Tests a feed configuration that is attached to a content type, uses HTTP fetcher, common syndication parser and a node processor. Repeats the same test for an importer configuration that is not attached to a content type and for a configuration that is attached to a content type and uses the file fetcher.', 'group' => 'Feeds', ); } /** * Set up test. */ public function setUp() { parent::setUp(); // Set the front page to show 20 nodes so we can easily see what is aggregated. variable_set('default_nodes_main', 20); // Set the teaser length display to unlimited otherwise tests looking for // text on nodes will fail. variable_set('teaser_length', 0); // Create an importer configuration. $this->createImporterConfiguration('Syndication', 'syndication'); $this->addMappings('syndication', array( array( 'source' => 'title', 'target' => 'title', 'unique' => FALSE, ), array( 'source' => 'description', 'target' => 'body', 'unique' => FALSE, ), array( 'source' => 'timestamp', 'target' => 'created', 'unique' => FALSE, ), array( 'source' => 'url', 'target' => 'url', 'unique' => TRUE, ), array( 'source' => 'guid', 'target' => 'guid', 'unique' => TRUE, ), ) ); } /** * Test node creation, refreshing/deleting feeds and feed items. */ public function test() { $nid = $this->createFeedNode(); // Assert 10 items aggregated after creation of the node. $this->assertText('Created 10 Story nodes.'); $story_nid = db_result(db_query_range('SELECT nid FROM {node} WHERE type = "story"', 0, 1)); $this->assertEqual("Created/updated by FeedsNodeProcessor", db_result(db_query("SELECT nr.log FROM {node} n JOIN {node_revisions} nr ON n.vid = nr.vid WHERE n.nid = %d", $story_nid))); // Navigate to feed node, there should be Feeds tabs visible. $this->drupalGet('node/'. $nid); $this->assertRaw('node/'. $nid .'/import'); $this->assertRaw('node/'. $nid .'/delete-items'); // Assert accuracy of aggregated information. $this->drupalGet('node'); $this->assertPattern('/(.*?)Anonymous<\/span>/'); $this->assertText('Open Atrium Translation Workflow: Two Way Translation Updates'); $this->assertText('Tue, 10/06/2009'); $this->assertText('A new translation process for Open Atrium & integration with Localize Drupal'); $this->assertText('Week in DC Tech: October 5th Edition'); $this->assertText('Mon, 10/05/2009'); $this->assertText('There are some great technology events happening this week'); $this->assertText('Mapping Innovation at the World Bank with Open Atrium'); $this->assertText('Fri, 10/02/2009'); $this->assertText('Open Atrium is being used as a base platform for collaboration'); $this->assertText('September GeoDC Meetup Tonight'); $this->assertText('Wed, 09/30/2009'); $this->assertText('Today is the last Wednesday of the month'); $this->assertText('Week in DC Tech: September 28th Edition'); $this->assertText('Mon, 09/28/2009'); $this->assertText('Looking to geek out this week? There are a bunch of'); $this->assertText('Open Data for Microfinance: The New MIXMarket.org'); $this->assertText('Thu, 09/24/2009'); $this->assertText('There are profiles for every country that the MIX Market is hosting.'); $this->assertText('Integrating the Siteminder Access System in an Open Atrium-based Intranet'); $this->assertText('Tue, 09/22/2009'); $this->assertText('In addition to authentication, the Siteminder system'); $this->assertText('Week in DC Tech: September 21 Edition'); $this->assertText('Mon, 09/21/2009'); $this->assertText('an interesting variety of technology events happening in Washington, DC '); $this->assertText('s Software Freedom Day: Impressions & Photos'); $this->assertText('Mon, 09/21/2009'); $this->assertText('Presenting on Features in Drupal and Open Atrium'); $this->assertText('Scaling the Open Atrium UI'); $this->assertText('Fri, 09/18/2009'); $this->assertText('The first major change is switching'); // Assert DB status. $count = db_result(db_query("SELECT COUNT(*) FROM {node} n INNER JOIN {feeds_node_item} fn ON n.nid = fn.nid")); $this->assertEqual($count, 10, 'Accurate number of items in database.'); // Assert default input format on first imported feed node. $format = db_result(db_query_range("SELECT nr.format FROM {feeds_node_item} fi JOIN {node} n ON fi.nid = n.nid JOIN {node_revisions} nr ON n.vid = nr.vid", 0, 1)); $this->assertEqual($format, FILTER_FORMAT_DEFAULT, 'Using default Input format.'); // Import again. $this->drupalPost('node/'. $nid .'/import', array(), 'Import'); $this->assertText('There is no new content.'); // Assert DB status, there still shouldn't be more than 10 items. $count = db_result(db_query("SELECT COUNT(*) FROM {node} n INNER JOIN {feeds_node_item} fn ON n.nid = fn.nid")); $this->assertEqual($count, 10, 'Accurate number of items in database.'); // All of the above tests should have produced published nodes, set default // to unpublished, import again. $count = db_result(db_query("SELECT COUNT(*) FROM {node} n INNER JOIN {feeds_node_item} fn ON n.nid = fn.nid WHERE n.status = 1")); $this->assertEqual($count, 10, 'All items are published.'); $edit = array( 'node_options[status]' => FALSE, ); $this->drupalPost('admin/content/node-type/story', $edit, t('Save content type')); $this->drupalPost('node/'. $nid .'/delete-items', array(), 'Delete'); $this->drupalPost('node/'. $nid .'/import', array(), 'Import'); $count = db_result(db_query("SELECT COUNT(*) FROM {node} n INNER JOIN {feeds_node_item} fn ON n.nid = fn.nid WHERE n.status = 0")); $this->assertEqual($count, 10, 'No items are published.'); $edit = array( 'node_options[status]' => TRUE, ); $this->drupalPost('admin/content/node-type/story', $edit, t('Save content type')); $this->drupalPost('node/'. $nid .'/delete-items', array(), 'Delete'); // Enable replace existing and import updated feed file. $this->drupalPost('node/'. $nid .'/import', array(), 'Import'); $this->setSettings('syndication', 'FeedsNodeProcessor', array('update_existing' => 1)); $feed_url = $GLOBALS['base_url'] .'/'. drupal_get_path('module', 'feeds') .'/tests/feeds/developmentseed_changes.rss2'; $this->editFeedNode($nid, $feed_url); $this->drupalPost('node/' . $nid . '/import', array(), 'Import'); $this->assertText('Updated 2 Story nodes.'); // Assert accuracy of aggregated content (check 2 updates, one original). $this->drupalGet('node'); $this->assertText('Managing News Translation Workflow: Two Way Translation Updates'); $this->assertText('Presenting on Features in Drupal and Managing News'); $this->assertText('Scaling the Open Atrium UI'); // Import again. $this->drupalPost('node/'. $nid .'/import', array(), 'Import'); $this->assertText('There is no new content.'); // Assert DB status, there still shouldn't be more than 10 items. $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_node_item}")); $this->assertEqual($count, 10, 'Accurate number of items in database.'); // Now delete all items. $this->drupalPost('node/'. $nid .'/delete-items', array(), 'Delete'); $this->assertText('Deleted 10 nodes.'); // Assert DB status, now there should be no items. $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_node_item}")); $this->assertEqual($count, 0, 'Accurate number of items in database.'); // Change author. $author = $this->drupalCreateUser(); $this->setSettings('syndication', 'FeedsNodeProcessor', array('author' => $author->name)); // Change input format. $this->setSettings('syndication', 'FeedsNodeProcessor', array('input_format' => FILTER_FORMAT_DEFAULT + 1)); // Import again. $this->drupalPost('node/'. $nid .'/import', array(), 'Import'); $this->assertText('Created 10 Story nodes.'); // Assert author. $this->drupalGet('node'); $this->assertPattern('/(.*?)'. check_plain($author->name) .'<\/span>/'); $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_node_item} fi JOIN {node} n ON fi.nid = n.nid WHERE n.uid = %d", $author->uid)); $this->assertEqual($count, 10, 'Accurate number of items in database.'); // Assert input format. $format = db_result(db_query_range("SELECT nr.format FROM {feeds_node_item} fi JOIN {node} n ON fi.nid = n.nid JOIN {node_revisions} nr ON n.vid = nr.vid", 0, 1)); $this->assertEqual($format, FILTER_FORMAT_DEFAULT + 1, 'Set non-default Input format.'); // Set to update existing, remove authorship of above nodes and import again. $this->setSettings('syndication', 'FeedsNodeProcessor', array('update_existing' => 2)); $result = db_query("SELECT nid FROM {node} n INNER JOIN {feeds_node_item} USING (nid)"); while ($reset_nid = db_result($result)) { db_query("UPDATE {node} SET uid = 0 WHERE nid = %d", $reset_nid); db_query("UPDATE {feeds_node_item} SET hash = '' WHERE nid = %d", $reset_nid); } $this->drupalPost('node/'. $nid .'/import', array(), 'Import'); $this->drupalGet('node'); $this->assertNoPattern('/