abcfdfa2f290246d61b18d8e9c8e73214db92532
[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
26 {:ok, reaction, _} = CommonAPI.react_with_emoji(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 %{
35 like_undo: like_undo,
36 post: post,
37 like: like,
38 reaction_undo: reaction_undo,
39 reaction: reaction
40 }
41 end
42
43 test "a reaction undo removes the reaction from the object", %{
44 reaction_undo: reaction_undo,
45 post: post
46 } do
47 {:ok, _reaction_undo, _} = SideEffects.handle(reaction_undo)
48
49 object = Object.get_by_ap_id(post.data["object"])
50
51 assert object.data["reaction_count"] == 0
52 assert object.data["reactions"] == []
53 end
54
55 test "deletes the original reaction", %{reaction_undo: reaction_undo, reaction: reaction} do
56 {:ok, _reaction_undo, _} = SideEffects.handle(reaction_undo)
57 refute Activity.get_by_id(reaction.id)
58 end
59
60 test "a like undo removes the like from the object", %{like_undo: like_undo, post: post} do
61 {:ok, _like_undo, _} = SideEffects.handle(like_undo)
62
63 object = Object.get_by_ap_id(post.data["object"])
64
65 assert object.data["like_count"] == 0
66 assert object.data["likes"] == []
67 end
68
69 test "deletes the original like", %{like_undo: like_undo, like: like} do
70 {:ok, _like_undo, _} = SideEffects.handle(like_undo)
71 refute Activity.get_by_id(like.id)
72 end
73 end
74
75 describe "like objects" do
76 setup do
77 poster = insert(:user)
78 user = insert(:user)
79 {:ok, post} = CommonAPI.post(poster, %{"status" => "hey"})
80
81 {:ok, like_data, _meta} = Builder.like(user, post.object)
82 {:ok, like, _meta} = ActivityPub.persist(like_data, local: true)
83
84 %{like: like, user: user, poster: poster}
85 end
86
87 test "add the like to the original object", %{like: like, user: user} do
88 {:ok, like, _} = SideEffects.handle(like)
89 object = Object.get_by_ap_id(like.data["object"])
90 assert object.data["like_count"] == 1
91 assert user.ap_id in object.data["likes"]
92 end
93
94 test "creates a notification", %{like: like, poster: poster} do
95 {:ok, like, _} = SideEffects.handle(like)
96 assert Repo.get_by(Notification, user_id: poster.id, activity_id: like.id)
97 end
98 end
99 end