. 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/util/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); static::assertFalse(empty($act)); static::assertFalse(empty($act->objects[0])); $object = $act->objects[0]; static::assertSame($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); static::assertFalse(empty($act)); static::assertFalse(empty($act->objects[0])); $object = $act->objects[0]; static::assertSame($object->verb, ActivityVerb::POST); } public function testExample1() { global $_example1; $dom = new DOMDocument(); $dom->loadXML($_example1); $act = new Activity($dom->documentElement); static::assertFalse(empty($act)); static::assertSame(1243860840, $act->time); static::assertSame(ActivityVerb::POST, $act->verb); static::assertFalse(empty($act->objects[0])); static::assertSame('Punctuation Changeset', $act->objects[0]->title); static::assertSame('http://versioncentral.example.org/activity/changeset', $act->objects[0]->type); static::assertSame('Fixing punctuation because it makes it more readable.', $act->objects[0]->summary); static::assertSame('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); static::assertFalse(empty($act)); // Did we handle correctly with a typical payload? static::assertSame("

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); static::assertFalse(empty($act)); static::assertSame(1071340202, $act->time); static::assertSame('http://example.org/2003/12/13/atom03.html', $act->link); static::assertSame($act->verb, ActivityVerb::POST); static::assertFalse(empty($act->actor)); static::assertSame(ActivityObject::PERSON, $act->actor->type); static::assertSame('John Doe', $act->actor->title); static::assertSame('mailto:johndoe@example.com', $act->actor->id); static::assertFalse(empty($act->objects[0])); static::assertSame(ActivityObject::NOTE, $act->objects[0]->type); static::assertSame('urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', $act->objects[0]->id); static::assertSame('Atom-Powered Robots Run Amok', $act->objects[0]->title); static::assertSame('Some text.', $act->objects[0]->summary); static::assertSame('http://example.org/2003/12/13/atom03.html', $act->objects[0]->link); static::assertFalse(empty($act->context)); static::assertTrue(empty($act->target)); static::assertSame($act->entry, $entry); static::assertSame($act->feed, $feed); } public function testExample4() { global $_example4; $dom = new DOMDocument(); $dom->loadXML($_example4); $entry = $dom->documentElement; $act = new Activity($entry); static::assertFalse(empty($act)); static::assertSame(1266547958, $act->time); static::assertSame('http://example.net/notice/14', $act->link); static::assertFalse(empty($act->context)); static::assertSame('http://example.net/notice/12', $act->context->replyToID); static::assertSame('http://example.net/notice/12', $act->context->replyToUrl); static::assertSame('http://example.net/conversation/11', $act->context->conversation); static::assertSame(['http://example.net/user/1'], array_keys($act->context->attention)); static::assertFalse(empty($act->objects[0])); static::assertSame( $act->objects[0]->content, '@evan now is the time for all good men to come to the aid of their country. #' ); static::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 static::assertSame($act->verb, ActivityVerb::POST); static::assertFalse(empty($act->context)); // Actor w/Portable Contacts stuff static::assertFalse(empty($act->actor)); static::assertSame($act->actor->type, ActivityObject::PERSON); static::assertSame($act->actor->title, 'Test User'); static::assertSame($act->actor->id, 'http://example.net/mysite/user/3'); static::assertSame($act->actor->link, 'http://example.net/mysite/testuser'); $avatars = $act->actor->avatarLinks; static::assertSame( $avatars[0]->url, 'http://example.net/mysite/avatar/3-96-20100224004207.jpeg' ); static::assertSame($act->actor->displayName, 'Test User'); $poco = $act->actor->poco; static::assertSame($poco->preferredUsername, 'testuser'); static::assertSame($poco->address->formatted, 'San Francisco, CA'); static::assertSame($poco->urls[0]->type, 'homepage'); static::assertSame($poco->urls[0]->value, 'http://example.com/blog.html'); static::assertSame($poco->urls[0]->primary, 'true'); static::assertSame($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); static::assertSame($act->verb, ActivityVerb::POST); static::assertSame($act->id, 'http://en.blog.wordpress.com/?p=3857'); static::assertSame($act->link, 'http://en.blog.wordpress.com/2010/03/03/rub-a-dub-dub-in-the-pubsubhubbub/'); static::assertSame($act->title, 'Rub-a-Dub-Dub in the PubSubHubbub'); static::assertSame($act->time, 1267634892); $actor = $act->actor; static::assertFalse(empty($actor)); static::assertSame($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); static::assertSame(ActivityVerb::POST, $act->verb); static::assertSame('http://evanpro.posterous.com/checking-out-captain-bones', $act->link); static::assertSame('http://evanpro.posterous.com/checking-out-captain-bones', $act->id); static::assertSame('Checking out captain bones', $act->title); static::assertSame(1269095551, $act->time); $actor = $act->actor; static::assertSame(ActivityObject::PERSON, $actor->type); static::assertSame('http://posterous.com/people/3sDslhaepotz', $actor->id); static::assertSame('Evan Prodromou', $actor->title); static::assertNull($actor->summary); static::assertNull($actor->content); static::assertSame('http://posterous.com/people/3sDslhaepotz', $actor->link); static::assertNull($actor->source); static::assertTrue(is_array($actor->avatarLinks)); static::assertSame(1, count($actor->avatarLinks)); static::assertSame( 'http://files.posterous.com/user_profile_pics/480326/2009-08-05-142447.jpg', $actor->avatarLinks[0]->url ); static::assertNotNull($actor->poco); static::assertSame('evanpro', $actor->poco->preferredUsername); static::assertSame('Evan Prodromou', $actor->poco->displayName); static::assertNull($actor->poco->note); static::assertNull($actor->poco->address); static::assertSame(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); static::assertFalse(empty($act)); static::assertSame($act->time, 1269221753); static::assertSame($act->verb, ActivityVerb::POST); static::assertSame($act->summary, 'zcopley posted 5 photos on Flickr'); static::assertFalse(empty($act->objects)); static::assertSame(sizeof($act->objects), 5); static::assertSame($act->objects[0]->type, ActivityObject::PHOTO); static::assertSame($act->objects[0]->title, 'IMG_1368'); static::assertNull($act->objects[0]->description); static::assertSame( $act->objects[0]->thumbnail, 'http://media.cliqset.com/6f6fbee9d7dfbffc73b6ef626275eb5f_thumb.jpg' ); static::assertSame( $act->objects[0]->link, 'http://www.flickr.com/photos/zcopley/4452933806/' ); static::assertSame($act->objects[1]->type, ActivityObject::PHOTO); static::assertSame($act->objects[1]->title, 'IMG_1365'); static::assertNull($act->objects[1]->description); static::assertSame( $act->objects[1]->thumbnail, 'http://media.cliqset.com/b8f3932cd0bba1b27f7c8b3ef986915e_thumb.jpg' ); static::assertSame( $act->objects[1]->link, 'http://www.flickr.com/photos/zcopley/4442630390/' ); static::assertSame($act->objects[2]->type, ActivityObject::PHOTO); static::assertSame($act->objects[2]->title, 'Classic'); static::assertSame( $act->objects[2]->description, '-Powered by pikchur.com/n0u' ); static::assertSame( $act->objects[2]->thumbnail, 'http://media.cliqset.com/fc54c15f850b7a9a8efa644087a48c91_thumb.jpg' ); static::assertSame( $act->objects[2]->link, 'http://www.flickr.com/photos/zcopley/4430754103/' ); static::assertSame($act->objects[3]->type, ActivityObject::PHOTO); static::assertSame($act->objects[3]->title, 'IMG_1363'); static::assertNull($act->objects[3]->description); static::assertSame( $act->objects[3]->thumbnail, 'http://media.cliqset.com/4b1d307c9217e2114391a8b229d612cb_thumb.jpg' ); static::assertSame( $act->objects[3]->link, 'http://www.flickr.com/photos/zcopley/4416969717/' ); static::assertSame($act->objects[4]->type, ActivityObject::PHOTO); static::assertSame($act->objects[4]->title, 'IMG_1361'); static::assertNull($act->objects[4]->description); static::assertSame( $act->objects[4]->thumbnail, 'http://media.cliqset.com/23d9b4b96b286e0347d36052f22f6e60_thumb.jpg' ); static::assertSame( $act->objects[4]->link, 'http://www.flickr.com/photos/zcopley/4417734232/' ); } public function testAtomContent() { $tests = [['Some regular plain text.', 'Some regular plain text.',], ['<b>this is not HTML</b>', '<b>this is not HTML</b>',], ["Some regular plain HTML.", 'Some regular plain HTML.',], ["<b>this is too HTML</b>", 'this is too HTML',], ["&lt;b&gt;but this is not HTML!&lt;/b&gt;", '<b>but this is not HTML!</b>',], ["
Some regular plain XHTML.
", 'Some regular plain XHTML.',], ["
This is some XHTML!
", 'This is some XHTML!',], ["
<b>This is not some XHTML!</b>
", '<b>This is not some XHTML!</b>',], ["
&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); static::assertFalse(empty($act)); static::assertSame($output, trim($act->content)); } } public function testRssContent() { $tests = [['Some regular plain HTML.', 'Some regular plain HTML.',], ['Some <b>exciting bold HTML</b>', 'Some exciting bold HTML',], ['Some &lt;b&gt;escaped non-HTML.&lt;/b&gt;', 'Some <b>escaped non-HTML.</b>',], ['Some plain text.', 'Some plain text.',], ['Some <b>non-HTML text</b>', 'Some <b>non-HTML text</b>',], ['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); static::assertFalse(empty($act)); static::assertSame($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); static::assertSame($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); static::assertSame($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'); static::assertFalse(empty($links)); static::assertTrue(is_array($links)); static::assertSame(count($links), 1); $url = $links[0]->getAttribute('href'); static::assertSame($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;