Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into announce-validator
[akkoma] / test / web / activity_pub / transmogrifier / announce_handling_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.ActivityPub.Transmogrifier.AnnounceHandlingTest do
6 use Pleroma.DataCase
7
8 alias Pleroma.Activity
9 alias Pleroma.Object
10 alias Pleroma.Web.CommonAPI
11 alias Pleroma.Web.ActivityPub.Transmogrifier
12
13 import Pleroma.Factory
14
15 test "it works for incoming honk announces" do
16 _user = insert(:user, ap_id: "https://honktest/u/test", local: false)
17 other_user = insert(:user)
18 {:ok, post} = CommonAPI.post(other_user, %{status: "bonkeronk"})
19
20 announce = %{
21 "@context" => "https://www.w3.org/ns/activitystreams",
22 "actor" => "https://honktest/u/test",
23 "id" => "https://honktest/u/test/bonk/1793M7B9MQ48847vdx",
24 "object" => post.data["object"],
25 "published" => "2019-06-25T19:33:58Z",
26 "to" => "https://www.w3.org/ns/activitystreams#Public",
27 "type" => "Announce"
28 }
29
30 {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(announce)
31 end
32
33 test "it works for incoming announces with actor being inlined (kroeg)" do
34 data = File.read!("test/fixtures/kroeg-announce-with-inline-actor.json") |> Poison.decode!()
35
36 _user = insert(:user, local: false, ap_id: data["actor"]["id"])
37 other_user = insert(:user)
38
39 {:ok, post} = CommonAPI.post(other_user, %{status: "kroegeroeg"})
40
41 data =
42 data
43 |> put_in(["object", "id"], post.data["object"])
44
45 {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
46
47 assert data["actor"] == "https://puckipedia.com/"
48 end
49
50 test "it works for incoming announces, fetching the announced object" do
51 Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
52 data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode!()
53
54 _user = insert(:user, local: false, ap_id: data["actor"])
55
56 {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
57
58 assert data["actor"] == "http://mastodon.example.org/users/admin"
59 assert data["type"] == "Announce"
60
61 assert data["id"] ==
62 "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
63
64 assert data["object"] ==
65 "http://mastodon.example.org/users/admin/statuses/99541947525187367"
66
67 assert(Activity.get_create_by_object_ap_id(data["object"]))
68 end
69
70 @tag capture_log: true
71 test "it works for incoming announces with an existing activity" do
72 user = insert(:user)
73 {:ok, activity} = CommonAPI.post(user, %{status: "hey"})
74
75 data =
76 File.read!("test/fixtures/mastodon-announce.json")
77 |> Poison.decode!()
78 |> Map.put("object", activity.data["object"])
79
80 _user = insert(:user, local: false, ap_id: data["actor"])
81
82 {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
83
84 assert data["actor"] == "http://mastodon.example.org/users/admin"
85 assert data["type"] == "Announce"
86
87 assert data["id"] ==
88 "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
89
90 assert data["object"] == activity.data["object"]
91
92 assert Activity.get_create_by_object_ap_id(data["object"]).id == activity.id
93 end
94
95 test "it works for incoming announces with an inlined activity" do
96 data =
97 File.read!("test/fixtures/mastodon-announce-private.json")
98 |> Poison.decode!()
99
100 _user =
101 insert(:user,
102 local: false,
103 ap_id: data["actor"],
104 follower_address: data["actor"] <> "/followers"
105 )
106
107 {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
108
109 assert data["actor"] == "http://mastodon.example.org/users/admin"
110 assert data["type"] == "Announce"
111
112 assert data["id"] ==
113 "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
114
115 object = Object.normalize(data["object"])
116
117 assert object.data["id"] == "http://mastodon.example.org/@admin/99541947525187368"
118 assert object.data["content"] == "this is a private toot"
119 end
120
121 @tag capture_log: true
122 test "it rejects incoming announces with an inlined activity from another origin" do
123 Tesla.Mock.mock(fn
124 %{method: :get} -> %Tesla.Env{status: 404, body: ""}
125 end)
126
127 data =
128 File.read!("test/fixtures/bogus-mastodon-announce.json")
129 |> Poison.decode!()
130
131 _user = insert(:user, local: false, ap_id: data["actor"])
132
133 assert {:error, e} = Transmogrifier.handle_incoming(data)
134 end
135
136 test "it does not clobber the addressing on announce activities" do
137 user = insert(:user)
138 {:ok, activity} = CommonAPI.post(user, %{status: "hey"})
139
140 data =
141 File.read!("test/fixtures/mastodon-announce.json")
142 |> Poison.decode!()
143 |> Map.put("object", Object.normalize(activity).data["id"])
144 |> Map.put("to", ["http://mastodon.example.org/users/admin/followers"])
145 |> Map.put("cc", [])
146
147 _user =
148 insert(:user,
149 local: false,
150 ap_id: data["actor"],
151 follower_address: "http://mastodon.example.org/users/admin/followers"
152 )
153
154 {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
155
156 assert data["to"] == ["http://mastodon.example.org/users/admin/followers"]
157 end
158 end