t('RSS import to nodes'), 'description' => t('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' => t('Feeds'), ); } /** * Set up test. */ public function setUp() { parent::setUp('feeds', 'feeds_ui', 'ctools', 'job_scheduler'); $this->drupalLogin( $this->drupalCreateUser( array( 'administer feeds', 'administer nodes', 'administer content types', ) ) ); } /** * Test node creation, refreshing/deleting feeds and feed items. */ public function test() { // Set the teaser length to unlimited otherwise tests looking for text on // nodes will fail. $edit = array( 'teaser_length' => 0, ); $this->drupalPost('admin/content/node-settings', $edit, 'Save configuration'); // 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, ), ) ); $nid = $this->createFeedNode(); // Assert 10 items aggregated after creation of the node. $this->assertText('Created 10 Story nodes.'); // 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'); // Navigate to a non-feed node, there should be no Feeds tabs visible. $story_nid = db_result(db_query_range('SELECT nid FROM {node} WHERE type = "story"', 0, 1)); $this->drupalGet('node/'. $story_nid); $this->assertNoRaw('node/'. $story_nid .'/import'); $this->assertNoRaw('node/'. $story_nid .'/delete-items'); $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))); // 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)); db_query("UPDATE {node} n JOIN {feeds_node_item} fi ON n.nid = fi.nid SET n.uid = 0, fi.hash=''"); $this->drupalPost('node/'. $nid .'/import', array(), 'Import'); $this->drupalGet('node'); $this->assertNoPattern('/