Merge remote-tracking branch 'remotes/upstream/develop' into 1149-oban-job-queue
[akkoma] / test / web / activity_pub / relay_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.ActivityPub.RelayTest do
6 use Pleroma.DataCase
7
8 alias Pleroma.Activity
9 alias Pleroma.Object
10 alias Pleroma.Web.ActivityPub.ActivityPub
11 alias Pleroma.Web.ActivityPub.Relay
12
13 import Pleroma.Factory
14 import Mock
15
16 test "gets an actor for the relay" do
17 user = Relay.get_actor()
18 assert user.ap_id == "#{Pleroma.Web.Endpoint.url()}/relay"
19 end
20
21 describe "follow/1" do
22 test "returns errors when user not found" do
23 assert Relay.follow("test-ap-id") == {:error, "Could not fetch by AP id"}
24 end
25
26 test "returns activity" do
27 user = insert(:user)
28 service_actor = Relay.get_actor()
29 assert {:ok, %Activity{} = activity} = Relay.follow(user.ap_id)
30 assert activity.actor == "#{Pleroma.Web.Endpoint.url()}/relay"
31 assert user.ap_id in activity.recipients
32 assert activity.data["type"] == "Follow"
33 assert activity.data["actor"] == service_actor.ap_id
34 assert activity.data["object"] == user.ap_id
35 end
36 end
37
38 describe "unfollow/1" do
39 test "returns errors when user not found" do
40 assert Relay.unfollow("test-ap-id") == {:error, "Could not fetch by AP id"}
41 end
42
43 test "returns activity" do
44 user = insert(:user)
45 service_actor = Relay.get_actor()
46 ActivityPub.follow(service_actor, user)
47 Pleroma.User.follow(service_actor, user)
48 assert "#{user.ap_id}/followers" in refresh_record(service_actor).following
49 assert {:ok, %Activity{} = activity} = Relay.unfollow(user.ap_id)
50 assert activity.actor == "#{Pleroma.Web.Endpoint.url()}/relay"
51 assert user.ap_id in activity.recipients
52 assert activity.data["type"] == "Undo"
53 assert activity.data["actor"] == service_actor.ap_id
54 assert activity.data["to"] == [user.ap_id]
55 refute "#{user.ap_id}/followers" in refresh_record(service_actor).following
56 end
57 end
58
59 describe "publish/1" do
60 clear_config([:instance, :federating])
61
62 test "returns error when activity not `Create` type" do
63 activity = insert(:like_activity)
64 assert Relay.publish(activity) == {:error, "Not implemented"}
65 end
66
67 test "returns error when activity not public" do
68 activity = insert(:direct_note_activity)
69 assert Relay.publish(activity) == {:error, false}
70 end
71
72 test "returns error when object is unknown" do
73 activity =
74 insert(:note_activity,
75 data: %{
76 "type" => "Create",
77 "object" => "http://mastodon.example.org/eee/99541947525187367"
78 }
79 )
80
81 assert Relay.publish(activity) == {:error, nil}
82 end
83
84 test_with_mock "returns announce activity and publish to federate",
85 Pleroma.Web.Federator,
86 [:passthrough],
87 [] do
88 Pleroma.Config.put([:instance, :federating], true)
89 service_actor = Relay.get_actor()
90 note = insert(:note_activity)
91 assert {:ok, %Activity{} = activity, %Object{} = obj} = Relay.publish(note)
92 assert activity.data["type"] == "Announce"
93 assert activity.data["actor"] == service_actor.ap_id
94 assert activity.data["object"] == obj.data["id"]
95 assert called(Pleroma.Web.Federator.publish(activity))
96 end
97
98 test_with_mock "returns announce activity and not publish to federate",
99 Pleroma.Web.Federator,
100 [:passthrough],
101 [] do
102 Pleroma.Config.put([:instance, :federating], false)
103 service_actor = Relay.get_actor()
104 note = insert(:note_activity)
105 assert {:ok, %Activity{} = activity, %Object{} = obj} = Relay.publish(note)
106 assert activity.data["type"] == "Announce"
107 assert activity.data["actor"] == service_actor.ap_id
108 assert activity.data["object"] == obj.data["id"]
109 refute called(Pleroma.Web.Federator.publish(activity))
110 end
111 end
112 end