diff options
-rw-r--r-- | tests/unit/Lib/ActivityStreamsTest.php | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/tests/unit/Lib/ActivityStreamsTest.php b/tests/unit/Lib/ActivityStreamsTest.php new file mode 100644 index 000000000..38be1792e --- /dev/null +++ b/tests/unit/Lib/ActivityStreamsTest.php @@ -0,0 +1,136 @@ +<?php +/** + * Unit tests for Zotlabs\Lib\ActivityStreams. + * + * SPDX-FileCopyrightText: 2024 Hubzilla Community + * SPDX-FileContributor: Harald Eilertsen + * + * SPDX-License-Identifier: MIT + */ + +namespace Zotlabs\Tests\Unit\Lib; + +use phpmock\phpunit\PHPMock; +use Zotlabs\Lib\ActivityStreams; +use Zotlabs\Tests\Unit\UnitTestCase; + +class ActivityStreamsTest extends UnitTestCase { + + // Import PHPMock methods into this class + use PHPMock; + + /** + * Test parsing an announce activity of a like from a remote server of + * a note from a third server. + * + * Also test that we fetch the referenced objects when the received + * activity is parsed, + */ + public function test_parse_announce_of_like(): void { + $payload = <<<JSON + { + "actor": "https://lemmy.test/c/technology", + "to": [ + "https://www.w3.org/ns/activitystreams#Public" + ], + "object": { + "id": "https://lemmy.test/activities/like/e6e38c8b-beee-406f-9523-9da7ec97a823", + "actor": "https://lemmy.test/u/SomePerson", + "object": "https://somesite.test/post/1197552", + "type": "Like", + "audience": "https://lemmy.test/c/technology" + }, + "cc": [ + "https://lemmy.test/c/technology/followers" + ], + "type": "Announce", + "id": "https://lemmy.test/activities/announce/like/9e583a54-e4e0-4436-9726-975a14f923ed" + } + JSON; + + // + // Mock z_fetch_url to prevent us from spamming real servers during test runs + // + // We just create some sample ActivityStreams objects to return for the various + // URL's to make it a somewhat realistic test. Each object will have it's URL as + // it's id and only specify the object type as laid out in the $urlmap below. + + $urlmap = [ + 'https://lemmy.test/c/technology' => [ 'type' => 'Group' ], + 'https://lemmy.test/u/SomePerson' => [ 'type' => 'Person' ], + 'https://somesite.test/post/1197552' => [ 'type' => 'Note' ], + ]; + + $z_fetch_url_stub = $this->getFunctionMock('Zotlabs\Lib', 'z_fetch_url'); + $z_fetch_url_stub + ->expects($this->any()) + ->willReturnCallback(function ($url) use ($urlmap) { + if (isset($urlmap[$url])) { + $body = json_encode( + array_merge([ 'id' => $url ], $urlmap[$url]), + JSON_FORCE_OBJECT, + ); + + return [ + 'success' => true, + 'body' => $body, + ]; + } else { + // We should perhaps throw an error here to fail the test, + // as we're receiving an unexpected URL. + return [ + 'success' => false, + ]; + } + }); + + // Make sure we have a sys channel before we start + create_sys_channel(); + + $as = new ActivityStreams($payload); + + $this->assertTrue($as->valid); + + $this->assertEquals( + 'https://lemmy.test/activities/announce/like/9e583a54-e4e0-4436-9726-975a14f923ed', + $as->id + ); + + $this->assertEquals('Announce', $as->type); + + $this->assertIsArray($as->actor); + $this->assertArrayHasKey('id', $as->actor); + $this->assertEquals('https://lemmy.test/c/technology', $as->actor['id']); + $this->assertArrayHasKey('type', $as->actor); + $this->assertEquals('Group', $as->actor['type']); + + $this->assertIsArray($as->recips); + $this->assertContains('https://www.w3.org/ns/activitystreams#Public', $as->recips); + $this->assertContains('https://lemmy.test/c/technology/followers', $as->recips); + $this->assertContains('https://lemmy.test/c/technology', $as->recips); + + $this->assertIsArray($as->obj); + $this->assertArrayHasKey('id', $as->obj); + $this->assertEquals( + 'https://lemmy.test/activities/like/e6e38c8b-beee-406f-9523-9da7ec97a823', + $as->obj['id'] + ); + $this->assertArrayHasKey('type', $as->obj); + $this->assertEquals('Like', $as->obj['type']); + $this->assertArrayHasKey('object', $as->obj); + + $this->assertIsArray($as->obj['object']); + + $this->assertArrayHasKey('id', $as->obj['object']); + $this->assertEquals('https://somesite.test/post/1197552', $as->obj['object']['id']); + + $this->assertArrayHasKey('type', $as->obj['object']); + $this->assertEquals('Note', $as->obj['object']['type']); + + $this->assertIsArray($as->obj['actor']); + $this->assertArrayHasKey('id', $as->obj['actor']); + $this->assertEquals('https://lemmy.test/u/SomePerson', $as->obj['actor']['id']); + $this->assertArrayHasKey('type', $as->obj['actor']); + $this->assertEquals('Person', $as->obj['actor']['type']); + } +} |