Apply Patch
[akkoma] / test / pleroma / web / activity_pub / object_validators / update_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.ObjectValidators.UpdateHandlingTest do
6 use Pleroma.DataCase, async: true
7
8 alias Pleroma.Web.ActivityPub.Builder
9 alias Pleroma.Web.ActivityPub.ObjectValidator
10
11 import Pleroma.Factory
12
13 describe "updates" do
14 setup do
15 user = insert(:user)
16
17 object = %{
18 "id" => user.ap_id,
19 "name" => "A new name",
20 "summary" => "A new bio"
21 }
22
23 {:ok, valid_update, []} = Builder.update(user, object)
24
25 %{user: user, valid_update: valid_update}
26 end
27
28 test "validates a basic object", %{valid_update: valid_update} do
29 assert {:ok, _update, []} = ObjectValidator.validate(valid_update, [])
30 end
31
32 test "returns an error if the object can't be updated by the actor", %{
33 valid_update: valid_update
34 } do
35 other_user = insert(:user, local: false)
36
37 update =
38 valid_update
39 |> Map.put("actor", other_user.ap_id)
40
41 assert {:error, _cng} = ObjectValidator.validate(update, [])
42 end
43
44 test "validates as long as the object is same-origin with the actor", %{
45 valid_update: valid_update
46 } do
47 other_user = insert(:user)
48
49 update =
50 valid_update
51 |> Map.put("actor", other_user.ap_id)
52
53 assert {:ok, _update, []} = ObjectValidator.validate(update, [])
54 end
55
56 test "validates if the object is not of an Actor type" do
57 note = insert(:note)
58 updated_note = note.data |> Map.put("content", "edited content")
59 other_user = insert(:user)
60
61 {:ok, update, _} = Builder.update(other_user, updated_note)
62
63 assert {:ok, _update, _} = ObjectValidator.validate(update, [])
64 end
65 end
66
67 describe "update note" do
68 test "converts object into Pleroma's format" do
69 mastodon_tags = [
70 %{
71 "icon" => %{
72 "mediaType" => "image/png",
73 "type" => "Image",
74 "url" => "https://somewhere.org/emoji/url/1.png"
75 },
76 "id" => "https://somewhere.org/emoji/1",
77 "name" => ":some_emoji:",
78 "type" => "Emoji",
79 "updated" => "2021-04-07T11:00:00Z"
80 }
81 ]
82
83 user = insert(:user)
84 note = insert(:note, user: user)
85
86 updated_note =
87 note.data
88 |> Map.put("content", "edited content")
89 |> Map.put("tag", mastodon_tags)
90
91 {:ok, update, _} = Builder.update(user, updated_note)
92
93 assert {:ok, _update, meta} = ObjectValidator.validate(update, [])
94
95 assert %{"emoji" => %{"some_emoji" => "https://somewhere.org/emoji/url/1.png"}} =
96 meta[:object_data]
97 end
98
99 test "returns no object_data in meta for a local Update" do
100 user = insert(:user)
101 note = insert(:note, user: user)
102
103 updated_note =
104 note.data
105 |> Map.put("content", "edited content")
106
107 {:ok, update, _} = Builder.update(user, updated_note)
108
109 assert {:ok, _update, meta} = ObjectValidator.validate(update, local: true)
110 assert is_nil(meta[:object_data])
111 end
112
113 test "returns object_data in meta for a remote Update" do
114 user = insert(:user)
115 note = insert(:note, user: user)
116
117 updated_note =
118 note.data
119 |> Map.put("content", "edited content")
120
121 {:ok, update, _} = Builder.update(user, updated_note)
122
123 assert {:ok, _update, meta} = ObjectValidator.validate(update, local: false)
124 assert meta[:object_data]
125
126 assert {:ok, _update, meta} = ObjectValidator.validate(update, [])
127 assert meta[:object_data]
128 end
129 end
130
131 describe "update with history" do
132 setup do
133 user = insert(:user)
134 {:ok, activity} = Pleroma.Web.CommonAPI.post(user, %{status: "mew mew :dinosaur:"})
135 {:ok, edit} = Pleroma.Web.CommonAPI.update(user, activity, %{status: "edited :blank:"})
136 {:ok, external_rep} = Pleroma.Web.ActivityPub.Transmogrifier.prepare_outgoing(edit.data)
137 %{external_rep: external_rep}
138 end
139
140 test "edited note", %{external_rep: external_rep} do
141 {:ok, _validate_res, meta} = ObjectValidator.validate(external_rep, [])
142
143 assert %{"formerRepresentations" => %{"orderedItems" => [%{"emoji" => %{"dinosaur" => _}}]}} =
144 meta[:object_data]
145 end
146
147 test "edited note, badly-formed formerRepresentations", %{external_rep: external_rep} do
148 external_rep = put_in(external_rep, ["object", "formerRepresentations"], %{})
149
150 assert {:error, _} = ObjectValidator.validate(external_rep, [])
151 end
152
153 test "edited note, badly-formed history item", %{external_rep: external_rep} do
154 history_item =
155 Enum.at(external_rep["object"]["formerRepresentations"]["orderedItems"], 0)
156 |> Map.put("type", "Foo")
157
158 external_rep =
159 put_in(
160 external_rep,
161 ["object", "formerRepresentations", "orderedItems"],
162 [history_item]
163 )
164
165 assert {:error, _} = ObjectValidator.validate(external_rep, [])
166 end
167 end
168 end