1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.ActivityPub.SideEffectsTest do
9 alias Pleroma.Notification
13 alias Pleroma.Web.ActivityPub.ActivityPub
14 alias Pleroma.Web.ActivityPub.Builder
15 alias Pleroma.Web.ActivityPub.SideEffects
16 alias Pleroma.Web.CommonAPI
18 import Pleroma.Factory
20 describe "Undo objects" do
22 poster = 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)
31 {:ok, undo_data, _meta} = Builder.undo(user, like)
32 {:ok, like_undo, _meta} = ActivityPub.persist(undo_data, local: true)
34 {:ok, undo_data, _meta} = Builder.undo(user, reaction)
35 {:ok, reaction_undo, _meta} = ActivityPub.persist(undo_data, local: true)
37 {:ok, undo_data, _meta} = Builder.undo(user, announce)
38 {:ok, announce_undo, _meta} = ActivityPub.persist(undo_data, local: true)
40 {:ok, undo_data, _meta} = Builder.undo(user, block)
41 {:ok, block_undo, _meta} = ActivityPub.persist(undo_data, local: true)
47 reaction_undo: reaction_undo,
49 announce_undo: announce_undo,
51 block_undo: block_undo,
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)
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"])
67 {:ok, _block_undo, _} = SideEffects.handle(block_undo)
68 refute User.blocks?(blocker, blocked)
71 test "an announce undo removes the announce from the object", %{
72 announce_undo: announce_undo,
75 {:ok, _announce_undo, _} = SideEffects.handle(announce_undo)
77 object = Object.get_by_ap_id(post.data["object"])
79 assert object.data["announcement_count"] == 0
80 assert object.data["announcements"] == []
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)
88 test "a reaction undo removes the reaction from the object", %{
89 reaction_undo: reaction_undo,
92 {:ok, _reaction_undo, _} = SideEffects.handle(reaction_undo)
94 object = Object.get_by_ap_id(post.data["object"])
96 assert object.data["reaction_count"] == 0
97 assert object.data["reactions"] == []
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)
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)
108 object = Object.get_by_ap_id(post.data["object"])
110 assert object.data["like_count"] == 0
111 assert object.data["likes"] == []
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)
120 describe "like objects" do
122 poster = insert(:user)
124 {:ok, post} = CommonAPI.post(poster, %{"status" => "hey"})
126 {:ok, like_data, _meta} = Builder.like(user, post.object)
127 {:ok, like, _meta} = ActivityPub.persist(like_data, local: true)
129 %{like: like, user: user, poster: poster}
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"]
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)