diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/pleroma/web/activity_pub/side_effects/delete_test.exs | 147 | ||||
| -rw-r--r-- | test/pleroma/web/activity_pub/side_effects_test.exs | 110 | ||||
| -rw-r--r-- | test/support/conn_case.ex | 2 | ||||
| -rw-r--r-- | test/support/data_case.ex | 2 | ||||
| -rw-r--r-- | test/support/mocks.ex | 7 | 
5 files changed, 157 insertions, 111 deletions
diff --git a/test/pleroma/web/activity_pub/side_effects/delete_test.exs b/test/pleroma/web/activity_pub/side_effects/delete_test.exs new file mode 100644 index 000000000..e4ad606a9 --- /dev/null +++ b/test/pleroma/web/activity_pub/side_effects/delete_test.exs @@ -0,0 +1,147 @@ +# 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(post) +      {: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) + +      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"], 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 diff --git a/test/pleroma/web/activity_pub/side_effects_test.exs b/test/pleroma/web/activity_pub/side_effects_test.exs index 297fc0b84..50af7a507 100644 --- a/test/pleroma/web/activity_pub/side_effects_test.exs +++ b/test/pleroma/web/activity_pub/side_effects_test.exs @@ -19,7 +19,6 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do    alias Pleroma.Web.ActivityPub.SideEffects    alias Pleroma.Web.CommonAPI -  import ExUnit.CaptureLog    import Mock    import Pleroma.Factory @@ -131,115 +130,6 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do      end    end -  describe "delete objects" 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(post) -      {:ok, delete_data, _meta} = Builder.delete(user, object.data["id"]) -      {:ok, delete_user_data, _meta} = Builder.delete(user, user.ap_id) -      {:ok, delete, _meta} = ActivityPub.persist(delete_data, local: true) -      {:ok, delete_user, _meta} = ActivityPub.persist(delete_user_data, local: true) - -      %{ -        user: user, -        delete: delete, -        post: post, -        object: object, -        delete_user: delete_user, -        op: op, -        favorite: favorite -      } -    end - -    test "it handles object deletions", %{ -      delete: delete, -      post: post, -      object: object, -      user: user, -      op: op, -      favorite: favorite -    } do -      with_mock Pleroma.Web.ActivityPub.ActivityPub, [:passthrough], -        stream_out: fn _ -> nil end, -        stream_out_participations: fn _, _ -> nil end do -        {:ok, delete, _} = SideEffects.handle(delete) -        user = User.get_cached_by_ap_id(object.data["actor"]) - -        assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out(delete)) -        assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out_participations(object, user)) -      end - -      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) - -      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 -      with_mock Pleroma.Web.ActivityPub.ActivityPub, [:passthrough], -        stream_out: fn _ -> nil end, -        stream_out_participations: fn _, _ -> nil end do -        {:ok, delete, _} = SideEffects.handle(delete) -        user = User.get_cached_by_ap_id(object.data["actor"]) - -        assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out(delete)) -        assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out_participations(object, user)) -      end - -      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"], false) - -      assert object.data["repliesCount"] == 0 -    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 - -    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() - -      Object.invalid_object_cache(object) - -      assert capture_log(fn -> -               {:error, :no_object_actor} = SideEffects.handle(delete) -             end) =~ "object doesn't have an actor" -    end -  end -    describe "EmojiReact objects" do      setup do        poster = insert(:user) diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index 02f49c590..f20e3d955 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -138,6 +138,8 @@ defmodule Pleroma.Web.ConnCase do      Pleroma.DataCase.stub_pipeline() +    Mox.verify_on_exit!() +      {:ok, conn: Phoenix.ConnTest.build_conn()}    end  end diff --git a/test/support/data_case.ex b/test/support/data_case.ex index 5c657c1d9..0b41f0f63 100644 --- a/test/support/data_case.ex +++ b/test/support/data_case.ex @@ -85,6 +85,8 @@ defmodule Pleroma.DataCase do      stub_pipeline() +    Mox.verify_on_exit!() +      :ok    end diff --git a/test/support/mocks.ex b/test/support/mocks.ex index a600a6458..442ff5b71 100644 --- a/test/support/mocks.ex +++ b/test/support/mocks.ex @@ -13,7 +13,10 @@ Mox.defmock(Pleroma.Web.ActivityPub.MRFMock,  )  Mox.defmock(Pleroma.Web.ActivityPub.ActivityPubMock, -  for: Pleroma.Web.ActivityPub.ActivityPub.Persisting +  for: [ +    Pleroma.Web.ActivityPub.ActivityPub.Persisting, +    Pleroma.Web.ActivityPub.ActivityPub.Streaming +  ]  )  Mox.defmock(Pleroma.Web.ActivityPub.SideEffectsMock, @@ -23,3 +26,5 @@ Mox.defmock(Pleroma.Web.ActivityPub.SideEffectsMock,  Mox.defmock(Pleroma.Web.FederatorMock, for: Pleroma.Web.Federator.Publishing)  Mox.defmock(Pleroma.ConfigMock, for: Pleroma.Config.Getting) + +Mox.defmock(Pleroma.LoggerMock, for: Pleroma.Logging)  | 
