logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

delete_test.exs (4101B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.ActivityPub.SideEffects.DeleteTest do
  5. use Oban.Testing, repo: Pleroma.Repo
  6. use Pleroma.DataCase, async: true
  7. alias Pleroma.Activity
  8. alias Pleroma.Object
  9. alias Pleroma.Repo
  10. alias Pleroma.Tests.ObanHelpers
  11. alias Pleroma.User
  12. alias Pleroma.Web.ActivityPub.ActivityPub
  13. alias Pleroma.Web.ActivityPub.Builder
  14. alias Pleroma.Web.ActivityPub.SideEffects
  15. alias Pleroma.Web.CommonAPI
  16. alias Pleroma.LoggerMock
  17. alias Pleroma.Web.ActivityPub.ActivityPubMock
  18. import Mox
  19. import Pleroma.Factory
  20. describe "user deletion" do
  21. setup do
  22. user = insert(:user)
  23. {:ok, delete_user_data, _meta} = Builder.delete(user, user.ap_id)
  24. {:ok, delete_user, _meta} = ActivityPub.persist(delete_user_data, local: true)
  25. %{
  26. user: user,
  27. delete_user: delete_user
  28. }
  29. end
  30. test "it handles user deletions", %{delete_user: delete, user: user} do
  31. {:ok, _delete, _} = SideEffects.handle(delete)
  32. ObanHelpers.perform_all()
  33. refute User.get_cached_by_ap_id(user.ap_id).is_active
  34. end
  35. end
  36. describe "object deletion" do
  37. setup do
  38. user = insert(:user)
  39. other_user = insert(:user)
  40. {:ok, op} = CommonAPI.post(other_user, %{status: "big oof"})
  41. {:ok, post} = CommonAPI.post(user, %{status: "hey", in_reply_to_id: op})
  42. {:ok, favorite} = CommonAPI.favorite(user, post.id)
  43. object = Object.normalize(post, fetch: false)
  44. {:ok, delete_data, _meta} = Builder.delete(user, object.data["id"])
  45. {:ok, delete, _meta} = ActivityPub.persist(delete_data, local: true)
  46. %{
  47. user: user,
  48. delete: delete,
  49. post: post,
  50. object: object,
  51. op: op,
  52. favorite: favorite
  53. }
  54. end
  55. test "it handles object deletions", %{
  56. delete: delete,
  57. post: post,
  58. object: object,
  59. user: user,
  60. op: op,
  61. favorite: favorite
  62. } do
  63. object_id = object.id
  64. user_id = user.id
  65. ActivityPubMock
  66. |> expect(:stream_out, fn ^delete -> nil end)
  67. |> expect(:stream_out_participations, fn %Object{id: ^object_id}, %User{id: ^user_id} ->
  68. nil
  69. end)
  70. {:ok, _delete, _} = SideEffects.handle(delete)
  71. user = User.get_cached_by_ap_id(object.data["actor"])
  72. object = Object.get_by_id(object.id)
  73. assert object.data["type"] == "Tombstone"
  74. refute Activity.get_by_id(post.id)
  75. refute Activity.get_by_id(favorite.id)
  76. user = User.get_by_id(user.id)
  77. assert user.note_count == 0
  78. object = Object.normalize(op.data["object"], fetch: false)
  79. assert object.data["repliesCount"] == 0
  80. end
  81. test "it handles object deletions when the object itself has been pruned", %{
  82. delete: delete,
  83. post: post,
  84. object: object,
  85. user: user,
  86. op: op
  87. } do
  88. object_id = object.id
  89. user_id = user.id
  90. ActivityPubMock
  91. |> expect(:stream_out, fn ^delete -> nil end)
  92. |> expect(:stream_out_participations, fn %Object{id: ^object_id}, %User{id: ^user_id} ->
  93. nil
  94. end)
  95. {:ok, _delete, _} = SideEffects.handle(delete)
  96. user = User.get_cached_by_ap_id(object.data["actor"])
  97. object = Object.get_by_id(object.id)
  98. assert object.data["type"] == "Tombstone"
  99. refute Activity.get_by_id(post.id)
  100. user = User.get_by_id(user.id)
  101. assert user.note_count == 0
  102. object = Object.normalize(op.data["object"], fetch: false)
  103. assert object.data["repliesCount"] == 0
  104. end
  105. test "it logs issues with objects deletion", %{
  106. delete: delete,
  107. object: object
  108. } do
  109. {:ok, _object} =
  110. object
  111. |> Object.change(%{data: Map.delete(object.data, "actor")})
  112. |> Repo.update()
  113. LoggerMock
  114. |> expect(:error, fn str -> assert str =~ "The object doesn't have an actor" end)
  115. {:error, :no_object_actor} = SideEffects.handle(delete)
  116. end
  117. end
  118. end