. namespace Tests\Unit; if (!defined('INSTALLDIR')) { define('INSTALLDIR', dirname(dirname(__DIR__))); } if (!defined('PUBLICDIR')) { define('PUBLICDIR', INSTALLDIR . DIRECTORY_SEPARATOR . 'public'); } if (!defined('GNUSOCIAL')) { define('GNUSOCIAL', true); } if (!defined('STATUSNET')) { // Compatibility define('STATUSNET', true); } use Activity; use ActivityObject; use ActivityUtils; use ActivityVerb; use DOMDocument; use PHPUnit\Framework\TestCase; require_once INSTALLDIR . '/lib/common.php'; final class ActivityParseTests extends TestCase { public function testMastodonRetweet() { global $_mastodon_retweet; $dom = new DOMDocument(); $dom->loadXML($_mastodon_retweet); $feed = $dom->documentElement; $entries = $feed->getElementsByTagName('entry'); $entry = $entries->item(0); $act = new Activity($entry, $feed); $this->assertFalse(empty($act)); $this->assertFalse(empty($act->objects[0])); $object = $act->objects[0]; $this->assertEquals($object->verb, ActivityVerb::POST); } public function testGSReweet() { global $_gs_retweet; $dom = new DOMDocument(); $dom->loadXML($_gs_retweet); $feed = $dom->documentElement; $entries = $feed->getElementsByTagName('entry'); $entry = $entries->item(0); $act = new Activity($entry, $feed); $this->assertFalse(empty($act)); $this->assertFalse(empty($act->objects[0])); $object = $act->objects[0]; $this->assertEquals($object->verb, ActivityVerb::POST); } public function testExample1() { global $_example1; $dom = new DOMDocument(); $dom->loadXML($_example1); $act = new Activity($dom->documentElement); $this->assertFalse(empty($act)); $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 = new DOMDocument(); $dom->loadXML($_example2); $act = new Activity($dom->documentElement); $this->assertFalse(empty($act)); // Did we handle correctly with a typical payload? $this->assertEquals("

Geraldine posted a Photo on PhotoPanic

\n " . "", trim($act->content)); } public function testExample3() { global $_example3; $dom = new DOMDocument(); $dom->loadXML($_example3); $feed = $dom->documentElement; $entries = $feed->getElementsByTagName('entry'); $entry = $entries->item(0); $act = new Activity($entry, $feed); $this->assertFalse(empty($act)); $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(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->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)); $this->assertTrue(empty($act->target)); $this->assertEquals($act->entry, $entry); $this->assertEquals($act->feed, $feed); } public function testExample4() { global $_example4; $dom = new DOMDocument(); $dom->loadXML($_example4); $entry = $dom->documentElement; $act = new Activity($entry); $this->assertFalse(empty($act)); $this->assertEquals(1266547958, $act->time); $this->assertEquals('http://example.net/notice/14', $act->link); $this->assertFalse(empty($act->context)); $this->assertEquals('http://example.net/notice/12', $act->context->replyToID); $this->assertEquals('http://example.net/notice/12', $act->context->replyToUrl); $this->assertEquals('http://example.net/conversation/11', $act->context->conversation); $this->assertEquals(array('http://example.net/user/1'), array_keys($act->context->attention)); $this->assertFalse(empty($act->objects[0])); $this->assertEquals($act->objects[0]->content, '@evan now is the time for all good men to come to the aid of their country. #'); $this->assertFalse(empty($act->actor)); } public function testExample5() { global $_example5; $dom = new DOMDocument(); $dom->loadXML($_example5); $feed = $dom->documentElement; // @todo Test feed elements $entries = $feed->getElementsByTagName('entry'); $entry = $entries->item(0); $act = new Activity($entry, $feed); // Post $this->assertEquals($act->verb, ActivityVerb::POST); $this->assertFalse(empty($act->context)); // Actor w/Portable Contacts stuff $this->assertFalse(empty($act->actor)); $this->assertEquals($act->actor->type, ActivityObject::PERSON); $this->assertEquals($act->actor->title, 'Test User'); $this->assertEquals($act->actor->id, 'http://example.net/mysite/user/3'); $this->assertEquals($act->actor->link, 'http://example.net/mysite/testuser'); $avatars = $act->actor->avatarLinks; $this->assertEquals( $avatars[0]->url, 'http://example.net/mysite/avatar/3-96-20100224004207.jpeg' ); $this->assertEquals($act->actor->displayName, 'Test User'); $poco = $act->actor->poco; $this->assertEquals($poco->preferredUsername, 'testuser'); $this->assertEquals($poco->address->formatted, 'San Francisco, CA'); $this->assertEquals($poco->urls[0]->type, 'homepage'); $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 = new DOMDocument(); $dom->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 = new DOMDocument(); $dom->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 = new DOMDocument(); $dom->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("Some regular plain text.", "Some regular plain text."), array("<b>this is not HTML</b>", "<b>this is not HTML</b>"), array("Some regular plain HTML.", "Some regular plain HTML."), array("<b>this is too HTML</b>", "this is too HTML"), array("&lt;b&gt;but this is not HTML!&lt;/b&gt;", "<b>but this is not HTML!</b>"), array("
Some regular plain XHTML.
", "Some regular plain XHTML."), array("
This is some XHTML!
", "This is some XHTML!"), array("
<b>This is not some XHTML!</b>
", "<b>This is not some XHTML!</b>"), array("
&lt;b&gt;This is not some XHTML either!&lt;/b&gt;
", "&lt;b&gt;This is not some XHTML either!&lt;/b&gt;")); foreach ($tests as $data) { list($source, $output) = $data; $xml = "" . "http://example.com/fakeid" . "Test" . "Atom content tests" . $source . ""; $dom = new DOMDocument(); $dom->loadXML($xml); $act = new Activity($dom->documentElement); $this->assertFalse(empty($act)); $this->assertEquals($output, trim($act->content)); } } public function testRssContent() { $tests = array(array("Some regular plain HTML.", "Some regular plain HTML."), array("Some <b>exciting bold HTML</b>", "Some exciting bold HTML"), array("Some &lt;b&gt;escaped non-HTML.&lt;/b&gt;", "Some <b>escaped non-HTML.</b>"), array("Some plain text.", "Some plain text."), array("Some <b>non-HTML text</b>", "Some <b>non-HTML text</b>"), array("Some &lt;b&gt;double-escaped text&lt;/b&gt;", "Some &lt;b&gt;double-escaped text&lt;/b&gt;")); foreach ($tests as $data) { list($source, $output) = $data; $xml = "" . "http://example.com/fakeid" . "RSS content tests" . $source . ""; $dom = new DOMDocument(); $dom->loadXML($xml); $act = new Activity($dom->documentElement); $this->assertFalse(empty($act)); $this->assertEquals($output, trim($act->content)); } } public function testExample10() { global $_example10; $dom = new DOMDocument(); $dom->loadXML($_example10); // example 10 is a PuSH item of a post on a group feed, as generated // by 0.9.7 code after migration away from to $feed = $dom->documentElement; $entry = $dom->getElementsByTagName('entry')->item(0); $expected = 'http://lazarus.local/mublog/user/557'; // Reading just the entry alone should pick up its own // as the actor. $act = new Activity($entry); $this->assertEquals($act->actor->id, $expected); // Reading the entry in feed context used to be buggy, picking up // the feed's which referred to the group. // It should now be returning the expected author entry... $act = new Activity($entry, $feed); $this->assertEquals($act->actor->id, $expected); } public function testBookmarkRelated() { global $_example11; $dom = new DOMDocument(); $dom->loadXML($_example11); $feed = $dom->documentElement; $entry = $dom->getElementsByTagName('entry')->item(0); $expected = 'http://blog.teambox.com/open-source-companies'; $links = ActivityUtils::getLinks($entry, 'related'); $this->assertFalse(empty($links)); $this->assertTrue(is_array($links)); $this->assertEquals(count($links), 1); $url = $links[0]->getAttribute('href'); $this->assertEquals($url, $expected); } } $_example1 = << tag:versioncentral.example.org,2009:/commit/1643245 2009-06-01T12:54:00Z Geraldine committed a change to yate Geraldine just committed a change to yate on VersionCentral http://activitystrea.ms/schema/1.0/post http://versioncentral.example.org/activity/commit http://versioncentral.example.org/activity/changeset tag:versioncentral.example.org,2009:/change/1643245 Punctuation Changeset Fixing punctuation because it makes it more readable. EXAMPLE1; $_example2 = << tag:photopanic.example.com,2008:activity01 Geraldine posted a Photo on PhotoPanic 2008-11-02T15:29:00Z http://activitystrea.ms/schema/1.0/post tag:photopanic.example.com,2008:photo01 My Cat 2008-11-02T15:29:00Z tag:atomactivity.example.com,2008:photo Geraldine's Photos <p>Geraldine posted a Photo on PhotoPanic</p> <img src="/geraldine/photo1.jpg"> EXAMPLE2; $_example3 = << Example Feed A subtitle. urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6 2003-12-13T18:30:02Z John Doe johndoe@example.com Atom-Powered Robots Run Amok urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a 2003-12-13T18:30:02Z Some text. EXAMPLE3; $_example4 = << @evan now is the time for all good men to come to the aid of their country. #thetime @evan now is the time for all good men to come to the aid of their country. #thetime spock http://example.net/user/2 http://activitystrea.ms/schema/1.0/person http://example.net/user/2 spock http://example.net/notice/14 2010-02-19T02:52:38+00:00 2010-02-19T02:52:38+00:00 @<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> EXAMPLE4; $_example5 = << 3 testuser timeline Updates from testuser on Zach Dev! http://example.net/mysite/avatar/3-96-20100224004207.jpeg 2010-02-24T06:38:49+00:00 testuser http://example.net/mysite/user/3 http://activitystrea.ms/schema/1.0/person http://example.net/mysite/user/3 Test User 37.7749295 -122.4194155 testuser Test User Just another test user. San Francisco, CA homepage http://example.com/blog.html true Hey man, is that Freedom Code?! #freedom #hippy Hey man, is that Freedom Code?! #freedom #hippy testuser http://example.net/mysite/user/3 http://activitystrea.ms/schema/1.0/person http://example.net/mysite/user/3 Test User 37.7749295 -122.4194155 testuser Test User Just another test user. San Francisco, CA homepage http://example.com/blog.html true http://example.net/mysite/notice/7 2010-02-24T00:53:06+00:00 2010-02-24T00:53:06+00:00 Hey man, is that Freedom Code?! #<span class="tag"><a href="http://example.net/mysite/tag/freedom" rel="tag">freedom</a></span> #<span class="tag"><a href="http://example.net/mysite/tag/hippy" rel="tag">hippy</a></span> 37.8313160 -122.2852473 EXAMPLE5; $_example6 = << WordPress.com News http://en.blog.wordpress.com The latest news on WordPress.com and the WordPress community. Thu, 18 Mar 2010 23:25:35 +0000 http://wordpress.com/ en hourly 1 http://www.gravatar.com/blavatar/e6392390e3bcfadff3671c5a5653d95b?s=96&d=http://s2.wp.com/i/buttonw-com.png WordPress.com News http://en.blog.wordpress.com EXAMPLE6; $_example7 = << evanpro's posterous http://evanpro.posterous.com Most recent posts at evanpro's posterous posterous.com Sat, 20 Mar 2010 07:32:31 -0700 Checking out captain bones http://evanpro.posterous.com/checking-out-captain-bones http://evanpro.posterous.com/checking-out-captain-bones

Bones!

Permalink | Leave a comment  »

]]>
http://files.posterous.com/user_profile_pics/480326/2009-08-05-142447.jpg http://posterous.com/people/3sDslhaepotz Evan Prodromou evanpro Evan Prodromou
EXAMPLE7; $_example8 = << Activity Stream for: zcopley http://cliqset.com/feed/atom?uid=zcopley 0 http://activitystrea.ms/schema/1.0/post 2010-03-22T01:35:53.000Z flickr http://flickr.com http://cliqset-services.s3.amazonaws.com/flickr.png http://activitystrea.ms/schema/1.0/photo IMG_1368 http://activitystrea.ms/schema/1.0/photo IMG_1365 http://activitystrea.ms/schema/1.0/photo Classic -Powered by pikchur.com/n0u http://activitystrea.ms/schema/1.0/photo IMG_1363 http://activitystrea.ms/schema/1.0/photo IMG_1361 zcopley posted some photos on Flickr zcopley posted 5 photos on Flickr 2010-03-22T20:46:42.778Z tag:cliqset.com,2010-03-22:/user/zcopley/SVgAZubGhtAnSAee zcopley http://cliqset.com/user/zcopley http://activitystrea.ms/schema/1.0/person zcopley Zach Copley EXAMPLE8; $_example9 = << Test 2010-03-22T01:55:53.596Z test53725745374 test Buzz by Zach Copley from Flickr IMG_1366 2010-03-18T04:29:23.000Z 2010-03-18T05:14:03.325Z test53725745374entry Zach Copley https://mywebsite.net/profiles/zcopley <div>IMG_1366</div> IMG_1366 IMG_1365 http://activitystrea.ms/schema/1.0/post http://activitystrea.ms/schema/1.0/photo test53725745374entry Buzz by Zach Copley from Flickr <div>IMG_1366</div> 0 EXAMPLE9; // Sample PuSH entry from a group feed in 0.9.7 // Old has been removed from entries in this version. // A bug in the order of input processing meant that we were incorrectly // reading the feed's instead of the entry's , // causing the entry to get rejected as malformed (groups can't post on // their own; we want to see the actual author's info here). $_example10 = << StatusNet http://lazarus.local/mublog/api/statusnet/groups/timeline/22.atom grouptest316173 timeline Updates from grouptest316173 on Blaguette! http://lazarus.local/mublog/theme/default/default-avatar-profile.png 2011-01-06T22:44:18+00:00 http://activitystrea.ms/schema/1.0/group http://lazarus.local/mublog/group/22/id grouptest316173 grouptest316173 grouptest316173 http://activitystrea.ms/schema/1.0/group http://lazarus.local/mublog/group/22/id grouptest316173 grouptest316173 grouptest316173 http://activitystrea.ms/schema/1.0/note http://lazarus.local/mublog/notice/1243 Group post from local to !grouptest316173, should go out over push. Group post from local to !<span class="vcard"><a href="http://lazarus.local/mublog/group/22/id" class="url"><span class="fn nickname">grouptest316173</span></a></span>, should go out over push. http://activitystrea.ms/schema/1.0/post 2011-01-06T22:44:18+00:00 2011-01-06T22:44:18+00:00 http://activitystrea.ms/schema/1.0/person http://lazarus.local/mublog/user/557 Pubtest316173 Smith pubtest316173 Pubtest316173 Smith Stub account for OStatus tests. homepage http://example.org/pubtest316173 true http://lazarus.local/mublog/api/statuses/user_timeline/557.atom Pubtest316173 Smith http://lazarus.local/mublog/theme/default/default-avatar-profile.png 2011-01-06T22:44:18+00:00 EXAMPLE10; $_example11 = << StatusNet http://freelish.us/api/statuses/user_timeline/1.atom demon timeline Updates from demon on freelish.us! http://avatar.status.net/f/freelishus/1-96-20110331163048.jpeg 2011-05-30T09:36:03-04:00 http://activitystrea.ms/schema/1.0/person http://freelishus.status.net/user/1 demon 45.50884 -73.58781 demon Evan Prodromou Montreal hacker and entrepreneur. Montreal, Quebec homepage http://evan.status.net/ true http://activitystrea.ms/schema/1.0/person http://freelishus.status.net/user/1 Evan Prodromou 45.50884 -73.58781 demon Evan Prodromou Montreal hacker and entrepreneur. Montreal, Quebec homepage http://evan.status.net/ true http://activitystrea.ms/schema/1.0/bookmark http://freelish.us/bookmark/9e930c3e-7ed9-47de-aba5-df6c60cec542 Why you should build an open-source startup | Teambox Blog http://activitystrea.ms/schema/1.0/post 2011-05-26T20:36:25+00:00 2011-05-26T20:36:25+00:00 EXAMPLE11;