Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into object-normalize...
authorlain <lain@soykaf.club>
Tue, 5 Jan 2021 09:48:32 +0000 (10:48 +0100)
committerlain <lain@soykaf.club>
Tue, 5 Jan 2021 09:48:32 +0000 (10:48 +0100)
1  2 
lib/pleroma/web/activity_pub/side_effects.ex
test/pleroma/web/activity_pub/side_effects/delete_test.exs

index 0000000000000000000000000000000000000000,e4ad606a9d244a01f9d596ce6bcf34e2e977bee1..cb11f93cd2c4c09d13a045bce762325abcafd5f6
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,147 +1,147 @@@
 -      object = Object.normalize(post)
+ # Pleroma: A lightweight social networking server
+ # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+ # SPDX-License-Identifier: AGPL-3.0-only
+ defmodule Pleroma.Web.ActivityPub.SideEffects.DeleteTest do
+   use Oban.Testing, repo: Pleroma.Repo
+   use Pleroma.DataCase, async: true
+   alias Pleroma.Activity
+   alias Pleroma.Object
+   alias Pleroma.Repo
+   alias Pleroma.Tests.ObanHelpers
+   alias Pleroma.User
+   alias Pleroma.Web.ActivityPub.ActivityPub
+   alias Pleroma.Web.ActivityPub.Builder
+   alias Pleroma.Web.ActivityPub.SideEffects
+   alias Pleroma.Web.CommonAPI
+   alias Pleroma.LoggerMock
+   alias Pleroma.Web.ActivityPub.ActivityPubMock
+   import Mox
+   import Pleroma.Factory
+   describe "user deletion" do
+     setup do
+       user = insert(:user)
+       {:ok, delete_user_data, _meta} = Builder.delete(user, user.ap_id)
+       {:ok, delete_user, _meta} = ActivityPub.persist(delete_user_data, local: true)
+       %{
+         user: user,
+         delete_user: delete_user
+       }
+     end
+     test "it handles user deletions", %{delete_user: delete, user: user} do
+       {:ok, _delete, _} = SideEffects.handle(delete)
+       ObanHelpers.perform_all()
+       assert User.get_cached_by_ap_id(user.ap_id).deactivated
+     end
+   end
+   describe "object deletion" do
+     setup do
+       user = insert(:user)
+       other_user = insert(:user)
+       {:ok, op} = CommonAPI.post(other_user, %{status: "big oof"})
+       {:ok, post} = CommonAPI.post(user, %{status: "hey", in_reply_to_id: op})
+       {:ok, favorite} = CommonAPI.favorite(user, post.id)
 -      object = Object.normalize(op.data["object"], false)
++      object = Object.normalize(post, fetch: false)
+       {:ok, delete_data, _meta} = Builder.delete(user, object.data["id"])
+       {:ok, delete, _meta} = ActivityPub.persist(delete_data, local: true)
+       %{
+         user: user,
+         delete: delete,
+         post: post,
+         object: object,
+         op: op,
+         favorite: favorite
+       }
+     end
+     test "it handles object deletions", %{
+       delete: delete,
+       post: post,
+       object: object,
+       user: user,
+       op: op,
+       favorite: favorite
+     } do
+       object_id = object.id
+       user_id = user.id
+       ActivityPubMock
+       |> expect(:stream_out, fn ^delete -> nil end)
+       |> expect(:stream_out_participations, fn %Object{id: ^object_id}, %User{id: ^user_id} ->
+         nil
+       end)
+       {:ok, _delete, _} = SideEffects.handle(delete)
+       user = User.get_cached_by_ap_id(object.data["actor"])
+       object = Object.get_by_id(object.id)
+       assert object.data["type"] == "Tombstone"
+       refute Activity.get_by_id(post.id)
+       refute Activity.get_by_id(favorite.id)
+       user = User.get_by_id(user.id)
+       assert user.note_count == 0
 -      object = Object.normalize(op.data["object"], false)
++      object = Object.normalize(op.data["object"], fetch: false)
+       assert object.data["repliesCount"] == 0
+     end
+     test "it handles object deletions when the object itself has been pruned", %{
+       delete: delete,
+       post: post,
+       object: object,
+       user: user,
+       op: op
+     } do
+       object_id = object.id
+       user_id = user.id
+       ActivityPubMock
+       |> expect(:stream_out, fn ^delete -> nil end)
+       |> expect(:stream_out_participations, fn %Object{id: ^object_id}, %User{id: ^user_id} ->
+         nil
+       end)
+       {:ok, _delete, _} = SideEffects.handle(delete)
+       user = User.get_cached_by_ap_id(object.data["actor"])
+       object = Object.get_by_id(object.id)
+       assert object.data["type"] == "Tombstone"
+       refute Activity.get_by_id(post.id)
+       user = User.get_by_id(user.id)
+       assert user.note_count == 0
++      object = Object.normalize(op.data["object"], fetch: false)
+       assert object.data["repliesCount"] == 0
+     end
+     test "it logs issues with objects deletion", %{
+       delete: delete,
+       object: object
+     } do
+       {:ok, _object} =
+         object
+         |> Object.change(%{data: Map.delete(object.data, "actor")})
+         |> Repo.update()
+       LoggerMock
+       |> expect(:error, fn str -> assert str =~ "The object doesn't have an actor" end)
+       {:error, :no_object_actor} = SideEffects.handle(delete)
+     end
+   end
+ end