4a7ff515869abf7897db2ebb515f2f35477802f1
[anni] / test / pleroma / web / activity_pub / transmogrifier / delete_handling_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.ActivityPub.Transmogrifier.DeleteHandlingTest do
6   use Oban.Testing, repo: Pleroma.Repo
7   use Pleroma.DataCase
8
9   alias Pleroma.Activity
10   alias Pleroma.Object
11   alias Pleroma.Tests.ObanHelpers
12   alias Pleroma.User
13   alias Pleroma.Web.ActivityPub.Transmogrifier
14
15   import Pleroma.Factory
16
17   setup_all do
18     Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
19     :ok
20   end
21
22   test "it works for incoming deletes" do
23     activity = insert(:note_activity)
24     deleting_user = insert(:user)
25
26     data =
27       File.read!("test/fixtures/mastodon-delete.json")
28       |> Jason.decode!()
29       |> Map.put("actor", deleting_user.ap_id)
30       |> put_in(["object", "id"], activity.data["object"])
31
32     {:ok, %Activity{actor: actor, local: false, data: %{"id" => id}}} =
33       Transmogrifier.handle_incoming(data)
34
35     assert id == data["id"]
36
37     # We delete the Create activity because we base our timelines on it.
38     # This should be changed after we unify objects and activities
39     refute Activity.get_by_id(activity.id)
40     assert actor == deleting_user.ap_id
41
42     # Objects are replaced by a tombstone object.
43     object = Object.normalize(activity.data["object"], fetch: false)
44     assert object.data["type"] == "Tombstone"
45   end
46
47   test "it works for incoming when the object has been pruned" do
48     activity = insert(:note_activity)
49
50     {:ok, object} =
51       Object.normalize(activity.data["object"], fetch: false)
52       |> Repo.delete()
53
54     # TODO: mock cachex
55     Cachex.del(:object_cache, "object:#{object.data["id"]}")
56
57     deleting_user = insert(:user)
58
59     data =
60       File.read!("test/fixtures/mastodon-delete.json")
61       |> Jason.decode!()
62       |> Map.put("actor", deleting_user.ap_id)
63       |> put_in(["object", "id"], activity.data["object"])
64
65     {:ok, %Activity{actor: actor, local: false, data: %{"id" => id}}} =
66       Transmogrifier.handle_incoming(data)
67
68     assert id == data["id"]
69
70     # We delete the Create activity because we base our timelines on it.
71     # This should be changed after we unify objects and activities
72     refute Activity.get_by_id(activity.id)
73     assert actor == deleting_user.ap_id
74   end
75
76   test "it fails for incoming deletes with spoofed origin" do
77     activity = insert(:note_activity)
78     %{ap_id: ap_id} = insert(:user, ap_id: "https://gensokyo.2hu/users/raymoo")
79
80     data =
81       File.read!("test/fixtures/mastodon-delete.json")
82       |> Jason.decode!()
83       |> Map.put("actor", ap_id)
84       |> put_in(["object", "id"], activity.data["object"])
85
86     assert match?({:error, _}, Transmogrifier.handle_incoming(data))
87   end
88
89   @tag capture_log: true
90   test "it works for incoming user deletes" do
91     %{ap_id: ap_id} = insert(:user, ap_id: "http://mastodon.example.org/users/admin")
92
93     data =
94       File.read!("test/fixtures/mastodon-delete-user.json")
95       |> Jason.decode!()
96
97     {:ok, _} = Transmogrifier.handle_incoming(data)
98     ObanHelpers.perform_all()
99
100     refute User.get_cached_by_ap_id(ap_id).is_active
101   end
102
103   test "it fails for incoming user deletes with spoofed origin" do
104     %{ap_id: ap_id} = insert(:user)
105
106     data =
107       File.read!("test/fixtures/mastodon-delete-user.json")
108       |> Jason.decode!()
109       |> Map.put("actor", ap_id)
110
111     assert match?({:error, _}, Transmogrifier.handle_incoming(data))
112
113     assert User.get_cached_by_ap_id(ap_id)
114   end
115 end