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