1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.ActivityPub.Transmogrifier.RejectHandlingTest do
6 use Pleroma.DataCase, async: true
10 alias Pleroma.Web.ActivityPub.Transmogrifier
11 alias Pleroma.Web.ActivityPub.Utils
12 alias Pleroma.Web.CommonAPI
14 import Pleroma.Factory
16 test "it fails for incoming rejects which cannot be correlated" do
17 follower = insert(:user)
18 followed = insert(:user, is_locked: true)
21 File.read!("test/fixtures/mastodon-reject-activity.json")
23 |> Map.put("actor", followed.ap_id)
26 Map.put(accept_data, "object", Map.put(accept_data["object"], "actor", follower.ap_id))
28 {:error, _} = Transmogrifier.handle_incoming(accept_data)
30 follower = User.get_cached_by_id(follower.id)
32 refute User.following?(follower, followed) == true
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)
39 {:ok, follower, followed} = User.follow(follower, followed)
40 {:ok, _, _, follow_activity} = CommonAPI.follow(follower, followed)
42 assert User.following?(follower, followed) == true
45 File.read!("test/fixtures/mastodon-reject-activity.json")
47 |> Map.put("actor", followed.ap_id)
48 |> Map.put("object", follow_activity.data["id"])
50 {:ok, %Activity{data: _}} = Transmogrifier.handle_incoming(reject_data)
52 follower = User.get_cached_by_id(follower.id)
54 assert User.following?(follower, followed) == false
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)
63 insert(:follow_activity, follower: follower, followed: followed, state: "pending")
65 refute User.following?(follower, followed)
67 without_id = Map.delete(pending_follow.data, "id")
70 File.read!("test/fixtures/mastodon-reject-activity.json")
72 |> Map.put("actor", followed.ap_id)
74 |> Map.put("object", without_id)
76 {:ok, %Activity{data: _}} = Transmogrifier.handle_incoming(reject_data)
78 follower = User.get_cached_by_id(follower.id)
80 refute User.following?(follower, followed)
81 assert Utils.fetch_latest_follow(follower, followed).data["state"] == "reject"
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)
92 without_id = Map.delete(follow_activity.data, "id")
95 File.read!("test/fixtures/mastodon-reject-activity.json")
97 |> Map.put("actor", followed.ap_id)
99 |> Map.put("object", without_id)
101 {:ok, %Activity{data: _}} = Transmogrifier.handle_incoming(reject_data)
103 follower = User.get_cached_by_id(follower.id)
105 refute User.following?(follower, followed)
106 assert Utils.fetch_latest_follow(follower, followed).data["state"] == "reject"
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)
114 insert(:follow_activity, follower: follower, followed: followed, state: "reject")
116 refute User.following?(follower, followed)
118 without_id = Map.delete(rejected_follow.data, "id")
121 File.read!("test/fixtures/mastodon-accept-activity.json")
123 |> Map.put("actor", followed.ap_id)
124 |> Map.put("object", without_id)
126 {:error, _} = Transmogrifier.handle_incoming(accept_data)
128 refute User.following?(follower, followed)
132 test "it rejects activities without a valid ID" do
136 File.read!("test/fixtures/mastodon-follow-activity.json")
138 |> Map.put("object", user.ap_id)
141 :error = Transmogrifier.handle_incoming(data)