SideEffects: On deletion, reduce the User note count.
[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 {:ok, post} = CommonAPI.post(user, %{"status" => "hey"})
27 object = Object.normalize(post)
28 {:ok, delete_data, _meta} = Builder.delete(user, object.data["id"])
29 {:ok, delete_user_data, _meta} = Builder.delete(user, user.ap_id)
30 {:ok, delete, _meta} = ActivityPub.persist(delete_data, local: true)
31 {:ok, delete_user, _meta} = ActivityPub.persist(delete_user_data, local: true)
32 %{user: user, delete: delete, post: post, object: object, delete_user: delete_user}
33 end
34
35 test "it handles object deletions", %{delete: delete, post: post, object: object, user: user} do
36 # In object deletions, the object is replaced by a tombstone and the
37 # create activity is deleted.
38
39 with_mock Pleroma.Web.ActivityPub.ActivityPub, [:passthrough],
40 stream_out: fn _ -> nil end,
41 stream_out_participations: fn _, _ -> nil end do
42 {:ok, delete, _} = SideEffects.handle(delete)
43 user = User.get_cached_by_ap_id(object.data["actor"])
44
45 assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out(delete))
46 assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out_participations(object, user))
47 end
48
49 object = Object.get_by_id(object.id)
50 assert object.data["type"] == "Tombstone"
51 refute Activity.get_by_id(post.id)
52
53 user = User.get_by_id(user.id)
54 assert user.note_count == 0
55 end
56
57 test "it handles user deletions", %{delete_user: delete, user: user} do
58 {:ok, _delete, _} = SideEffects.handle(delete)
59 ObanHelpers.perform_all()
60
61 refute User.get_cached_by_ap_id(user.ap_id)
62 end
63 end
64
65 describe "like objects" do
66 setup do
67 poster = insert(:user)
68 user = insert(:user)
69 {:ok, post} = CommonAPI.post(poster, %{"status" => "hey"})
70
71 {:ok, like_data, _meta} = Builder.like(user, post.object)
72 {:ok, like, _meta} = ActivityPub.persist(like_data, local: true)
73
74 %{like: like, user: user, poster: poster}
75 end
76
77 test "add the like to the original object", %{like: like, user: user} do
78 {:ok, like, _} = SideEffects.handle(like)
79 object = Object.get_by_ap_id(like.data["object"])
80 assert object.data["like_count"] == 1
81 assert user.ap_id in object.data["likes"]
82 end
83
84 test "creates a notification", %{like: like, poster: poster} do
85 {:ok, like, _} = SideEffects.handle(like)
86 assert Repo.get_by(Notification, user_id: poster.id, activity_id: like.id)
87 end
88 end
89 end