Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into feature/emojireactv...
[akkoma] / test / web / activity_pub / side_effects_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.SideEffectsTest do
6 use Oban.Testing, repo: Pleroma.Repo
7 use Pleroma.DataCase
8
9 alias Pleroma.Activity
10 alias Pleroma.Notification
11 alias Pleroma.Object
12 alias Pleroma.Repo
13 alias Pleroma.Tests.ObanHelpers
14 alias Pleroma.User
15 alias Pleroma.Web.ActivityPub.ActivityPub
16 alias Pleroma.Web.ActivityPub.Builder
17 alias Pleroma.Web.ActivityPub.SideEffects
18 alias Pleroma.Web.CommonAPI
19
20 import Pleroma.Factory
21 import Mock
22
23 describe "delete objects" do
24 setup do
25 user = insert(:user)
26 other_user = insert(:user)
27
28 {:ok, op} = CommonAPI.post(other_user, %{"status" => "big oof"})
29 {:ok, post} = CommonAPI.post(user, %{"status" => "hey", "in_reply_to_id" => op})
30 object = Object.normalize(post)
31 {:ok, delete_data, _meta} = Builder.delete(user, object.data["id"])
32 {:ok, delete_user_data, _meta} = Builder.delete(user, user.ap_id)
33 {:ok, delete, _meta} = ActivityPub.persist(delete_data, local: true)
34 {:ok, delete_user, _meta} = ActivityPub.persist(delete_user_data, local: true)
35 %{user: user, delete: delete, post: post, object: object, delete_user: delete_user, op: op}
36 end
37
38 test "it handles object deletions", %{
39 delete: delete,
40 post: post,
41 object: object,
42 user: user,
43 op: op
44 } do
45 with_mock Pleroma.Web.ActivityPub.ActivityPub, [:passthrough],
46 stream_out: fn _ -> nil end,
47 stream_out_participations: fn _, _ -> nil end do
48 {:ok, delete, _} = SideEffects.handle(delete)
49 user = User.get_cached_by_ap_id(object.data["actor"])
50
51 assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out(delete))
52 assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out_participations(object, user))
53 end
54
55 object = Object.get_by_id(object.id)
56 assert object.data["type"] == "Tombstone"
57 refute Activity.get_by_id(post.id)
58
59 user = User.get_by_id(user.id)
60 assert user.note_count == 0
61
62 object = Object.normalize(op.data["object"], false)
63
64 assert object.data["repliesCount"] == 0
65 end
66
67 test "it handles user deletions", %{delete_user: delete, user: user} do
68 {:ok, _delete, _} = SideEffects.handle(delete)
69 ObanHelpers.perform_all()
70
71 assert User.get_cached_by_ap_id(user.ap_id).deactivated
72 end
73 end
74
75 describe "EmojiReact objects" do
76 setup do
77 poster = insert(:user)
78 user = insert(:user)
79
80 {:ok, post} = CommonAPI.post(poster, %{"status" => "hey"})
81
82 {:ok, emoji_react_data, []} = Builder.emoji_react(user, post.object, "👌")
83 {:ok, emoji_react, _meta} = ActivityPub.persist(emoji_react_data, local: true)
84
85 %{emoji_react: emoji_react, user: user, poster: poster}
86 end
87
88 test "adds the reaction to the object", %{emoji_react: emoji_react, user: user} do
89 {:ok, emoji_react, _} = SideEffects.handle(emoji_react)
90 object = Object.get_by_ap_id(emoji_react.data["object"])
91
92 assert object.data["reaction_count"] == 1
93 assert ["👌", [user.ap_id]] in object.data["reactions"]
94 end
95
96 test "creates a notification", %{emoji_react: emoji_react, poster: poster} do
97 {:ok, emoji_react, _} = SideEffects.handle(emoji_react)
98 assert Repo.get_by(Notification, user_id: poster.id, activity_id: emoji_react.id)
99 end
100 end
101
102 describe "like objects" do
103 setup do
104 poster = insert(:user)
105 user = insert(:user)
106 {:ok, post} = CommonAPI.post(poster, %{"status" => "hey"})
107
108 {:ok, like_data, _meta} = Builder.like(user, post.object)
109 {:ok, like, _meta} = ActivityPub.persist(like_data, local: true)
110
111 %{like: like, user: user, poster: poster}
112 end
113
114 test "add the like to the original object", %{like: like, user: user} do
115 {:ok, like, _} = SideEffects.handle(like)
116 object = Object.get_by_ap_id(like.data["object"])
117 assert object.data["like_count"] == 1
118 assert user.ap_id in object.data["likes"]
119 end
120
121 test "creates a notification", %{like: like, poster: poster} do
122 {:ok, like, _} = SideEffects.handle(like)
123 assert Repo.get_by(Notification, user_id: poster.id, activity_id: like.id)
124 end
125 end
126 end