Index: modules/aggregator/aggregator.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.test,v
retrieving revision 1.5
diff -u -r1.5 aggregator.test
--- modules/aggregator/aggregator.test	3 Aug 2008 18:16:51 -0000	1.5
+++ modules/aggregator/aggregator.test	16 Aug 2008 14:24:50 -0000
@@ -522,3 +522,143 @@
     $this->submitImportForm();
   }
 }
+
+class FeedParserTestCase extends AggregatorTestCase {
+  /**
+   * Implementation of getInfo().
+   */
+  function getInfo() {
+    return array(
+      'name' => t('Feed parser tests'),
+      'description' => t("Test Aggregator's built-in feed parser with valid feed samples."),
+      'group' => t('Aggregator'),
+    );
+  }
+
+  function testFeedParser() {
+    $this->_testAtomEntryLinkSample();
+  }
+
+  function addUpdateFeed($edit) {
+    $this->drupalGet($edit['url']);
+    $this->assertResponse(array(200), t('URL !url is accessible', array('!url' => $edit['url'])));
+
+    $this->drupalPost('admin/content/aggregator/add/feed', $edit, t('Save'));
+    $this->assertRaw(t('The feed %name has been added.', array('%name' => $edit['title'])), t('The feed !name has been added.', array('!name' => $edit['title'])));
+
+    $feed = db_fetch_object(db_query("SELECT * FROM {aggregator_feed} WHERE url = '%s'", $edit['url']));
+    $this->drupalGet('admin/content/aggregator/update/' . $feed->fid);
+
+    $this->drupalPost('admin/content/aggregator/remove/' . $feed->fid, array(), t('Remove items'));
+    $this->assertRaw(t('The news items from %title have been removed.', array('%title' => $feed->title)), t('Feed items removed.'));
+
+    $this->drupalGet('admin/content/aggregator/update/' . $feed->fid);
+
+    // Get updated feed information from database.
+    $feed = db_fetch_object(db_query("SELECT * FROM {aggregator_feed} WHERE fid = %d", $feed->fid));
+    return $feed;
+  }
+
+  function _testAtomEntryLinkSample() {
+    $edit = array(
+      'title' => "Thingology (LibraryThing's ideas blog)",
+      'url' => file_create_url($this->getAtomEntryLinkSample()),
+    );
+    $feed = $this->addUpdateFeed($edit);
+
+    $result = db_query('SELECT * FROM {aggregator_item} WHERE fid = %d', $feed->fid);
+    $items = array();
+    while ($item = db_fetch_object($result)) {
+      $items[] = $item;
+    }
+    $this->assertEqual($items[0]->link, 'http://www.librarything.com/thingology/2008/08/lamination.php', t('Link !link', array('!link' => $items[0]->link)));
+    $this->assertEqual($items[1]->link, 'http://www.librarything.com/thingology/2008/08/more-on-covers.php', t('Link !link', array('!link' => $items[1]->link)));
+    $this->assertEqual($items[2]->link, 'http://www.librarything.com/thingology/2008/08/index-translationum.php', t('Link !link', array('!link' => $items[2]->link)));
+  }
+
+  /**
+   * Sample Atom formatted feed.
+   *
+   * @see http://drupal.org/node/130344
+   */
+  function getAtomEntryLinkSample() {
+    $feed = <<<EOF
+<?xml version='1.0' encoding='UTF-8'?>
+<feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'>
+  <id>tag:blogger.com,1999:blog-27965824</id>
+  <updated>2008-08-15T13:18:44.515-04:00</updated>
+  <title type='text'>Thingology (LibraryThing's ideas blog)</title>
+  <link rel='alternate' type='text/html' href='http://www.librarything.com/thingology/index.php'/>
+  <link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/27965824/posts/default?start-index=26&amp;max-results=25'/>
+  <link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27965824/posts/default'/>
+  <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.librarything.com/thingology/atom.xml'/>
+  <author>
+    <name>Tim</name>
+    <uri>http://www.blogger.com/profile/07986361763198309178</uri>
+    <email>noreply@blogger.com</email>
+  </author>
+  <generator version='7.00' uri='http://www.blogger.com'>Blogger</generator>
+  <openSearch:totalResults>239</openSearch:totalResults>
+  <openSearch:startIndex>1</openSearch:startIndex>
+  <openSearch:itemsPerPage>25</openSearch:itemsPerPage>
+  <entry>
+    <id>tag:blogger.com,1999:blog-27965824.post-5704465642340301949</id>
+    <published>2008-08-13T04:55:00.003-04:00</published>
+    <updated>2008-08-13T05:13:11.626-04:00</updated>
+    <title type='text'>Lamination...</title>
+    <content type='html'>I love the</content>
+    <link rel='alternate' type='text/html' href='http://www.librarything.com/thingology/2008/08/lamination.php' title='Lamination...'/>
+    <link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27965824&amp;postID=5704465642340301949' title='4 Comments'/>
+    <link rel='replies' type='application/atom+xml' href='http://www.librarything.com/thingology/atom.xml' title='Post Comments'/>
+    <link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27965824/posts/default/5704465642340301949'/>
+    <link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27965824/posts/default/5704465642340301949'/>
+    <author>
+      <name>Tim</name>
+      <uri>http://www.blogger.com/profile/07986361763198309178</uri>
+      <email>noreply@blogger.com</email>
+    </author>
+  </entry>
+  <entry>
+    <id>tag:blogger.com,1999:blog-27965824.post-1142034655881418621</id>
+    <published>2008-08-12T12:51:00.003-04:00</published>
+    <updated>2008-08-13T06:04:43.803-04:00</updated>
+    <category scheme='http://www.blogger.com/atom/ns#' term='book covers'/>
+    <category scheme='http://www.blogger.com/atom/ns#' term='coverthing'/>
+    <title type='text'>More on covers</title>
+    <content type='html'>Three quick updates</content>
+    <link rel='alternate' type='text/html' href='http://www.librarything.com/thingology/2008/08/more-on-covers.php' title='More on covers'/>
+    <link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27965824&amp;postID=1142034655881418621' title='1 Comments'/>
+    <link rel='replies' type='application/atom+xml' href='http://www.librarything.com/thingology/atom.xml' title='Post Comments'/>
+    <link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27965824/posts/default/1142034655881418621'/>
+    <link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27965824/posts/default/1142034655881418621'/>
+    <author>
+      <name>Tim</name>
+      <uri>http://www.blogger.com/profile/07986361763198309178</uri>
+      <email>noreply@blogger.com</email>
+    </author>
+  </entry>
+  <entry>
+    <id>tag:blogger.com,1999:blog-27965824.post-7879150915857504362</id>
+    <published>2008-08-12T10:49:00.002-04:00</published>
+    <updated>2008-08-12T11:22:09.742-04:00</updated>
+    <title type='text'>Index Translationum</title>
+    <content type='html'>Anirvan</content>
+    <link rel='alternate' type='text/html' href='http://www.librarything.com/thingology/2008/08/index-translationum.php' title='Index Translationum'/>
+    <link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27965824&amp;postID=7879150915857504362' title='1 Comments'/>
+    <link rel='replies' type='application/atom+xml' href='http://www.librarything.com/thingology/atom.xml' title='Post Comments'/>
+    <link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27965824/posts/default/7879150915857504362'/>
+    <link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27965824/posts/default/7879150915857504362'/>
+    <author>
+      <name>Tim</name>
+      <uri>http://www.blogger.com/profile/07986361763198309178</uri>
+      <email>noreply@blogger.com</email>
+    </author>
+  </entry>
+</feed>
+EOF;
+
+    $path = file_directory_path() . '/atom-entry-link.xml';
+    file_save_data($feed, $path);
+    return $path;
+  }
+}
