move to 2.5.5
[anni] / test / pleroma / web / activity_pub / object_validators / update_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.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