aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/unit/Lib/ActivityStreamsTest.php136
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']);
+ }
+}