Resolve follow activity from accept/reject without ID (#328)
[akkoma] / test / pleroma / web / activity_pub / transmogrifier / reject_handling_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.ActivityPub.Transmogrifier.RejectHandlingTest do
6 use Pleroma.DataCase, async: true
7
8 alias Pleroma.Activity
9 alias Pleroma.User
10 alias Pleroma.Web.ActivityPub.Transmogrifier
11 alias Pleroma.Web.ActivityPub.Utils
12 alias Pleroma.Web.CommonAPI
13
14 import Pleroma.Factory
15
16 test "it fails for incoming rejects which cannot be correlated" do
17 follower = insert(:user)
18 followed = insert(:user, is_locked: true)
19
20 accept_data =
21 File.read!("test/fixtures/mastodon-reject-activity.json")
22 |> Jason.decode!()
23 |> Map.put("actor", followed.ap_id)
24
25 accept_data =
26 Map.put(accept_data, "object", Map.put(accept_data["object"], "actor", follower.ap_id))
27
28 {:error, _} = Transmogrifier.handle_incoming(accept_data)
29
30 follower = User.get_cached_by_id(follower.id)
31
32 refute User.following?(follower, followed) == true
33 end
34
35 test "it works for incoming rejects which are referenced by IRI only" do
36 follower = insert(:user)
37 followed = insert(:user, is_locked: true)
38
39 {:ok, follower, followed} = User.follow(follower, followed)
40 {:ok, _, _, follow_activity} = CommonAPI.follow(follower, followed)
41
42 assert User.following?(follower, followed) == true
43
44 reject_data =
45 File.read!("test/fixtures/mastodon-reject-activity.json")
46 |> Jason.decode!()
47 |> Map.put("actor", followed.ap_id)
48 |> Map.put("object", follow_activity.data["id"])
49
50 {:ok, %Activity{data: _}} = Transmogrifier.handle_incoming(reject_data)
51
52 follower = User.get_cached_by_id(follower.id)
53
54 assert User.following?(follower, followed) == false
55 end
56
57 describe "when accept/reject references a transient activity" do
58 test "it handles accept activities that do not contain an ID key" do
59 follower = insert(:user)
60 followed = insert(:user, is_locked: true)
61
62 pending_follow =
63 insert(:follow_activity, follower: follower, followed: followed, state: "pending")
64
65 refute User.following?(follower, followed)
66
67 without_id = Map.delete(pending_follow.data, "id")
68
69 reject_data =
70 File.read!("test/fixtures/mastodon-reject-activity.json")
71 |> Jason.decode!()
72 |> Map.put("actor", followed.ap_id)
73 |> Map.delete("id")
74 |> Map.put("object", without_id)
75
76 {:ok, %Activity{data: _}} = Transmogrifier.handle_incoming(reject_data)
77
78 follower = User.get_cached_by_id(follower.id)
79
80 refute User.following?(follower, followed)
81 assert Utils.fetch_latest_follow(follower, followed).data["state"] == "reject"
82 end
83
84 test "it handles reject activities that do not contain an ID key" do
85 follower = insert(:user)
86 followed = insert(:user)
87 {:ok, follower, followed} = User.follow(follower, followed)
88 {:ok, _, _, follow_activity} = CommonAPI.follow(follower, followed)
89 assert Utils.fetch_latest_follow(follower, followed).data["state"] == "accept"
90 assert User.following?(follower, followed)
91
92 without_id = Map.delete(follow_activity.data, "id")
93
94 reject_data =
95 File.read!("test/fixtures/mastodon-reject-activity.json")
96 |> Jason.decode!()
97 |> Map.put("actor", followed.ap_id)
98 |> Map.delete("id")
99 |> Map.put("object", without_id)
100
101 {:ok, %Activity{data: _}} = Transmogrifier.handle_incoming(reject_data)
102
103 follower = User.get_cached_by_id(follower.id)
104
105 refute User.following?(follower, followed)
106 assert Utils.fetch_latest_follow(follower, followed).data["state"] == "reject"
107 end
108
109 test "it does not accept follows that are not in pending or accepted" do
110 follower = insert(:user)
111 followed = insert(:user, is_locked: true)
112
113 rejected_follow =
114 insert(:follow_activity, follower: follower, followed: followed, state: "reject")
115
116 refute User.following?(follower, followed)
117
118 without_id = Map.delete(rejected_follow.data, "id")
119
120 accept_data =
121 File.read!("test/fixtures/mastodon-accept-activity.json")
122 |> Jason.decode!()
123 |> Map.put("actor", followed.ap_id)
124 |> Map.put("object", without_id)
125
126 {:error, _} = Transmogrifier.handle_incoming(accept_data)
127
128 refute User.following?(follower, followed)
129 end
130 end
131
132 test "it rejects activities without a valid ID" do
133 user = insert(:user)
134
135 data =
136 File.read!("test/fixtures/mastodon-follow-activity.json")
137 |> Jason.decode!()
138 |> Map.put("object", user.ap_id)
139 |> Map.put("id", "")
140
141 :error = Transmogrifier.handle_incoming(data)
142 end
143 end