83bf59c6f3425944d3eb070ac1086b44fc59416d
[anni] / test / pleroma / web / activity_pub / transmogrifier / emoji_react_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.EmojiReactHandlingTest do
6   use Pleroma.DataCase, async: true
7
8   alias Pleroma.Activity
9   alias Pleroma.Object
10   alias Pleroma.Web.ActivityPub.Transmogrifier
11   alias Pleroma.Web.CommonAPI
12
13   import Pleroma.Factory
14
15   test "it works for incoming emoji reactions" do
16     user = insert(:user)
17     other_user = insert(:user, local: false)
18     {:ok, activity} = CommonAPI.post(user, %{status: "hello"})
19
20     data =
21       File.read!("test/fixtures/emoji-reaction.json")
22       |> Jason.decode!()
23       |> Map.put("object", activity.data["object"])
24       |> Map.put("actor", other_user.ap_id)
25
26     {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
27
28     assert data["actor"] == other_user.ap_id
29     assert data["type"] == "EmojiReact"
30     assert data["id"] == "http://mastodon.example.org/users/admin#reactions/2"
31     assert data["object"] == activity.data["object"]
32     assert data["content"] == "👌"
33
34     object = Object.get_by_ap_id(data["object"])
35
36     assert object.data["reaction_count"] == 1
37     assert match?([["👌", _]], object.data["reactions"])
38   end
39
40   test "it works for incoming unqualified emoji reactions" do
41     user = insert(:user)
42     other_user = insert(:user, local: false)
43     {:ok, activity} = CommonAPI.post(user, %{status: "hello"})
44
45     # woman detective emoji, unqualified
46     unqualified_emoji = [0x1F575, 0x200D, 0x2640] |> List.to_string()
47
48     data =
49       File.read!("test/fixtures/emoji-reaction.json")
50       |> Jason.decode!()
51       |> Map.put("object", activity.data["object"])
52       |> Map.put("actor", other_user.ap_id)
53       |> Map.put("content", unqualified_emoji)
54
55     {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
56
57     assert data["actor"] == other_user.ap_id
58     assert data["type"] == "EmojiReact"
59     assert data["id"] == "http://mastodon.example.org/users/admin#reactions/2"
60     assert data["object"] == activity.data["object"]
61     # woman detective emoji, fully qualified
62     emoji = [0x1F575, 0xFE0F, 0x200D, 0x2640, 0xFE0F] |> List.to_string()
63     assert data["content"] == emoji
64
65     object = Object.get_by_ap_id(data["object"])
66
67     assert object.data["reaction_count"] == 1
68     assert match?([[^emoji, _]], object.data["reactions"])
69   end
70
71   test "it reject invalid emoji reactions" do
72     user = insert(:user)
73     other_user = insert(:user, local: false)
74     {:ok, activity} = CommonAPI.post(user, %{status: "hello"})
75
76     data =
77       File.read!("test/fixtures/emoji-reaction-too-long.json")
78       |> Jason.decode!()
79       |> Map.put("object", activity.data["object"])
80       |> Map.put("actor", other_user.ap_id)
81
82     assert {:error, _} = Transmogrifier.handle_incoming(data)
83
84     data =
85       File.read!("test/fixtures/emoji-reaction-no-emoji.json")
86       |> Jason.decode!()
87       |> Map.put("object", activity.data["object"])
88       |> Map.put("actor", other_user.ap_id)
89
90     assert {:error, _} = Transmogrifier.handle_incoming(data)
91   end
92 end