Undoing: Move undoing blocks to the pipeline everywhere.
[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 Pleroma.DataCase
7
8 alias Pleroma.Activity
9 alias Pleroma.Notification
10 alias Pleroma.Object
11 alias Pleroma.Repo
12 alias Pleroma.User
13 alias Pleroma.Web.ActivityPub.ActivityPub
14 alias Pleroma.Web.ActivityPub.Builder
15 alias Pleroma.Web.ActivityPub.SideEffects
16 alias Pleroma.Web.CommonAPI
17
18 import Pleroma.Factory
19
20 describe "Undo objects" do
21 setup do
22 poster = insert(:user)
23 user = insert(:user)
24 {:ok, post} = CommonAPI.post(poster, %{"status" => "hey"})
25 {:ok, like} = CommonAPI.favorite(user, post.id)
26 {:ok, reaction, _} = CommonAPI.react_with_emoji(post.id, user, "👍")
27 {:ok, announce, _} = CommonAPI.repeat(post.id, user)
28 {:ok, block} = ActivityPub.block(user, poster)
29 User.block(user, poster)
30
31 {:ok, undo_data, _meta} = Builder.undo(user, like)
32 {:ok, like_undo, _meta} = ActivityPub.persist(undo_data, local: true)
33
34 {:ok, undo_data, _meta} = Builder.undo(user, reaction)
35 {:ok, reaction_undo, _meta} = ActivityPub.persist(undo_data, local: true)
36
37 {:ok, undo_data, _meta} = Builder.undo(user, announce)
38 {:ok, announce_undo, _meta} = ActivityPub.persist(undo_data, local: true)
39
40 {:ok, undo_data, _meta} = Builder.undo(user, block)
41 {:ok, block_undo, _meta} = ActivityPub.persist(undo_data, local: true)
42
43 %{
44 like_undo: like_undo,
45 post: post,
46 like: like,
47 reaction_undo: reaction_undo,
48 reaction: reaction,
49 announce_undo: announce_undo,
50 announce: announce,
51 block_undo: block_undo,
52 block: block,
53 poster: poster,
54 user: user
55 }
56 end
57
58 test "deletes the original block", %{block_undo: block_undo, block: block} do
59 {:ok, _block_undo, _} = SideEffects.handle(block_undo)
60 refute Activity.get_by_id(block.id)
61 end
62
63 test "unblocks the blocked user", %{block_undo: block_undo, block: block} do
64 blocker = User.get_by_ap_id(block.data["actor"])
65 blocked = User.get_by_ap_id(block.data["object"])
66
67 {:ok, _block_undo, _} = SideEffects.handle(block_undo)
68 refute User.blocks?(blocker, blocked)
69 end
70
71 test "an announce undo removes the announce from the object", %{
72 announce_undo: announce_undo,
73 post: post
74 } do
75 {:ok, _announce_undo, _} = SideEffects.handle(announce_undo)
76
77 object = Object.get_by_ap_id(post.data["object"])
78
79 assert object.data["announcement_count"] == 0
80 assert object.data["announcements"] == []
81 end
82
83 test "deletes the original announce", %{announce_undo: announce_undo, announce: announce} do
84 {:ok, _announce_undo, _} = SideEffects.handle(announce_undo)
85 refute Activity.get_by_id(announce.id)
86 end
87
88 test "a reaction undo removes the reaction from the object", %{
89 reaction_undo: reaction_undo,
90 post: post
91 } do
92 {:ok, _reaction_undo, _} = SideEffects.handle(reaction_undo)
93
94 object = Object.get_by_ap_id(post.data["object"])
95
96 assert object.data["reaction_count"] == 0
97 assert object.data["reactions"] == []
98 end
99
100 test "deletes the original reaction", %{reaction_undo: reaction_undo, reaction: reaction} do
101 {:ok, _reaction_undo, _} = SideEffects.handle(reaction_undo)
102 refute Activity.get_by_id(reaction.id)
103 end
104
105 test "a like undo removes the like from the object", %{like_undo: like_undo, post: post} do
106 {:ok, _like_undo, _} = SideEffects.handle(like_undo)
107
108 object = Object.get_by_ap_id(post.data["object"])
109
110 assert object.data["like_count"] == 0
111 assert object.data["likes"] == []
112 end
113
114 test "deletes the original like", %{like_undo: like_undo, like: like} do
115 {:ok, _like_undo, _} = SideEffects.handle(like_undo)
116 refute Activity.get_by_id(like.id)
117 end
118 end
119
120 describe "like objects" do
121 setup do
122 poster = insert(:user)
123 user = insert(:user)
124 {:ok, post} = CommonAPI.post(poster, %{"status" => "hey"})
125
126 {:ok, like_data, _meta} = Builder.like(user, post.object)
127 {:ok, like, _meta} = ActivityPub.persist(like_data, local: true)
128
129 %{like: like, user: user, poster: poster}
130 end
131
132 test "add the like to the original object", %{like: like, user: user} do
133 {:ok, like, _} = SideEffects.handle(like)
134 object = Object.get_by_ap_id(like.data["object"])
135 assert object.data["like_count"] == 1
136 assert user.ap_id in object.data["likes"]
137 end
138
139 test "creates a notification", %{like: like, poster: poster} do
140 {:ok, like, _} = SideEffects.handle(like)
141 assert Repo.get_by(Notification, user_id: poster.id, activity_id: like.id)
142 end
143 end
144 end