summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/ActivityParseTests.php502
-rw-r--r--tests/JidValidateTest.php146
-rw-r--r--tests/MediaFileTest.php96
-rw-r--r--tests/UserFeedParseTest.php131
-rw-r--r--tests/sample-uploads/image.gifbin0 -> 35 bytes
-rw-r--r--tests/sample-uploads/image.jpegbin0 -> 306 bytes
-rw-r--r--tests/sample-uploads/image.jpgbin0 -> 306 bytes
-rw-r--r--tests/sample-uploads/image.pngbin0 -> 159 bytes
-rw-r--r--tests/sample-uploads/office.pdfbin0 -> 1162 bytes
-rw-r--r--tests/sample-uploads/presentation.odpbin0 -> 9330 bytes
-rw-r--r--tests/sample-uploads/presentation.otpbin0 -> 9359 bytes
-rw-r--r--tests/sample-uploads/presentation.potbin0 -> 71168 bytes
-rw-r--r--tests/sample-uploads/presentation.potmbin0 -> 5789 bytes
-rw-r--r--tests/sample-uploads/presentation.pptbin0 -> 71168 bytes
-rw-r--r--tests/sample-uploads/presentation.pptxbin0 -> 5790 bytes
-rw-r--r--tests/sample-uploads/spreadsheet.odsbin0 -> 6560 bytes
-rw-r--r--tests/sample-uploads/spreadsheet.otsbin0 -> 6575 bytes
-rw-r--r--tests/sample-uploads/spreadsheet.xlsbin0 -> 6656 bytes
-rw-r--r--tests/sample-uploads/spreadsheet.xlsxbin0 -> 6010 bytes
-rw-r--r--tests/sample-uploads/spreadsheet.xltbin0 -> 6144 bytes
-rw-r--r--tests/sample-uploads/wordproc.docbin0 -> 9216 bytes
-rw-r--r--tests/sample-uploads/wordproc.docxbin0 -> 3350 bytes
-rw-r--r--tests/sample-uploads/wordproc.odtbin0 -> 7641 bytes
-rw-r--r--tests/sample-uploads/wordproc.ottbin0 -> 7656 bytes
-rw-r--r--tests/sample-uploads/wordproc.rtf16
25 files changed, 871 insertions, 20 deletions
diff --git a/tests/ActivityParseTests.php b/tests/ActivityParseTests.php
index 7bf9cec7c..378478d74 100644
--- a/tests/ActivityParseTests.php
+++ b/tests/ActivityParseTests.php
@@ -22,14 +22,26 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
$this->assertFalse(empty($act));
- $this->assertEquals($act->time, 1243860840);
- $this->assertEquals($act->verb, ActivityVerb::POST);
+ $this->assertEquals(1243860840, $act->time);
+ $this->assertEquals(ActivityVerb::POST, $act->verb);
+
+ $this->assertFalse(empty($act->objects[0]));
+ $this->assertEquals('Punctuation Changeset', $act->objects[0]->title);
+ $this->assertEquals('http://versioncentral.example.org/activity/changeset', $act->objects[0]->type);
+ $this->assertEquals('Fixing punctuation because it makes it more readable.', $act->objects[0]->summary);
+ $this->assertEquals('tag:versioncentral.example.org,2009:/change/1643245', $act->objects[0]->id);
+ }
+
+ public function testExample2()
+ {
+ global $_example2;
+ $dom = DOMDocument::loadXML($_example2);
+ $act = new Activity($dom->documentElement);
- $this->assertFalse(empty($act->object));
- $this->assertEquals($act->object->title, 'Punctuation Changeset');
- $this->assertEquals($act->object->type, 'http://versioncentral.example.org/activity/changeset');
- $this->assertEquals($act->object->summary, 'Fixing punctuation because it makes it more readable.');
- $this->assertEquals($act->object->id, 'tag:versioncentral.example.org,2009:/change/1643245');
+ $this->assertFalse(empty($act));
+ // Did we handle <content type="html"> correctly with a typical payload?
+ $this->assertEquals("<p>Geraldine posted a Photo on PhotoPanic</p>\n " .
+ "<img src=\"/geraldine/photo1.jpg\">", trim($act->content));
}
public function testExample3()
@@ -46,22 +58,22 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
$act = new Activity($entry, $feed);
$this->assertFalse(empty($act));
- $this->assertEquals($act->time, 1071340202);
- $this->assertEquals($act->link, 'http://example.org/2003/12/13/atom03.html');
+ $this->assertEquals(1071340202, $act->time);
+ $this->assertEquals('http://example.org/2003/12/13/atom03.html', $act->link);
$this->assertEquals($act->verb, ActivityVerb::POST);
$this->assertFalse(empty($act->actor));
- $this->assertEquals($act->actor->type, ActivityObject::PERSON);
- $this->assertEquals($act->actor->title, 'John Doe');
- $this->assertEquals($act->actor->id, 'mailto:johndoe@example.com');
+ $this->assertEquals(ActivityObject::PERSON, $act->actor->type);
+ $this->assertEquals('John Doe', $act->actor->title);
+ $this->assertEquals('mailto:johndoe@example.com', $act->actor->id);
- $this->assertFalse(empty($act->object));
- $this->assertEquals($act->object->type, ActivityObject::NOTE);
- $this->assertEquals($act->object->id, 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a');
- $this->assertEquals($act->object->title, 'Atom-Powered Robots Run Amok');
- $this->assertEquals($act->object->summary, 'Some text.');
- $this->assertEquals($act->object->link, 'http://example.org/2003/12/13/atom03.html');
+ $this->assertFalse(empty($act->objects[0]));
+ $this->assertEquals(ActivityObject::NOTE, $act->objects[0]->type);
+ $this->assertEquals('urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', $act->objects[0]->id);
+ $this->assertEquals('Atom-Powered Robots Run Amok', $act->objects[0]->title);
+ $this->assertEquals('Some text.', $act->objects[0]->summary);
+ $this->assertEquals('http://example.org/2003/12/13/atom03.html', $act->objects[0]->link);
$this->assertFalse(empty($act->context));
@@ -90,8 +102,8 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
$this->assertEquals('http://example.net/conversation/11', $act->context->conversation);
$this->assertEquals(array('http://example.net/user/1'), $act->context->attention);
- $this->assertFalse(empty($act->object));
- $this->assertEquals($act->object->content,
+ $this->assertFalse(empty($act->objects[0]));
+ $this->assertEquals($act->objects[0]->content,
'@<span class="vcard"><a href="http://example.net/user/1" class="url"><span class="fn nickname">evan</span></a></span> now is the time for all good men to come to the aid of their country. #<span class="tag"><a href="http://example.net/tag/thetime" rel="tag">thetime</a></span>');
$this->assertFalse(empty($act->actor));
@@ -138,7 +150,236 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
$this->assertEquals($poco->urls[0]->value, 'http://example.com/blog.html');
$this->assertEquals($poco->urls[0]->primary, 'true');
$this->assertEquals($act->actor->geopoint, '37.7749295 -122.4194155');
+ }
+
+ public function testExample6()
+ {
+ global $_example6;
+
+ $dom = DOMDocument::loadXML($_example6);
+
+ $rss = $dom->documentElement;
+
+ $channels = $dom->getElementsByTagName('channel');
+
+ $channel = $channels->item(0);
+
+ $items = $channel->getElementsByTagName('item');
+
+ $item = $items->item(0);
+
+ $act = new Activity($item, $channel);
+
+ $this->assertEquals($act->verb, ActivityVerb::POST);
+
+ $this->assertEquals($act->id, 'http://en.blog.wordpress.com/?p=3857');
+ $this->assertEquals($act->link, 'http://en.blog.wordpress.com/2010/03/03/rub-a-dub-dub-in-the-pubsubhubbub/');
+ $this->assertEquals($act->title, 'Rub-a-Dub-Dub in the PubSubHubbub');
+ $this->assertEquals($act->time, 1267634892);
+
+ $actor = $act->actor;
+
+ $this->assertFalse(empty($actor));
+ $this->assertEquals($actor->title, "Joseph Scott");
+ }
+
+ public function testExample7()
+ {
+ global $_example7;
+
+ $dom = DOMDocument::loadXML($_example7);
+
+ $rss = $dom->documentElement;
+
+ $channels = $dom->getElementsByTagName('channel');
+
+ $channel = $channels->item(0);
+
+ $items = $channel->getElementsByTagName('item');
+
+ $item = $items->item(0);
+
+ $act = new Activity($item, $channel);
+
+ $this->assertEquals(ActivityVerb::POST, $act->verb);
+ $this->assertEquals('http://evanpro.posterous.com/checking-out-captain-bones', $act->link);
+ $this->assertEquals('http://evanpro.posterous.com/checking-out-captain-bones', $act->id);
+ $this->assertEquals('Checking out captain bones', $act->title);
+ $this->assertEquals(1269095551, $act->time);
+
+ $actor = $act->actor;
+
+ $this->assertEquals(ActivityObject::PERSON, $actor->type);
+ $this->assertEquals('http://posterous.com/people/3sDslhaepotz', $actor->id);
+ $this->assertEquals('Evan Prodromou', $actor->title);
+ $this->assertNull($actor->summary);
+ $this->assertNull($actor->content);
+ $this->assertEquals('http://posterous.com/people/3sDslhaepotz', $actor->link);
+ $this->assertNull($actor->source);
+ $this->assertTrue(is_array($actor->avatarLinks));
+ $this->assertEquals(1, count($actor->avatarLinks));
+ $this->assertEquals('http://files.posterous.com/user_profile_pics/480326/2009-08-05-142447.jpg',
+ $actor->avatarLinks[0]->url);
+ $this->assertNotNull($actor->poco);
+ $this->assertEquals('evanpro', $actor->poco->preferredUsername);
+ $this->assertEquals('Evan Prodromou', $actor->poco->displayName);
+ $this->assertNull($actor->poco->note);
+ $this->assertNull($actor->poco->address);
+ $this->assertEquals(0, count($actor->poco->urls));
+ }
+
+ // Media test - cliqset
+ public function testExample8()
+ {
+ global $_example8;
+ $dom = DOMDocument::loadXML($_example8);
+
+ $feed = $dom->documentElement;
+
+ $entries = $feed->getElementsByTagName('entry');
+
+ $entry = $entries->item(0);
+
+ $act = new Activity($entry, $feed);
+
+ $this->assertFalse(empty($act));
+ $this->assertEquals($act->time, 1269221753);
+ $this->assertEquals($act->verb, ActivityVerb::POST);
+ $this->assertEquals($act->summary, 'zcopley posted 5 photos on Flickr');
+
+ $this->assertFalse(empty($act->objects));
+ $this->assertEquals(sizeof($act->objects), 5);
+
+ $this->assertEquals($act->objects[0]->type, ActivityObject::PHOTO);
+ $this->assertEquals($act->objects[0]->title, 'IMG_1368');
+ $this->assertNull($act->objects[0]->description);
+ $this->assertEquals(
+ $act->objects[0]->thumbnail,
+ 'http://media.cliqset.com/6f6fbee9d7dfbffc73b6ef626275eb5f_thumb.jpg'
+ );
+ $this->assertEquals(
+ $act->objects[0]->link,
+ 'http://www.flickr.com/photos/zcopley/4452933806/'
+ );
+
+ $this->assertEquals($act->objects[1]->type, ActivityObject::PHOTO);
+ $this->assertEquals($act->objects[1]->title, 'IMG_1365');
+ $this->assertNull($act->objects[1]->description);
+ $this->assertEquals(
+ $act->objects[1]->thumbnail,
+ 'http://media.cliqset.com/b8f3932cd0bba1b27f7c8b3ef986915e_thumb.jpg'
+ );
+ $this->assertEquals(
+ $act->objects[1]->link,
+ 'http://www.flickr.com/photos/zcopley/4442630390/'
+ );
+
+ $this->assertEquals($act->objects[2]->type, ActivityObject::PHOTO);
+ $this->assertEquals($act->objects[2]->title, 'Classic');
+ $this->assertEquals(
+ $act->objects[2]->description,
+ '-Powered by pikchur.com/n0u'
+ );
+ $this->assertEquals(
+ $act->objects[2]->thumbnail,
+ 'http://media.cliqset.com/fc54c15f850b7a9a8efa644087a48c91_thumb.jpg'
+ );
+ $this->assertEquals(
+ $act->objects[2]->link,
+ 'http://www.flickr.com/photos/zcopley/4430754103/'
+ );
+
+ $this->assertEquals($act->objects[3]->type, ActivityObject::PHOTO);
+ $this->assertEquals($act->objects[3]->title, 'IMG_1363');
+ $this->assertNull($act->objects[3]->description);
+
+ $this->assertEquals(
+ $act->objects[3]->thumbnail,
+ 'http://media.cliqset.com/4b1d307c9217e2114391a8b229d612cb_thumb.jpg'
+ );
+ $this->assertEquals(
+ $act->objects[3]->link,
+ 'http://www.flickr.com/photos/zcopley/4416969717/'
+ );
+
+ $this->assertEquals($act->objects[4]->type, ActivityObject::PHOTO);
+ $this->assertEquals($act->objects[4]->title, 'IMG_1361');
+ $this->assertNull($act->objects[4]->description);
+
+ $this->assertEquals(
+ $act->objects[4]->thumbnail,
+ 'http://media.cliqset.com/23d9b4b96b286e0347d36052f22f6e60_thumb.jpg'
+ );
+ $this->assertEquals(
+ $act->objects[4]->link,
+ 'http://www.flickr.com/photos/zcopley/4417734232/'
+ );
+
+ }
+
+ public function testAtomContent()
+ {
+ $tests = array(array("<content>Some regular plain text.</content>",
+ "Some regular plain text."),
+ array("<content>&lt;b&gt;this is not HTML&lt;/b&gt;</content>",
+ "&lt;b&gt;this is not HTML&lt;/b&gt;"),
+ array("<content type='html'>Some regular plain HTML.</content>",
+ "Some regular plain HTML."),
+ array("<content type='html'>&lt;b&gt;this is too HTML&lt;/b&gt;</content>",
+ "<b>this is too HTML</b>"),
+ array("<content type='html'>&amp;lt;b&amp;gt;but this is not HTML!&amp;lt;/b&amp;gt;</content>",
+ "&lt;b&gt;but this is not HTML!&lt;/b&gt;"),
+ array("<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Some regular plain XHTML.</div></content>",
+ "Some regular plain XHTML."),
+ array("<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'><b>This is some XHTML!</b></div></content>",
+ "<b>This is some XHTML!</b>"),
+ array("<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>&lt;b&gt;This is not some XHTML!&lt;/b&gt;</div></content>",
+ "&lt;b&gt;This is not some XHTML!&lt;/b&gt;"),
+ array("<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>&amp;lt;b&amp;gt;This is not some XHTML either!&amp;lt;/b&amp;gt;</div></content>",
+ "&amp;lt;b&amp;gt;This is not some XHTML either!&amp;lt;/b&amp;gt;"));
+ foreach ($tests as $data) {
+ list($source, $output) = $data;
+ $xml = "<entry xmlns='http://www.w3.org/2005/Atom'>" .
+ "<id>http://example.com/fakeid</id>" .
+ "<author><name>Test</name></author>" .
+ "<title>Atom content tests</title>" .
+ $source .
+ "</entry>";
+ $dom = DOMDocument::loadXML($xml);
+ $act = new Activity($dom->documentElement);
+
+ $this->assertFalse(empty($act));
+ $this->assertEquals($output, trim($act->content));
+ }
+ }
+ public function testRssContent()
+ {
+ $tests = array(array("<content:encoded>Some regular plain HTML.</content:encoded>",
+ "Some regular plain HTML."),
+ array("<content:encoded>Some &lt;b&gt;exciting bold HTML&lt;/b&gt;</content:encoded>",
+ "Some <b>exciting bold HTML</b>"),
+ array("<content:encoded>Some &amp;lt;b&amp;gt;escaped non-HTML.&amp;lt;/b&amp;gt;</content:encoded>",
+ "Some &lt;b&gt;escaped non-HTML.&lt;/b&gt;"),
+ array("<description>Some plain text.</description>",
+ "Some plain text."),
+ array("<description>Some &lt;b&gt;non-HTML text&lt;/b&gt;</description>",
+ "Some &lt;b&gt;non-HTML text&lt;/b&gt;"),
+ array("<description>Some &amp;lt;b&amp;gt;double-escaped text&amp;lt;/b&amp;gt;</description>",
+ "Some &amp;lt;b&amp;gt;double-escaped text&amp;lt;/b&amp;gt;"));
+ foreach ($tests as $data) {
+ list($source, $output) = $data;
+ $xml = "<item xmlns:content='http://purl.org/rss/1.0/modules/content/'>" .
+ "<guid>http://example.com/fakeid</guid>" .
+ "<title>RSS content tests</title>" .
+ $source .
+ "</item>";
+ $dom = DOMDocument::loadXML($xml);
+ $act = new Activity($dom->documentElement);
+
+ $this->assertFalse(empty($act));
+ $this->assertEquals($output, trim($act->content));
+ }
}
}
@@ -330,3 +571,224 @@ $_example5 = <<<EXAMPLE5
</entry>
</feed>
EXAMPLE5;
+
+$_example6 = <<<EXAMPLE6
+<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
+ xmlns:wfw="http://wellformedweb.org/CommentAPI/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
+ xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
+ xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
+ >
+
+ <channel>
+ <title>WordPress.com News</title>
+ <atom:link href="http://en.blog.wordpress.com/feed/" rel="self" type="application/rss+xml" />
+ <link>http://en.blog.wordpress.com</link>
+ <description>The latest news on WordPress.com and the WordPress community.</description>
+ <lastBuildDate>Thu, 18 Mar 2010 23:25:35 +0000</lastBuildDate>
+
+ <generator>http://wordpress.com/</generator>
+ <language>en</language>
+ <sy:updatePeriod>hourly</sy:updatePeriod>
+ <sy:updateFrequency>1</sy:updateFrequency>
+ <cloud domain='en.blog.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
+ <image>
+ <url>http://www.gravatar.com/blavatar/e6392390e3bcfadff3671c5a5653d95b?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
+ <title>WordPress.com News</title>
+ <link>http://en.blog.wordpress.com</link>
+ </image>
+ <atom:link rel="search" type="application/opensearchdescription+xml" href="http://en.blog.wordpress.com/osd.xml" title="WordPress.com News" />
+ <atom:link rel='hub' href='http://en.blog.wordpress.com/?pushpress=hub'/>
+
+ <item>
+ <title>Rub-a-Dub-Dub in the PubSubHubbub</title>
+ <link>http://en.blog.wordpress.com/2010/03/03/rub-a-dub-dub-in-the-pubsubhubbub/</link>
+ <comments>http://en.blog.wordpress.com/2010/03/03/rub-a-dub-dub-in-the-pubsubhubbub/#comments</comments>
+ <pubDate>Wed, 03 Mar 2010 16:48:12 +0000</pubDate>
+ <dc:creator>Joseph Scott</dc:creator>
+
+ <category><![CDATA[Feeds]]></category>
+ <category><![CDATA[atom]]></category>
+ <category><![CDATA[pubsubhubbub]]></category>
+ <category><![CDATA[rss]]></category>
+
+ <guid isPermaLink="false">http://en.blog.wordpress.com/?p=3857</guid>
+ <description><![CDATA[From the tongue twisting name department we welcome PubSubHubbub, or as some people have shortened it to: PuSH. Like rssCloud, PuSH is a way for services that subscribe to updates from your blog (think Google Reader, Bloglines or Netvibes) to get updates even faster. In a nutshell, instead of having to periodically ask [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=en.blog.wordpress.com&blog=3584907&post=3857&subd=en.blog&ref=&feed=1" />]]></description>
+ <content:encoded><![CDATA[<p>From the tongue twisting name department we welcome <a href="http://code.google.com/p/pubsubhubbub/">PubSubHubbub</a>, or as some people have shortened it to: PuSH. Like <a href="http://en.blog.wordpress.com/2009/09/07/rss-in-the-clouds/">rssCloud</a>, PuSH is a way for services that subscribe to updates from your blog (think Google Reader, Bloglines or Netvibes) to get updates even faster. In a nutshell, instead of having to periodically ask your blog if there are any updates they can now register to automatically receive updates each time you publish new content. In most cases these updates are sent out within a second or two of when you hit the publish button.</p>
+ <p>Today we&#8217;ve turned on PuSH support for the more than 10.5 million blogs on WordPress.com. There&#8217;s nothing to configure, it&#8217;s working right now behind the scenes to help others keep up to date with your posts.</p>
+ <p>For those using the WordPress.org software we are releasing a new PuSH plugin: <a href="http://wordpress.org/extend/plugins/pushpress/">PuSHPress</a>. This plugin differs from the current PuSH related plugins by including a built-in hub.</p>
+ <p>For more PuSH related reading check out the <a href="http://code.google.com/p/pubsubhubbub/">PubSubHubbub project site</a> and <a href="http://groups.google.com/group/pubsubhubbub?pli=1">Google Group</a>. And if you really want to geek out there&#8217;s always the <a href="http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.3.html">PubSubHubbub Spec</a> <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
+ <br /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/en.blog.wordpress.com/3857/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/en.blog.wordpress.com/3857/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/en.blog.wordpress.com/3857/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/en.blog.wordpress.com/3857/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/en.blog.wordpress.com/3857/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/en.blog.wordpress.com/3857/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/en.blog.wordpress.com/3857/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/en.blog.wordpress.com/3857/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/en.blog.wordpress.com/3857/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/en.blog.wordpress.com/3857/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=en.blog.wordpress.com&blog=3584907&post=3857&subd=en.blog&ref=&feed=1" />]]></content:encoded>
+ <wfw:commentRss>http://en.blog.wordpress.com/2010/03/03/rub-a-dub-dub-in-the-pubsubhubbub/feed/</wfw:commentRss>
+
+ <slash:comments>96</slash:comments>
+
+ <media:content url="http://1.gravatar.com/avatar/582b66ad5ae1b69c7601a990cb9a661a?s=96&#38;d=identicon" medium="image">
+ <media:title type="html">josephscott</media:title>
+ </media:content>
+ </item>
+ </channel>
+</rss>
+EXAMPLE6;
+
+$_example7 = <<<EXAMPLE7
+<?xml version="1.0" encoding="UTF-8"?>
+ <rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:posterous="http://posterous.com/help/rss/1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
+ <channel>
+ <title>evanpro's posterous</title>
+ <link>http://evanpro.posterous.com</link>
+ <description>Most recent posts at evanpro's posterous</description>
+ <generator>posterous.com</generator>
+ <link type="application/json" xmlns="http://www.w3.org/2005/Atom" rel="http://api.friendfeed.com/2008/03#sup" href="http://posterous.com/api/sup_update#56bcc5eb7"/>
+ <atom:link rel="self" href="http://evanpro.posterous.com/rss.xml"/>
+ <atom:link rel="hub" href="http://posterous.superfeedr.com"/>
+ <item>
+ <pubDate>Sat, 20 Mar 2010 07:32:31 -0700</pubDate>
+ <title>Checking out captain bones</title>
+ <link>http://evanpro.posterous.com/checking-out-captain-bones</link>
+ <guid>http://evanpro.posterous.com/checking-out-captain-bones</guid>
+ <description>
+ <![CDATA[<p>
+ <p>Bones!</p>
+
+ </p>
+
+ <p><a href="http://evanpro.posterous.com/checking-out-captain-bones">Permalink</a>
+
+ | <a href="http://evanpro.posterous.com/checking-out-captain-bones#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>
+
+ </p>]]>
+ </description>
+ <posterous:author>
+ <posterous:userImage>http://files.posterous.com/user_profile_pics/480326/2009-08-05-142447.jpg</posterous:userImage>
+ <posterous:profileUrl>http://posterous.com/people/3sDslhaepotz</posterous:profileUrl>
+ <posterous:firstName>Evan</posterous:firstName>
+ <posterous:lastnNme>Prodromou</posterous:lastnNme>
+ <posterous:nickName>evanpro</posterous:nickName>
+ <posterous:displayName>Evan Prodromou</posterous:displayName>
+ </posterous:author>
+ </item>
+ </channel>
+</rss>
+EXAMPLE7;
+
+$_example8 = <<<EXAMPLE8
+<?xml version="1.0"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <link href="http://pubsubhubbub.appspot.com/" rel="hub"/>
+ <title type="text">Activity Stream for: zcopley</title>
+ <id>http://cliqset.com/feed/atom?uid=zcopley</id>
+ <entry xmlns:service="http://activitystrea.ms/service-provider" xmlns:activity="http://activitystrea.ms/spec/1.0/">
+ <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <published>2010-03-22T01:35:53.000Z</published>
+ <service:provider>
+ <name>flickr</name>
+ <uri>http://flickr.com</uri>
+ <icon>http://cliqset-services.s3.amazonaws.com/flickr.png</icon>
+ </service:provider>
+ <activity:object>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/photo</activity:object-type>
+ <title type="text">IMG_1368</title>
+ <link type="image/jpeg" rel="preview" href="http://media.cliqset.com/6f6fbee9d7dfbffc73b6ef626275eb5f_thumb.jpg"/>
+ <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/zcopley/4452933806/"/>
+ </activity:object>
+ <activity:object>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/photo</activity:object-type>
+ <title type="text">IMG_1365</title>
+ <link type="image/jpeg" rel="preview" href="http://media.cliqset.com/b8f3932cd0bba1b27f7c8b3ef986915e_thumb.jpg"/>
+ <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/zcopley/4442630390/"/>
+ </activity:object>
+ <activity:object xmlns:media="http://purl.org/syndication/atommedia">
+ <activity:object-type>http://activitystrea.ms/schema/1.0/photo</activity:object-type>
+ <title type="text">Classic</title>
+ <link type="image/jpeg" rel="preview" href="http://media.cliqset.com/fc54c15f850b7a9a8efa644087a48c91_thumb.jpg"/>
+ <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/zcopley/4430754103/"/>
+ <media:description type="text">-Powered by pikchur.com/n0u</media:description>
+ </activity:object>
+ <activity:object>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/photo</activity:object-type>
+ <title type="text">IMG_1363</title>
+ <link type="image/jpeg" rel="preview" href="http://media.cliqset.com/4b1d307c9217e2114391a8b229d612cb_thumb.jpg"/>
+ <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/zcopley/4416969717/"/>
+ </activity:object>
+ <activity:object>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/photo</activity:object-type>
+ <title type="text">IMG_1361</title>
+ <link type="image/jpeg" rel="preview" href="http://media.cliqset.com/23d9b4b96b286e0347d36052f22f6e60_thumb.jpg"/>
+ <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/zcopley/4417734232/"/>
+ </activity:object>
+ <title type="text">zcopley posted some photos on Flickr</title>
+ <summary type="text">zcopley posted 5 photos on Flickr</summary>
+ <category scheme="http://schemas.cliqset.com/activity/categories/1.0" term="PhotoPosted" label="Photo Posted"/>
+ <updated>2010-03-22T20:46:42.778Z</updated>
+ <id>tag:cliqset.com,2010-03-22:/user/zcopley/SVgAZubGhtAnSAee</id>
+ <link href="http://cliqset.com/user/zcopley/SVgAZubGhtAnSAee" type="text/xhtml" rel="alternate" title="zcopley posted some photos on Flickr"/>
+ <author>
+ <name>zcopley</name>
+ <uri>http://cliqset.com/user/zcopley</uri>
+ </author>
+ <activity:actor xmlns:poco="http://portablecontacts.net/spec/1.0">
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <id>zcopley</id>
+ <poco:name>
+ <poco:givenName>Zach</poco:givenName>
+ <poco:familyName>Copley</poco:familyName>
+ </poco:name>
+ <link xmlns:media="http://purl.org/syndication/atommedia" type="image/png" rel="avatar" href="http://dynamic.cliqset.com/avatar/zcopley?s=80" media:height="80" media:width="80"/>
+ <link xmlns:media="http://purl.org/syndication/atommedia" type="image/png" rel="avatar" href="http://dynamic.cliqset.com/avatar/zcopley?s=120" media:height="120" media:width="120"/>
+ <link xmlns:media="http://purl.org/syndication/atommedia" type="image/png" rel="avatar" href="http://dynamic.cliqset.com/avatar/zcopley?s=200" media:height="200" media:width="200"/>
+ </activity:actor>
+ </entry>
+</feed>
+EXAMPLE8;
+
+$_example9 = <<<EXAMPLE9
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:media="http://search.yahoo.com/mrss" xmlns:activity="http://activitystrea.ms/spec/1.0/">
+ <link rel="self" type="application/atom+xml" href="http://buzz.googleapis.com/feeds/117848251937215158042/public/posted"/>
+ <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
+ <title type="text">Google Buzz</title>
+ <updated>2010-03-22T01:55:53.596Z</updated>
+ <id>tag:google.com,2009:buzz-feed/public/posted/117848251937215158042</id>
+ <generator>Google - Google Buzz</generator>
+ <entry>
+ <title type="html">Buzz by Zach Copley from Flickr</title>
+ <summary type="text">IMG_1366</summary>
+ <published>2010-03-18T04:29:23.000Z</published>
+ <updated>2010-03-18T05:14:03.325Z</updated>
+ <id>tag:google.com,2009:buzz/z12zwdhxowq2d13q204cjr04kzu0cns5gh0</id>
+ <link rel="alternate" type="text/html" href="http://www.google.com/buzz/117848251937215158042/ZU7b6mHJEmC/IMG-1366"/>
+ <author>
+ <name>Zach Copley</name>
+ <uri>http://www.google.com/profiles/zcopley</uri>
+ </author>
+ <content type="html">&lt;div&gt;IMG_1366&lt;/div&gt;</content>
+ <link rel="enclosure" href="http://www.flickr.com/photos/22823034@N00/4442630700" type="image/jpeg" title="IMG_1366"/>
+ <media:content url="http://www.flickr.com/photos/22823034@N00/4442630700" type="image/jpeg" medium="image">
+ <media:title>IMG_1366</media:title>
+ <media:player url="http://farm5.static.flickr.com/4053/4442630700_980b19a1a6_o.jpg" height="1600" width="1200"/>
+ </media:content>
+ <link rel="enclosure" href="http://www.flickr.com/photos/22823034@N00/4442630390" type="image/jpeg" title="IMG_1365"/>
+ <media:content url="http://www.flickr.com/photos/22823034@N00/4442630390" type="image/jpeg" medium="image">
+ <media:title>IMG_1365</media:title>
+ <media:player url="http://farm5.static.flickr.com/4043/4442630390_62da5560ae_o.jpg" height="1200" width="1600"/>
+ </media:content>
+ <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+ <activity:object>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/photo</activity:object-type>
+ <id>tag:google.com,2009:buzz/z12zwdhxowq2d13q204cjr04kzu0cns5gh0</id>
+ <title>Buzz by Zach Copley from Flickr</title>
+ <content type="html">&lt;div&gt;IMG_1366&lt;/div&gt;</content>
+ <link rel="enclosure" href="http://www.flickr.com/photos/22823034@N00/4442630700" type="image/jpeg" title="IMG_1366"/>
+ <link rel="enclosure" href="http://www.flickr.com/photos/22823034@N00/4442630390" type="image/jpeg" title="IMG_1365"/>
+ </activity:object>
+ <link rel="replies" type="application/atom+xml" href="http://buzz.googleapis.com/feeds/117848251937215158042/comments/z12zwdhxowq2d13q204cjr04kzu0cns5gh0" thr:count="0"/>
+ <thr:total>0</thr:total>
+ </entry>
+</feed>
+EXAMPLE9;
diff --git a/tests/JidValidateTest.php b/tests/JidValidateTest.php
new file mode 100644
index 000000000..9f5901139
--- /dev/null
+++ b/tests/JidValidateTest.php
@@ -0,0 +1,146 @@
+<?php
+
+if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
+ print "This script must be run from the command line\n";
+ exit();
+}
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+define('STATUSNET', true);
+define('LACONICA', true);
+
+mb_internal_encoding('UTF-8'); // @fixme this probably belongs in common.php?
+
+require_once INSTALLDIR . '/lib/common.php';
+require_once INSTALLDIR . '/lib/jabber.php';
+
+class JidValidateTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @dataProvider validationCases
+ *
+ */
+ public function testValidate($jid, $validFull, $validBase)
+ {
+ $this->assertEquals($validFull, jabber_valid_full_jid($jid), "validating as full or base JID");
+
+ $this->assertEquals($validBase, jabber_valid_base_jid($jid), "validating as base JID only");
+ }
+
+ /**
+ * @dataProvider normalizationCases
+ *
+ */
+ public function testNormalize($jid, $expected)
+ {
+ $this->assertEquals($expected, jabber_normalize_jid($jid));
+ }
+
+ /**
+ * @dataProvider domainCheckCases()
+ */
+ public function testDomainCheck($domain, $expected, $note)
+ {
+ $this->assertEquals($expected, jabber_check_domain($domain), $note);
+ }
+
+ static public function validationCases()
+ {
+ $long1023 = "long1023" . str_repeat('x', 1023 - 8);
+ $long1024 = "long1024" . str_repeat('x', 1024 - 8);
+ return array(
+ // Our own test cases for standard things & those mentioned in bug reports
+ // (jid, valid_full, valid_base)
+ array('user@example.com', true, true),
+ array('user@example.com/resource', true, false),
+ array('user with spaces@example.com', false, false), // not kosher
+
+ array('user.@example.com', true, true), // "common in intranets"
+ array('example.com', true, true),
+ array('example.com/resource', true, false),
+ array('jabchat', true, true),
+
+ array("$long1023@$long1023/$long1023", true, false), // max 1023 "bytes" per portion per spec. Do they really mean bytes though?
+ array("$long1024@$long1023/$long1023", false, false),
+ array("$long1023@$long1024/$long1023", false, false),
+ array("$long1023@$long1023/$long1024", false, false),
+
+ // Borrowed from test_jabber_jutil.c in libpurple
+ array("gmail.com", true, true),
+ array("gmail.com/Test", true, false),
+ array("gmail.com/Test@", true, false),
+ array("gmail.com/@", true, false),
+ array("gmail.com/Test@alkjaweflkj", true, false),
+ array("mark.doliner@gmail.com", true, true),
+ array("mark.doliner@gmail.com/Test12345", true, false),
+ array("mark.doliner@gmail.com/Test@12345", true, false),
+ array("mark.doliner@gmail.com/Te/st@12@//345", true, false),
+ array("わいど@conference.jabber.org", true, true),
+ array("まりるーむ@conference.jabber.org", true, true),
+ array("mark.doliner@gmail.com/まりるーむ", true, false),
+ array("mark.doliner@gmail/stuff.org", true, false),
+ array("stuart@nödåtXäYZ.se", true, true),
+ array("stuart@nödåtXäYZ.se/まりるーむ", true, false),
+ array("mark.doliner@わいど.org", true, true),
+ array("nick@まつ.おおかみ.net", true, true),
+ array("paul@10.0.42.230/s", true, false),
+ array("paul@[::1]", true, true), /* IPv6 */
+ array("paul@[2001:470:1f05:d58::2]", true, true),
+ array("paul@[2001:470:1f05:d58::2]/foo", true, false),
+ array("pa=ul@10.0.42.230", true, true),
+ array("pa,ul@10.0.42.230", true, true),
+
+ array("@gmail.com", false, false),
+ array("@@gmail.com", false, false),
+ array("mark.doliner@@gmail.com/Test12345", false, false),
+ array("mark@doliner@gmail.com/Test12345", false, false),
+ array("@gmail.com/Test@12345", false, false),
+ array("/Test@12345", false, false),
+ array("mark.doliner@", false, false),
+ array("mark.doliner/", false, false),
+ array("mark.doliner@gmail_stuff.org", false, false),
+ array("mark.doliner@gmail[stuff.org", false, false),
+ array("mark.doliner@gmail\\stuff.org", false, false),
+ array("paul@[::1]124", false, false),
+ array("paul@2[::1]124/as", false, false),
+ array("paul@まつ.おおかみ/\x01", false, false),
+
+ /*
+ * RFC 3454 Section 6 reads, in part,
+ * "If a string contains any RandALCat character, the
+ * string MUST NOT contain any LCat character."
+ * The character is U+066D (ARABIC FIVE POINTED STAR).
+ */
+ // Leaving this one commented out for the moment
+ // as it shouldn't hurt anything for our purposes.
+ //array("foo@example.com/٭simplexe٭", false, false)
+ );
+ }
+
+ static public function normalizationCases()
+ {
+ return array(
+ // Borrowed from test_jabber_jutil.c in libpurple
+ array('PaUL@DaRkRain42.org', 'paul@darkrain42.org'),
+ array('PaUL@DaRkRain42.org/', 'paul@darkrain42.org'),
+ array('PaUL@DaRkRain42.org/resource', 'paul@darkrain42.org'),
+
+ // Also adapted from libpurple tests...
+ array('Ф@darkrain42.org', 'ф@darkrain42.org'),
+ array('paul@Өarkrain.org', 'paul@өarkrain.org'),
+ );
+ }
+
+ static public function domainCheckCases()
+ {
+ return array(
+ array('gmail.com', true, 'known SRV record'),
+ array('jabber.org', true, 'known SRV record'),
+ array('status.net', true, 'known SRV record'),
+ array('status.leuksman.com', true, 'known no SRV record but valid domain'),
+ );
+ }
+
+
+}
+
diff --git a/tests/MediaFileTest.php b/tests/MediaFileTest.php
new file mode 100644
index 000000000..a76a4f45e
--- /dev/null
+++ b/tests/MediaFileTest.php
@@ -0,0 +1,96 @@
+<?php
+
+if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
+ print "This script must be run from the command line\n";
+ exit();
+}
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+define('STATUSNET', true);
+define('LACONICA', true);
+
+require_once INSTALLDIR . '/lib/common.php';
+
+class MediaFileTest extends PHPUnit_Framework_TestCase
+{
+
+ public function setup()
+ {
+ $this->old_attachments_supported = common_config('attachments', 'supported');
+ $GLOBALS['config']['attachments']['supported'] = true;
+ }
+
+ public function tearDown()
+ {
+ $GLOBALS['config']['attachments']['supported'] = $this->old_attachments_supported;
+ }
+
+ /**
+ * @dataProvider fileTypeCases
+ *
+ */
+ public function testFileType($filename, $expectedType)
+ {
+ if (!file_exists($filename)) {
+ throw new Exception("WTF? $filename test file missing");
+ }
+
+ $type = MediaFile::getUploadedFileType($filename, basename($filename));
+ $this->assertEquals($expectedType, $type);
+ }
+
+ /**
+ * @dataProvider fileTypeCases
+ *
+ */
+ public function testUploadedFileType($filename, $expectedType)
+ {
+ if (!file_exists($filename)) {
+ throw new Exception("WTF? $filename test file missing");
+ }
+ $tmp = tmpfile();
+ fwrite($tmp, file_get_contents($filename));
+
+ $type = MediaFile::getUploadedFileType($tmp, basename($filename));
+ $this->assertEquals($expectedType, $type);
+ }
+
+ static public function fileTypeCases()
+ {
+ $base = dirname(__FILE__);
+ $dir = "$base/sample-uploads";
+ $files = array(
+ "image.png" => "image/png",
+ "image.gif" => "image/gif",
+ "image.jpg" => "image/jpeg",
+ "image.jpeg" => "image/jpeg",
+
+ "office.pdf" => "application/pdf",
+
+ "wordproc.odt" => "application/vnd.oasis.opendocument.text",
+ "wordproc.ott" => "application/vnd.oasis.opendocument.text-template",
+ "wordproc.doc" => "application/msword",
+ "wordproc.docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+ "wordproc.rtf" => "text/rtf",
+
+ "spreadsheet.ods" => "application/vnd.oasis.opendocument.spreadsheet",
+ "spreadsheet.ots" => "application/vnd.oasis.opendocument.spreadsheet-template",
+ "spreadsheet.xls" => "application/vnd.ms-excel",
+ "spreadsheet.xlt" => "application/vnd.ms-excel",
+ "spreadsheet.xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+
+ "presentation.odp" => "application/vnd.oasis.opendocument.presentation",
+ "presentation.otp" => "application/vnd.oasis.opendocument.presentation-template",
+ "presentation.ppt" => "application/vnd.ms-powerpoint",
+ "presentation.pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation",
+ );
+
+ $dataset = array();
+ foreach ($files as $file => $type) {
+ $dataset[] = array("$dir/$file", $type);
+ }
+ return $dataset;
+ }
+
+}
+
diff --git a/tests/UserFeedParseTest.php b/tests/UserFeedParseTest.php
new file mode 100644
index 000000000..208e71be6
--- /dev/null
+++ b/tests/UserFeedParseTest.php
@@ -0,0 +1,131 @@
+<?php
+
+if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
+ print "This script must be run from the command line\n";
+ exit();
+}
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+define('STATUSNET', true);
+
+require_once INSTALLDIR . '/lib/common.php';
+
+class UserFeedParseTests extends PHPUnit_Framework_TestCase
+{
+ public function testFeed1()
+ {
+ global $_testfeed1;
+ $dom = DOMDocument::loadXML($_testfeed1);
+ $this->assertFalse(empty($dom));
+
+ $entries = $dom->getElementsByTagName('entry');
+
+ $entry1 = $entries->item(0);
+ $this->assertFalse(empty($entry1));
+
+ $feedEl = $dom->getElementsByTagName('feed')->item(0);
+ $this->assertFalse(empty($feedEl));
+
+ // Test actor (from activity:subject)
+
+ $act1 = new Activity($entry1, $feedEl);
+ $this->assertFalse(empty($act1));
+ $this->assertFalse(empty($act1->actor));
+ $this->assertEquals($act1->actor->type, ActivityObject::PERSON);
+ $this->assertEquals($act1->actor->title, 'Zach Copley');
+ $this->assertEquals($act1->actor->id, 'http://localhost/statusnet/user/1');
+ $this->assertEquals($act1->actor->link, 'http://localhost/statusnet/zach');
+
+ $avatars = $act1->actor->avatarLinks;
+
+ $this->assertEquals(
+ $avatars[0]->url,
+ 'http://localhost/statusnet/theme/default/default-avatar-profile.png'
+ );
+
+ $this->assertEquals(
+ $avatars[1]->url,
+ 'http://localhost/statusnet/theme/default/default-avatar-stream.png'
+ );
+
+ $this->assertEquals(
+ $avatars[2]->url,
+ 'http://localhost/statusnet/theme/default/default-avatar-mini.png'
+ );
+
+ $this->assertEquals($act1->actor->displayName, 'Zach Copley');
+
+ $poco = $act1->actor->poco;
+ $this->assertEquals($poco->preferredUsername, 'zach');
+ $this->assertEquals($poco->address->formatted, 'El Cerrito, CA');
+ $this->assertEquals($poco->urls[0]->type, 'homepage');
+ $this->assertEquals($poco->urls[0]->value, 'http://zach.copley.name');
+ $this->assertEquals($poco->urls[0]->primary, 'true');
+ $this->assertEquals($poco->note, 'Zach Hack Attack');
+
+ // test the post
+
+ //var_export($act1);
+ $this->assertEquals($act1->objects[0]->type, 'http://activitystrea.ms/schema/1.0/note');
+ $this->assertEquals($act1->objects[0]->title, 'And now for something completely insane...');
+
+ $this->assertEquals($act1->objects[0]->content, 'And now for something completely insane...');
+ $this->assertEquals($act1->objects[0]->id, 'http://localhost/statusnet/notice/3');
+
+ }
+
+}
+
+$_testfeed1 = <<<TESTFEED1
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0">
+ <id>http://localhost/statusnet/api/statuses/user_timeline/1.atom</id>
+ <title>zach timeline</title>
+ <subtitle>Updates from zach on Zach Dev!</subtitle>
+ <logo>http://localhost/statusnet/theme/default/default-avatar-profile.png</logo>
+ <updated>2010-03-04T01:41:14+00:00</updated>
+<author>
+ <name>zach</name>
+ <uri>http://localhost/statusnet/user/1</uri>
+
+</author>
+ <link href="http://localhost/statusnet/zach" rel="alternate" type="text/html"/>
+ <link href="http://localhost/statusnet/main/sup#1" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="http://localhost/statusnet/main/push/hub" rel="hub"/>
+ <link href="http://localhost/statusnet/main/salmon/user/1" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="http://localhost/statusnet/main/salmon/user/1" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="http://localhost/statusnet/api/statuses/user_timeline/1.atom" rel="self" type="application/atom+xml"/>
+<activity:subject>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <id>http://localhost/statusnet/user/1</id>
+ <title>Zach Copley</title>
+ <link rel="alternate" type="text/html" href="http://localhost/statusnet/zach"/>
+ <link rel="avatar" type="image/png" media:width="96" media:height="96" href="http://localhost/statusnet/theme/default/default-avatar-profile.png"/>
+ <link rel="avatar" type="image/png" media:width="48" media:height="48" href="http://localhost/statusnet/theme/default/default-avatar-stream.png"/>
+ <link rel="avatar" type="image/png" media:width="24" media:height="24" href="http://localhost/statusnet/theme/default/default-avatar-mini.png"/>
+
+<poco:preferredUsername>zach</poco:preferredUsername>
+<poco:displayName>Zach Copley</poco:displayName>
+<poco:note>Zach Hack Attack</poco:note>
+<poco:address>
+ <poco:formatted>El Cerrito, CA</poco:formatted>
+</poco:address>
+<poco:urls>
+ <poco:type>homepage</poco:type>
+ <poco:value>http://zach.copley.name</poco:value>
+ <poco:primary>true</poco:primary>
+
+</poco:urls>
+</activity:subject>
+<entry>
+ <title>And now for something completely insane...</title>
+ <link rel="alternate" type="text/html" href="http://localhost/statusnet/notice/3"/>
+ <id>http://localhost/statusnet/notice/3</id>
+ <published>2010-03-04T01:41:07+00:00</published>
+ <updated>2010-03-04T01:41:07+00:00</updated>
+ <link rel="ostatus:conversation" href="http://localhost/statusnet/conversation/3"/>
+ <content type="html">And now for something completely insane...</content>
+</entry>
+
+</feed>
+TESTFEED1;
diff --git a/tests/sample-uploads/image.gif b/tests/sample-uploads/image.gif
new file mode 100644
index 000000000..b636f4b8d
--- /dev/null
+++ b/tests/sample-uploads/image.gif
Binary files differ
diff --git a/tests/sample-uploads/image.jpeg b/tests/sample-uploads/image.jpeg
new file mode 100644
index 000000000..21fcb5aef
--- /dev/null
+++ b/tests/sample-uploads/image.jpeg
Binary files differ
diff --git a/tests/sample-uploads/image.jpg b/tests/sample-uploads/image.jpg
new file mode 100644
index 000000000..21fcb5aef
--- /dev/null
+++ b/tests/sample-uploads/image.jpg
Binary files differ
diff --git a/tests/sample-uploads/image.png b/tests/sample-uploads/image.png
new file mode 100644
index 000000000..60cbcfd17
--- /dev/null
+++ b/tests/sample-uploads/image.png
Binary files differ
diff --git a/tests/sample-uploads/office.pdf b/tests/sample-uploads/office.pdf
new file mode 100644
index 000000000..670bc2343
--- /dev/null
+++ b/tests/sample-uploads/office.pdf
Binary files differ
diff --git a/tests/sample-uploads/presentation.odp b/tests/sample-uploads/presentation.odp
new file mode 100644
index 000000000..8dd3a428b
--- /dev/null
+++ b/tests/sample-uploads/presentation.odp
Binary files differ
diff --git a/tests/sample-uploads/presentation.otp b/tests/sample-uploads/presentation.otp
new file mode 100644
index 000000000..1927ee79d
--- /dev/null
+++ b/tests/sample-uploads/presentation.otp
Binary files differ
diff --git a/tests/sample-uploads/presentation.pot b/tests/sample-uploads/presentation.pot
new file mode 100644
index 000000000..f5124ffa2
--- /dev/null
+++ b/tests/sample-uploads/presentation.pot
Binary files differ
diff --git a/tests/sample-uploads/presentation.potm b/tests/sample-uploads/presentation.potm
new file mode 100644
index 000000000..ade1bcb10
--- /dev/null
+++ b/tests/sample-uploads/presentation.potm
Binary files differ
diff --git a/tests/sample-uploads/presentation.ppt b/tests/sample-uploads/presentation.ppt
new file mode 100644
index 000000000..f5124ffa2
--- /dev/null
+++ b/tests/sample-uploads/presentation.ppt
Binary files differ
diff --git a/tests/sample-uploads/presentation.pptx b/tests/sample-uploads/presentation.pptx
new file mode 100644
index 000000000..21ea61a15
--- /dev/null
+++ b/tests/sample-uploads/presentation.pptx
Binary files differ
diff --git a/tests/sample-uploads/spreadsheet.ods b/tests/sample-uploads/spreadsheet.ods
new file mode 100644
index 000000000..7b43e7507
--- /dev/null
+++ b/tests/sample-uploads/spreadsheet.ods
Binary files differ
diff --git a/tests/sample-uploads/spreadsheet.ots b/tests/sample-uploads/spreadsheet.ots
new file mode 100644
index 000000000..5f830e6de
--- /dev/null
+++ b/tests/sample-uploads/spreadsheet.ots
Binary files differ
diff --git a/tests/sample-uploads/spreadsheet.xls b/tests/sample-uploads/spreadsheet.xls
new file mode 100644
index 000000000..2d470e687
--- /dev/null
+++ b/tests/sample-uploads/spreadsheet.xls
Binary files differ
diff --git a/tests/sample-uploads/spreadsheet.xlsx b/tests/sample-uploads/spreadsheet.xlsx
new file mode 100644
index 000000000..b97a551f8
--- /dev/null
+++ b/tests/sample-uploads/spreadsheet.xlsx
Binary files differ
diff --git a/tests/sample-uploads/spreadsheet.xlt b/tests/sample-uploads/spreadsheet.xlt
new file mode 100644
index 000000000..980423b20
--- /dev/null
+++ b/tests/sample-uploads/spreadsheet.xlt
Binary files differ
diff --git a/tests/sample-uploads/wordproc.doc b/tests/sample-uploads/wordproc.doc
new file mode 100644
index 000000000..81c5e34c6
--- /dev/null
+++ b/tests/sample-uploads/wordproc.doc
Binary files differ
diff --git a/tests/sample-uploads/wordproc.docx b/tests/sample-uploads/wordproc.docx
new file mode 100644
index 000000000..04ea3c3ec
--- /dev/null
+++ b/tests/sample-uploads/wordproc.docx
Binary files differ
diff --git a/tests/sample-uploads/wordproc.odt b/tests/sample-uploads/wordproc.odt
new file mode 100644
index 000000000..fa6fe5e9f
--- /dev/null
+++ b/tests/sample-uploads/wordproc.odt
Binary files differ
diff --git a/tests/sample-uploads/wordproc.ott b/tests/sample-uploads/wordproc.ott
new file mode 100644
index 000000000..99ca8c068
--- /dev/null
+++ b/tests/sample-uploads/wordproc.ott
Binary files differ
diff --git a/tests/sample-uploads/wordproc.rtf b/tests/sample-uploads/wordproc.rtf
new file mode 100644
index 000000000..aad2c4605
--- /dev/null
+++ b/tests/sample-uploads/wordproc.rtf
@@ -0,0 +1,16 @@
+{\rtf1\ansi\deff0\adeflang1025
+{\fonttbl{\f0\froman\fprq2\fcharset128 Times New Roman;}{\f1\froman\fprq2\fcharset128 Times New Roman;}{\f2\fswiss\fprq2\fcharset128 Arial;}{\f3\fnil\fprq2\fcharset128 DejaVu Sans;}}
+{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
+{\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\snext1 Normal;}
+{\s2\sb240\sa120\keepn\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\afs28\lang1081\ltrch\dbch\langfe2052\hich\f2\fs28\lang1033\loch\f2\fs28\lang1033\sbasedon1\snext3 Heading;}
+{\s3\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext3 Body Text;}
+{\s4\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon3\snext4 List;}
+{\s5\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ai\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\i\loch\f0\fs24\lang1033\i\sbasedon1\snext5 caption;}
+{\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext6 Index;}
+}
+{\info{\author Brion }{\creatim\yr2010\mo5\dy10\hr15\min2}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment StarWriter}{\vern3200}}\deftab709
+{\*\pgdsctbl
+{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}}
+\paperh15840\paperw12240\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
+\pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang1081\ltrch\dbch\af3\langfe2052\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033
+\par } \ No newline at end of file