diff options
Diffstat (limited to 'test/web/activity_pub')
| -rw-r--r-- | test/web/activity_pub/activity_pub_controller_test.exs | 15 | ||||
| -rw-r--r-- | test/web/activity_pub/activity_pub_test.exs | 262 | ||||
| -rw-r--r-- | test/web/activity_pub/object_validator_test.exs | 80 | ||||
| -rw-r--r-- | test/web/activity_pub/side_effects_test.exs | 127 | ||||
| -rw-r--r-- | test/web/activity_pub/transmogrifier/emoji_react_handling_test.exs | 61 | ||||
| -rw-r--r-- | test/web/activity_pub/transmogrifier/undo_handling_test.exs | 185 | ||||
| -rw-r--r-- | test/web/activity_pub/transmogrifier_test.exs | 175 | ||||
| -rw-r--r-- | test/web/activity_pub/utils_test.exs | 28 | 
8 files changed, 470 insertions, 463 deletions
| diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index 5c8d20ac4..776ddc8d4 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -815,6 +815,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert object["content"] == activity["object"]["content"]      end +    test "it rejects anything beyond 'Note' creations", %{conn: conn, activity: activity} do +      user = insert(:user) + +      activity = +        activity +        |> put_in(["object", "type"], "Benis") + +      _result = +        conn +        |> assign(:user, user) +        |> put_req_header("content-type", "application/activity+json") +        |> post("/users/#{user.nickname}/outbox", activity) +        |> json_response(400) +    end +      test "it inserts an incoming sensitive activity into the database", %{        conn: conn,        activity: activity diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 4dc9c0f0a..0739cbfef 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -16,7 +16,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.AdminAPI.AccountView    alias Pleroma.Web.CommonAPI -  alias Pleroma.Web.Federator    import ExUnit.CaptureLog    import Mock @@ -874,187 +873,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      end    end -  describe "react to an object" do -    test_with_mock "sends an activity to federation", Federator, [:passthrough], [] do -      Config.put([:instance, :federating], true) -      user = insert(:user) -      reactor = insert(:user) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"}) -      assert object = Object.normalize(activity) - -      {:ok, reaction_activity, _object} = ActivityPub.react_with_emoji(reactor, object, "🔥") - -      assert called(Federator.publish(reaction_activity)) -    end - -    test "adds an emoji reaction activity to the db" do -      user = insert(:user) -      reactor = insert(:user) -      third_user = insert(:user) -      fourth_user = insert(:user) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"}) -      assert object = Object.normalize(activity) - -      {:ok, reaction_activity, object} = ActivityPub.react_with_emoji(reactor, object, "🔥") - -      assert reaction_activity - -      assert reaction_activity.data["actor"] == reactor.ap_id -      assert reaction_activity.data["type"] == "EmojiReact" -      assert reaction_activity.data["content"] == "🔥" -      assert reaction_activity.data["object"] == object.data["id"] -      assert reaction_activity.data["to"] == [User.ap_followers(reactor), activity.data["actor"]] -      assert reaction_activity.data["context"] == object.data["context"] -      assert object.data["reaction_count"] == 1 -      assert object.data["reactions"] == [["🔥", [reactor.ap_id]]] - -      {:ok, _reaction_activity, object} = ActivityPub.react_with_emoji(third_user, object, "☕") - -      assert object.data["reaction_count"] == 2 -      assert object.data["reactions"] == [["🔥", [reactor.ap_id]], ["☕", [third_user.ap_id]]] - -      {:ok, _reaction_activity, object} = ActivityPub.react_with_emoji(fourth_user, object, "🔥") - -      assert object.data["reaction_count"] == 3 - -      assert object.data["reactions"] == [ -               ["🔥", [fourth_user.ap_id, reactor.ap_id]], -               ["☕", [third_user.ap_id]] -             ] -    end - -    test "reverts emoji reaction on error" do -      [user, reactor] = insert_list(2, :user) - -      {:ok, activity} = CommonAPI.post(user, %{"status" => "Status"}) -      object = Object.normalize(activity) - -      with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do -        assert {:error, :reverted} = ActivityPub.react_with_emoji(reactor, object, "😀") -      end - -      object = Object.get_by_ap_id(object.data["id"]) -      refute object.data["reaction_count"] -      refute object.data["reactions"] -    end -  end - -  describe "unreacting to an object" do -    test_with_mock "sends an activity to federation", Federator, [:passthrough], [] do -      Config.put([:instance, :federating], true) -      user = insert(:user) -      reactor = insert(:user) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"}) -      assert object = Object.normalize(activity) - -      {:ok, reaction_activity, _object} = ActivityPub.react_with_emoji(reactor, object, "🔥") - -      assert called(Federator.publish(reaction_activity)) - -      {:ok, unreaction_activity, _object} = -        ActivityPub.unreact_with_emoji(reactor, reaction_activity.data["id"]) - -      assert called(Federator.publish(unreaction_activity)) -    end - -    test "adds an undo activity to the db" do -      user = insert(:user) -      reactor = insert(:user) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"}) -      assert object = Object.normalize(activity) - -      {:ok, reaction_activity, _object} = ActivityPub.react_with_emoji(reactor, object, "🔥") - -      {:ok, unreaction_activity, _object} = -        ActivityPub.unreact_with_emoji(reactor, reaction_activity.data["id"]) - -      assert unreaction_activity.actor == reactor.ap_id -      assert unreaction_activity.data["object"] == reaction_activity.data["id"] - -      object = Object.get_by_ap_id(object.data["id"]) -      assert object.data["reaction_count"] == 0 -      assert object.data["reactions"] == [] -    end - -    test "reverts emoji unreact on error" do -      [user, reactor] = insert_list(2, :user) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "Status"}) -      object = Object.normalize(activity) - -      {:ok, reaction_activity, _object} = ActivityPub.react_with_emoji(reactor, object, "😀") - -      with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do -        assert {:error, :reverted} = -                 ActivityPub.unreact_with_emoji(reactor, reaction_activity.data["id"]) -      end - -      object = Object.get_by_ap_id(object.data["id"]) - -      assert object.data["reaction_count"] == 1 -      assert object.data["reactions"] == [["😀", [reactor.ap_id]]] -    end -  end - -  describe "unliking" do -    test_with_mock "sends an activity to federation", Federator, [:passthrough], [] do -      Config.put([:instance, :federating], true) - -      note_activity = insert(:note_activity) -      object = Object.normalize(note_activity) -      user = insert(:user) - -      {:ok, object} = ActivityPub.unlike(user, object) -      refute called(Federator.publish()) - -      {:ok, _like_activity} = CommonAPI.favorite(user, note_activity.id) -      object = Object.get_by_id(object.id) -      assert object.data["like_count"] == 1 - -      {:ok, unlike_activity, _, object} = ActivityPub.unlike(user, object) -      assert object.data["like_count"] == 0 - -      assert called(Federator.publish(unlike_activity)) -    end - -    test "reverts unliking on error" do -      note_activity = insert(:note_activity) -      user = insert(:user) - -      {:ok, like_activity} = CommonAPI.favorite(user, note_activity.id) -      object = Object.normalize(note_activity) -      assert object.data["like_count"] == 1 - -      with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do -        assert {:error, :reverted} = ActivityPub.unlike(user, object) -      end - -      assert Object.get_by_ap_id(object.data["id"]) == object -      assert object.data["like_count"] == 1 -      assert Activity.get_by_id(like_activity.id) -    end - -    test "unliking a previously liked object" do -      note_activity = insert(:note_activity) -      object = Object.normalize(note_activity) -      user = insert(:user) - -      # Unliking something that hasn't been liked does nothing -      {:ok, object} = ActivityPub.unlike(user, object) -      assert object.data["like_count"] == 0 - -      {:ok, like_activity} = CommonAPI.favorite(user, note_activity.id) - -      object = Object.get_by_id(object.id) -      assert object.data["like_count"] == 1 - -      {:ok, unlike_activity, _, object} = ActivityPub.unlike(user, object) -      assert object.data["like_count"] == 0 - -      assert Activity.get_by_id(like_activity.id) == nil -      assert note_activity.actor in unlike_activity.recipients -    end -  end -    describe "announcing an object" do      test "adds an announce activity to the db" do        note_activity = insert(:note_activity) @@ -1124,52 +942,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      end    end -  describe "unannouncing an object" do -    test "unannouncing a previously announced object" do -      note_activity = insert(:note_activity) -      object = Object.normalize(note_activity) -      user = insert(:user) - -      # Unannouncing an object that is not announced does nothing -      {:ok, object} = ActivityPub.unannounce(user, object) -      refute object.data["announcement_count"] - -      {:ok, announce_activity, object} = ActivityPub.announce(user, object) -      assert object.data["announcement_count"] == 1 - -      {:ok, unannounce_activity, object} = ActivityPub.unannounce(user, object) -      assert object.data["announcement_count"] == 0 - -      assert unannounce_activity.data["to"] == [ -               User.ap_followers(user), -               object.data["actor"] -             ] - -      assert unannounce_activity.data["type"] == "Undo" -      assert unannounce_activity.data["object"] == announce_activity.data -      assert unannounce_activity.data["actor"] == user.ap_id -      assert unannounce_activity.data["context"] == announce_activity.data["context"] - -      assert Activity.get_by_id(announce_activity.id) == nil -    end - -    test "reverts unannouncing on error" do -      note_activity = insert(:note_activity) -      object = Object.normalize(note_activity) -      user = insert(:user) - -      {:ok, _announce_activity, object} = ActivityPub.announce(user, object) -      assert object.data["announcement_count"] == 1 - -      with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do -        assert {:error, :reverted} = ActivityPub.unannounce(user, object) -      end - -      object = Object.get_by_ap_id(object.data["id"]) -      assert object.data["announcement_count"] == 1 -    end -  end -    describe "uploading files" do      test "copies the file to the configured folder" do        file = %Plug.Upload{ @@ -1276,7 +1048,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      end    end -  describe "blocking / unblocking" do +  describe "blocking" do      test "reverts block activity on error" do        [blocker, blocked] = insert_list(2, :user) @@ -1298,38 +1070,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert activity.data["actor"] == blocker.ap_id        assert activity.data["object"] == blocked.ap_id      end - -    test "reverts unblock activity on error" do -      [blocker, blocked] = insert_list(2, :user) -      {:ok, block_activity} = ActivityPub.block(blocker, blocked) - -      with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do -        assert {:error, :reverted} = ActivityPub.unblock(blocker, blocked) -      end - -      assert block_activity.data["type"] == "Block" -      assert block_activity.data["actor"] == blocker.ap_id - -      assert Repo.aggregate(Activity, :count, :id) == 1 -      assert Repo.aggregate(Object, :count, :id) == 1 -    end - -    test "creates an undo activity for the last block" do -      blocker = insert(:user) -      blocked = insert(:user) - -      {:ok, block_activity} = ActivityPub.block(blocker, blocked) -      {:ok, activity} = ActivityPub.unblock(blocker, blocked) - -      assert activity.data["type"] == "Undo" -      assert activity.data["actor"] == blocker.ap_id - -      embedded_object = activity.data["object"] -      assert is_map(embedded_object) -      assert embedded_object["type"] == "Block" -      assert embedded_object["object"] == blocked.ap_id -      assert embedded_object["id"] == block_activity.data["id"] -    end    end    describe "timeline post-processing" do diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index c9eace866..6164d176d 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -156,6 +156,86 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do      end    end +  describe "EmojiReacts" do +    setup do +      user = insert(:user) +      {:ok, post_activity} = CommonAPI.post(user, %{"status" => "uguu"}) + +      object = Pleroma.Object.get_by_ap_id(post_activity.data["object"]) + +      {:ok, valid_emoji_react, []} = Builder.emoji_react(user, object, "👌") + +      %{user: user, post_activity: post_activity, valid_emoji_react: valid_emoji_react} +    end + +    test "it validates a valid EmojiReact", %{valid_emoji_react: valid_emoji_react} do +      assert {:ok, _, _} = ObjectValidator.validate(valid_emoji_react, []) +    end + +    test "it is not valid without a 'content' field", %{valid_emoji_react: valid_emoji_react} do +      without_content = +        valid_emoji_react +        |> Map.delete("content") + +      {:error, cng} = ObjectValidator.validate(without_content, []) + +      refute cng.valid? +      assert {:content, {"can't be blank", [validation: :required]}} in cng.errors +    end + +    test "it is not valid with a non-emoji content field", %{valid_emoji_react: valid_emoji_react} do +      without_emoji_content = +        valid_emoji_react +        |> Map.put("content", "x") + +      {:error, cng} = ObjectValidator.validate(without_emoji_content, []) + +      refute cng.valid? + +      assert {:content, {"must be a single character emoji", []}} in cng.errors +    end +  end + +  describe "Undos" do +    setup do +      user = insert(:user) +      {:ok, post_activity} = CommonAPI.post(user, %{"status" => "uguu"}) +      {:ok, like} = CommonAPI.favorite(user, post_activity.id) +      {:ok, valid_like_undo, []} = Builder.undo(user, like) + +      %{user: user, like: like, valid_like_undo: valid_like_undo} +    end + +    test "it validates a basic like undo", %{valid_like_undo: valid_like_undo} do +      assert {:ok, _, _} = ObjectValidator.validate(valid_like_undo, []) +    end + +    test "it does not validate if the actor of the undo is not the actor of the object", %{ +      valid_like_undo: valid_like_undo +    } do +      other_user = insert(:user, ap_id: "https://gensokyo.2hu/users/raymoo") + +      bad_actor = +        valid_like_undo +        |> Map.put("actor", other_user.ap_id) + +      {:error, cng} = ObjectValidator.validate(bad_actor, []) + +      assert {:actor, {"not the same as object actor", []}} in cng.errors +    end + +    test "it does not validate if the object is missing", %{valid_like_undo: valid_like_undo} do +      missing_object = +        valid_like_undo +        |> Map.put("object", "https://gensokyo.2hu/objects/1") + +      {:error, cng} = ObjectValidator.validate(missing_object, []) + +      assert {:object, {"can't find object", []}} in cng.errors +      assert length(cng.errors) == 1 +    end +  end +    describe "deletes" do      setup do        user = insert(:user) diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index a631e5c6b..b618d3322 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -73,6 +73,133 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do      end    end +  describe "EmojiReact objects" do +    setup do +      poster = insert(:user) +      user = insert(:user) + +      {:ok, post} = CommonAPI.post(poster, %{"status" => "hey"}) + +      {:ok, emoji_react_data, []} = Builder.emoji_react(user, post.object, "👌") +      {:ok, emoji_react, _meta} = ActivityPub.persist(emoji_react_data, local: true) + +      %{emoji_react: emoji_react, user: user, poster: poster} +    end + +    test "adds the reaction to the object", %{emoji_react: emoji_react, user: user} do +      {:ok, emoji_react, _} = SideEffects.handle(emoji_react) +      object = Object.get_by_ap_id(emoji_react.data["object"]) + +      assert object.data["reaction_count"] == 1 +      assert ["👌", [user.ap_id]] in object.data["reactions"] +    end + +    test "creates a notification", %{emoji_react: emoji_react, poster: poster} do +      {:ok, emoji_react, _} = SideEffects.handle(emoji_react) +      assert Repo.get_by(Notification, user_id: poster.id, activity_id: emoji_react.id) +    end +  end + +  describe "Undo objects" do +    setup do +      poster = insert(:user) +      user = insert(:user) +      {:ok, post} = CommonAPI.post(poster, %{"status" => "hey"}) +      {:ok, like} = CommonAPI.favorite(user, post.id) +      {:ok, reaction} = CommonAPI.react_with_emoji(post.id, user, "👍") +      {:ok, announce, _} = CommonAPI.repeat(post.id, user) +      {:ok, block} = ActivityPub.block(user, poster) +      User.block(user, poster) + +      {:ok, undo_data, _meta} = Builder.undo(user, like) +      {:ok, like_undo, _meta} = ActivityPub.persist(undo_data, local: true) + +      {:ok, undo_data, _meta} = Builder.undo(user, reaction) +      {:ok, reaction_undo, _meta} = ActivityPub.persist(undo_data, local: true) + +      {:ok, undo_data, _meta} = Builder.undo(user, announce) +      {:ok, announce_undo, _meta} = ActivityPub.persist(undo_data, local: true) + +      {:ok, undo_data, _meta} = Builder.undo(user, block) +      {:ok, block_undo, _meta} = ActivityPub.persist(undo_data, local: true) + +      %{ +        like_undo: like_undo, +        post: post, +        like: like, +        reaction_undo: reaction_undo, +        reaction: reaction, +        announce_undo: announce_undo, +        announce: announce, +        block_undo: block_undo, +        block: block, +        poster: poster, +        user: user +      } +    end + +    test "deletes the original block", %{block_undo: block_undo, block: block} do +      {:ok, _block_undo, _} = SideEffects.handle(block_undo) +      refute Activity.get_by_id(block.id) +    end + +    test "unblocks the blocked user", %{block_undo: block_undo, block: block} do +      blocker = User.get_by_ap_id(block.data["actor"]) +      blocked = User.get_by_ap_id(block.data["object"]) + +      {:ok, _block_undo, _} = SideEffects.handle(block_undo) +      refute User.blocks?(blocker, blocked) +    end + +    test "an announce undo removes the announce from the object", %{ +      announce_undo: announce_undo, +      post: post +    } do +      {:ok, _announce_undo, _} = SideEffects.handle(announce_undo) + +      object = Object.get_by_ap_id(post.data["object"]) + +      assert object.data["announcement_count"] == 0 +      assert object.data["announcements"] == [] +    end + +    test "deletes the original announce", %{announce_undo: announce_undo, announce: announce} do +      {:ok, _announce_undo, _} = SideEffects.handle(announce_undo) +      refute Activity.get_by_id(announce.id) +    end + +    test "a reaction undo removes the reaction from the object", %{ +      reaction_undo: reaction_undo, +      post: post +    } do +      {:ok, _reaction_undo, _} = SideEffects.handle(reaction_undo) + +      object = Object.get_by_ap_id(post.data["object"]) + +      assert object.data["reaction_count"] == 0 +      assert object.data["reactions"] == [] +    end + +    test "deletes the original reaction", %{reaction_undo: reaction_undo, reaction: reaction} do +      {:ok, _reaction_undo, _} = SideEffects.handle(reaction_undo) +      refute Activity.get_by_id(reaction.id) +    end + +    test "a like undo removes the like from the object", %{like_undo: like_undo, post: post} do +      {:ok, _like_undo, _} = SideEffects.handle(like_undo) + +      object = Object.get_by_ap_id(post.data["object"]) + +      assert object.data["like_count"] == 0 +      assert object.data["likes"] == [] +    end + +    test "deletes the original like", %{like_undo: like_undo, like: like} do +      {:ok, _like_undo, _} = SideEffects.handle(like_undo) +      refute Activity.get_by_id(like.id) +    end +  end +    describe "like objects" do      setup do        poster = insert(:user) diff --git a/test/web/activity_pub/transmogrifier/emoji_react_handling_test.exs b/test/web/activity_pub/transmogrifier/emoji_react_handling_test.exs new file mode 100644 index 000000000..6988e3e0a --- /dev/null +++ b/test/web/activity_pub/transmogrifier/emoji_react_handling_test.exs @@ -0,0 +1,61 @@ +# 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.Transmogrifier.EmojiReactHandlingTest do +  use Pleroma.DataCase + +  alias Pleroma.Activity +  alias Pleroma.Object +  alias Pleroma.Web.ActivityPub.Transmogrifier +  alias Pleroma.Web.CommonAPI + +  import Pleroma.Factory + +  test "it works for incoming emoji reactions" do +    user = insert(:user) +    other_user = insert(:user, local: false) +    {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) + +    data = +      File.read!("test/fixtures/emoji-reaction.json") +      |> Poison.decode!() +      |> Map.put("object", activity.data["object"]) +      |> Map.put("actor", other_user.ap_id) + +    {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +    assert data["actor"] == other_user.ap_id +    assert data["type"] == "EmojiReact" +    assert data["id"] == "http://mastodon.example.org/users/admin#reactions/2" +    assert data["object"] == activity.data["object"] +    assert data["content"] == "👌" + +    object = Object.get_by_ap_id(data["object"]) + +    assert object.data["reaction_count"] == 1 +    assert match?([["👌", _]], object.data["reactions"]) +  end + +  test "it reject invalid emoji reactions" do +    user = insert(:user) +    other_user = insert(:user, local: false) +    {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) + +    data = +      File.read!("test/fixtures/emoji-reaction-too-long.json") +      |> Poison.decode!() +      |> Map.put("object", activity.data["object"]) +      |> Map.put("actor", other_user.ap_id) + +    assert {:error, _} = Transmogrifier.handle_incoming(data) + +    data = +      File.read!("test/fixtures/emoji-reaction-no-emoji.json") +      |> Poison.decode!() +      |> Map.put("object", activity.data["object"]) +      |> Map.put("actor", other_user.ap_id) + +    assert {:error, _} = Transmogrifier.handle_incoming(data) +  end +end diff --git a/test/web/activity_pub/transmogrifier/undo_handling_test.exs b/test/web/activity_pub/transmogrifier/undo_handling_test.exs new file mode 100644 index 000000000..eaf58adf7 --- /dev/null +++ b/test/web/activity_pub/transmogrifier/undo_handling_test.exs @@ -0,0 +1,185 @@ +# 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.Transmogrifier.UndoHandlingTest do +  use Pleroma.DataCase + +  alias Pleroma.Activity +  alias Pleroma.Object +  alias Pleroma.User +  alias Pleroma.Web.ActivityPub.Transmogrifier +  alias Pleroma.Web.CommonAPI + +  import Pleroma.Factory + +  test "it works for incoming emoji reaction undos" do +    user = insert(:user) + +    {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) +    {:ok, reaction_activity} = CommonAPI.react_with_emoji(activity.id, user, "👌") + +    data = +      File.read!("test/fixtures/mastodon-undo-like.json") +      |> Poison.decode!() +      |> Map.put("object", reaction_activity.data["id"]) +      |> Map.put("actor", user.ap_id) + +    {:ok, activity} = Transmogrifier.handle_incoming(data) + +    assert activity.actor == user.ap_id +    assert activity.data["id"] == data["id"] +    assert activity.data["type"] == "Undo" +  end + +  test "it returns an error for incoming unlikes wihout a like activity" do +    user = insert(:user) +    {:ok, activity} = CommonAPI.post(user, %{"status" => "leave a like pls"}) + +    data = +      File.read!("test/fixtures/mastodon-undo-like.json") +      |> Poison.decode!() +      |> Map.put("object", activity.data["object"]) + +    assert Transmogrifier.handle_incoming(data) == :error +  end + +  test "it works for incoming unlikes with an existing like activity" do +    user = insert(:user) +    {:ok, activity} = CommonAPI.post(user, %{"status" => "leave a like pls"}) + +    like_data = +      File.read!("test/fixtures/mastodon-like.json") +      |> Poison.decode!() +      |> Map.put("object", activity.data["object"]) + +    _liker = insert(:user, ap_id: like_data["actor"], local: false) + +    {:ok, %Activity{data: like_data, local: false}} = Transmogrifier.handle_incoming(like_data) + +    data = +      File.read!("test/fixtures/mastodon-undo-like.json") +      |> Poison.decode!() +      |> Map.put("object", like_data) +      |> Map.put("actor", like_data["actor"]) + +    {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +    assert data["actor"] == "http://mastodon.example.org/users/admin" +    assert data["type"] == "Undo" +    assert data["id"] == "http://mastodon.example.org/users/admin#likes/2/undo" +    assert data["object"] == "http://mastodon.example.org/users/admin#likes/2" + +    note = Object.get_by_ap_id(like_data["object"]) +    assert note.data["like_count"] == 0 +    assert note.data["likes"] == [] +  end + +  test "it works for incoming unlikes with an existing like activity and a compact object" do +    user = insert(:user) +    {:ok, activity} = CommonAPI.post(user, %{"status" => "leave a like pls"}) + +    like_data = +      File.read!("test/fixtures/mastodon-like.json") +      |> Poison.decode!() +      |> Map.put("object", activity.data["object"]) + +    _liker = insert(:user, ap_id: like_data["actor"], local: false) + +    {:ok, %Activity{data: like_data, local: false}} = Transmogrifier.handle_incoming(like_data) + +    data = +      File.read!("test/fixtures/mastodon-undo-like.json") +      |> Poison.decode!() +      |> Map.put("object", like_data["id"]) +      |> Map.put("actor", like_data["actor"]) + +    {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +    assert data["actor"] == "http://mastodon.example.org/users/admin" +    assert data["type"] == "Undo" +    assert data["id"] == "http://mastodon.example.org/users/admin#likes/2/undo" +    assert data["object"] == "http://mastodon.example.org/users/admin#likes/2" +  end + +  test "it works for incoming unannounces with an existing notice" do +    user = insert(:user) +    {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"}) + +    announce_data = +      File.read!("test/fixtures/mastodon-announce.json") +      |> Poison.decode!() +      |> Map.put("object", activity.data["object"]) + +    _announcer = insert(:user, ap_id: announce_data["actor"], local: false) + +    {:ok, %Activity{data: announce_data, local: false}} = +      Transmogrifier.handle_incoming(announce_data) + +    data = +      File.read!("test/fixtures/mastodon-undo-announce.json") +      |> Poison.decode!() +      |> Map.put("object", announce_data) +      |> Map.put("actor", announce_data["actor"]) + +    {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +    assert data["type"] == "Undo" + +    assert data["object"] == +             "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" +  end + +  test "it works for incomming unfollows with an existing follow" do +    user = insert(:user) + +    follow_data = +      File.read!("test/fixtures/mastodon-follow-activity.json") +      |> Poison.decode!() +      |> Map.put("object", user.ap_id) + +    _follower = insert(:user, ap_id: follow_data["actor"], local: false) + +    {:ok, %Activity{data: _, local: false}} = Transmogrifier.handle_incoming(follow_data) + +    data = +      File.read!("test/fixtures/mastodon-unfollow-activity.json") +      |> Poison.decode!() +      |> Map.put("object", follow_data) + +    {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +    assert data["type"] == "Undo" +    assert data["object"]["type"] == "Follow" +    assert data["object"]["object"] == user.ap_id +    assert data["actor"] == "http://mastodon.example.org/users/admin" + +    refute User.following?(User.get_cached_by_ap_id(data["actor"]), user) +  end + +  test "it works for incoming unblocks with an existing block" do +    user = insert(:user) + +    block_data = +      File.read!("test/fixtures/mastodon-block-activity.json") +      |> Poison.decode!() +      |> Map.put("object", user.ap_id) + +    _blocker = insert(:user, ap_id: block_data["actor"], local: false) + +    {:ok, %Activity{data: _, local: false}} = Transmogrifier.handle_incoming(block_data) + +    data = +      File.read!("test/fixtures/mastodon-unblock-activity.json") +      |> Poison.decode!() +      |> Map.put("object", block_data) + +    {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) +    assert data["type"] == "Undo" +    assert data["object"] == block_data["id"] + +    blocker = User.get_cached_by_ap_id(data["actor"]) + +    refute User.blocks?(blocker, user) +  end +end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 6d43c3365..2914c90ea 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -325,124 +325,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert object_data["cc"] == to      end -    test "it works for incoming emoji reactions" do -      user = insert(:user) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) - -      data = -        File.read!("test/fixtures/emoji-reaction.json") -        |> Poison.decode!() -        |> Map.put("object", activity.data["object"]) - -      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - -      assert data["actor"] == "http://mastodon.example.org/users/admin" -      assert data["type"] == "EmojiReact" -      assert data["id"] == "http://mastodon.example.org/users/admin#reactions/2" -      assert data["object"] == activity.data["object"] -      assert data["content"] == "👌" -    end - -    test "it reject invalid emoji reactions" do -      user = insert(:user) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) - -      data = -        File.read!("test/fixtures/emoji-reaction-too-long.json") -        |> Poison.decode!() -        |> Map.put("object", activity.data["object"]) - -      assert :error = Transmogrifier.handle_incoming(data) - -      data = -        File.read!("test/fixtures/emoji-reaction-no-emoji.json") -        |> Poison.decode!() -        |> Map.put("object", activity.data["object"]) - -      assert :error = Transmogrifier.handle_incoming(data) -    end - -    test "it works for incoming emoji reaction undos" do -      user = insert(:user) - -      {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) -      {:ok, reaction_activity, _object} = CommonAPI.react_with_emoji(activity.id, user, "👌") - -      data = -        File.read!("test/fixtures/mastodon-undo-like.json") -        |> Poison.decode!() -        |> Map.put("object", reaction_activity.data["id"]) -        |> Map.put("actor", user.ap_id) - -      {:ok, activity} = Transmogrifier.handle_incoming(data) - -      assert activity.actor == user.ap_id -      assert activity.data["id"] == data["id"] -      assert activity.data["type"] == "Undo" -    end - -    test "it returns an error for incoming unlikes wihout a like activity" do -      user = insert(:user) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "leave a like pls"}) - -      data = -        File.read!("test/fixtures/mastodon-undo-like.json") -        |> Poison.decode!() -        |> Map.put("object", activity.data["object"]) - -      assert Transmogrifier.handle_incoming(data) == :error -    end - -    test "it works for incoming unlikes with an existing like activity" do -      user = insert(:user) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "leave a like pls"}) - -      like_data = -        File.read!("test/fixtures/mastodon-like.json") -        |> Poison.decode!() -        |> Map.put("object", activity.data["object"]) - -      {:ok, %Activity{data: like_data, local: false}} = Transmogrifier.handle_incoming(like_data) - -      data = -        File.read!("test/fixtures/mastodon-undo-like.json") -        |> Poison.decode!() -        |> Map.put("object", like_data) -        |> Map.put("actor", like_data["actor"]) - -      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - -      assert data["actor"] == "http://mastodon.example.org/users/admin" -      assert data["type"] == "Undo" -      assert data["id"] == "http://mastodon.example.org/users/admin#likes/2/undo" -      assert data["object"]["id"] == "http://mastodon.example.org/users/admin#likes/2" -    end - -    test "it works for incoming unlikes with an existing like activity and a compact object" do -      user = insert(:user) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "leave a like pls"}) - -      like_data = -        File.read!("test/fixtures/mastodon-like.json") -        |> Poison.decode!() -        |> Map.put("object", activity.data["object"]) - -      {:ok, %Activity{data: like_data, local: false}} = Transmogrifier.handle_incoming(like_data) - -      data = -        File.read!("test/fixtures/mastodon-undo-like.json") -        |> Poison.decode!() -        |> Map.put("object", like_data["id"]) -        |> Map.put("actor", like_data["actor"]) - -      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - -      assert data["actor"] == "http://mastodon.example.org/users/admin" -      assert data["type"] == "Undo" -      assert data["id"] == "http://mastodon.example.org/users/admin#likes/2/undo" -      assert data["object"]["id"] == "http://mastodon.example.org/users/admin#likes/2" -    end -      test "it works for incoming announces" do        data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode!() @@ -599,7 +481,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do      test "it strips internal reactions" do        user = insert(:user)        {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"}) -      {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, user, "📢") +      {:ok, _} = CommonAPI.react_with_emoji(activity.id, user, "📢")        %{object: object} = Activity.get_by_id_with_object(activity.id)        assert Map.has_key?(object.data, "reactions") @@ -766,35 +648,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert user.locked == true      end -    test "it works for incoming unannounces with an existing notice" do -      user = insert(:user) -      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey"}) - -      announce_data = -        File.read!("test/fixtures/mastodon-announce.json") -        |> Poison.decode!() -        |> Map.put("object", activity.data["object"]) - -      {:ok, %Activity{data: announce_data, local: false}} = -        Transmogrifier.handle_incoming(announce_data) - -      data = -        File.read!("test/fixtures/mastodon-undo-announce.json") -        |> Poison.decode!() -        |> Map.put("object", announce_data) -        |> Map.put("actor", announce_data["actor"]) - -      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - -      assert data["type"] == "Undo" -      assert object_data = data["object"] -      assert object_data["type"] == "Announce" -      assert object_data["object"] == activity.data["object"] - -      assert object_data["id"] == -               "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" -    end -      test "it works for incomming unfollows with an existing follow" do        user = insert(:user) @@ -889,32 +742,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        refute User.following?(blocked, blocker)      end -    test "it works for incoming unblocks with an existing block" do -      user = insert(:user) - -      block_data = -        File.read!("test/fixtures/mastodon-block-activity.json") -        |> Poison.decode!() -        |> Map.put("object", user.ap_id) - -      {:ok, %Activity{data: _, local: false}} = Transmogrifier.handle_incoming(block_data) - -      data = -        File.read!("test/fixtures/mastodon-unblock-activity.json") -        |> Poison.decode!() -        |> Map.put("object", block_data) - -      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) -      assert data["type"] == "Undo" -      assert data["object"]["type"] == "Block" -      assert data["object"]["object"] == user.ap_id -      assert data["actor"] == "http://mastodon.example.org/users/admin" - -      blocker = User.get_cached_by_ap_id(data["actor"]) - -      refute User.blocks?(blocker, user) -    end -      test "it works for incoming accepts which were pre-accepted" do        follower = insert(:user)        followed = insert(:user) diff --git a/test/web/activity_pub/utils_test.exs b/test/web/activity_pub/utils_test.exs index b0bfed917..b8d811c73 100644 --- a/test/web/activity_pub/utils_test.exs +++ b/test/web/activity_pub/utils_test.exs @@ -102,34 +102,6 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do      end    end -  describe "make_unlike_data/3" do -    test "returns data for unlike activity" do -      user = insert(:user) -      like_activity = insert(:like_activity, data_attrs: %{"context" => "test context"}) - -      object = Object.normalize(like_activity.data["object"]) - -      assert Utils.make_unlike_data(user, like_activity, nil) == %{ -               "type" => "Undo", -               "actor" => user.ap_id, -               "object" => like_activity.data, -               "to" => [user.follower_address, object.data["actor"]], -               "cc" => [Pleroma.Constants.as_public()], -               "context" => like_activity.data["context"] -             } - -      assert Utils.make_unlike_data(user, like_activity, "9mJEZK0tky1w2xD2vY") == %{ -               "type" => "Undo", -               "actor" => user.ap_id, -               "object" => like_activity.data, -               "to" => [user.follower_address, object.data["actor"]], -               "cc" => [Pleroma.Constants.as_public()], -               "context" => like_activity.data["context"], -               "id" => "9mJEZK0tky1w2xD2vY" -             } -    end -  end -    describe "make_like_data" do      setup do        user = insert(:user) | 
