Merge branch 'fix/downgraded-deps' into 'develop'
[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 "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