diff options
Diffstat (limited to 'test/web/activity_pub')
| -rw-r--r-- | test/web/activity_pub/transmogrifier/follow_handling_test.exs | 143 | ||||
| -rw-r--r-- | test/web/activity_pub/transmogrifier_test.exs | 54 | ||||
| -rw-r--r-- | test/web/activity_pub/utils_test.exs | 48 | 
3 files changed, 191 insertions, 54 deletions
diff --git a/test/web/activity_pub/transmogrifier/follow_handling_test.exs b/test/web/activity_pub/transmogrifier/follow_handling_test.exs new file mode 100644 index 000000000..857d65564 --- /dev/null +++ b/test/web/activity_pub/transmogrifier/follow_handling_test.exs @@ -0,0 +1,143 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do +  use Pleroma.DataCase +  alias Pleroma.Activity +  alias Pleroma.Repo +  alias Pleroma.User +  alias Pleroma.Web.ActivityPub.Transmogrifier +  alias Pleroma.Web.ActivityPub.Utils + +  import Pleroma.Factory +  import Ecto.Query + +  setup_all do +    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) +    :ok +  end + +  describe "handle_incoming" do +    test "it works for incoming follow requests" do +      user = insert(:user) + +      data = +        File.read!("test/fixtures/mastodon-follow-activity.json") +        |> Poison.decode!() +        |> Map.put("object", user.ap_id) + +      {:ok, %Activity{data: data, local: false} = activity} = Transmogrifier.handle_incoming(data) + +      assert data["actor"] == "http://mastodon.example.org/users/admin" +      assert data["type"] == "Follow" +      assert data["id"] == "http://mastodon.example.org/users/admin#follows/2" + +      activity = Repo.get(Activity, activity.id) +      assert activity.data["state"] == "accept" +      assert User.following?(User.get_cached_by_ap_id(data["actor"]), user) +    end + +    test "with locked accounts, it does not create a follow or an accept" do +      user = insert(:user, info: %{locked: true}) + +      data = +        File.read!("test/fixtures/mastodon-follow-activity.json") +        |> Poison.decode!() +        |> Map.put("object", user.ap_id) + +      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +      assert data["state"] == "pending" + +      refute User.following?(User.get_cached_by_ap_id(data["actor"]), user) + +      accepts = +        from( +          a in Activity, +          where: fragment("?->>'type' = ?", a.data, "Accept") +        ) +        |> Repo.all() + +      assert length(accepts) == 0 +    end + +    test "it works for follow requests when you are already followed, creating a new accept activity" do +      # This is important because the remote might have the wrong idea about the +      # current follow status. This can lead to instance A thinking that x@A is +      # followed by y@B, but B thinks they are not. In this case, the follow can +      # never go through again because it will never get an Accept. +      user = insert(:user) + +      data = +        File.read!("test/fixtures/mastodon-follow-activity.json") +        |> Poison.decode!() +        |> Map.put("object", user.ap_id) + +      {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(data) + +      accepts = +        from( +          a in Activity, +          where: fragment("?->>'type' = ?", a.data, "Accept") +        ) +        |> Repo.all() + +      assert length(accepts) == 1 + +      data = +        File.read!("test/fixtures/mastodon-follow-activity.json") +        |> Poison.decode!() +        |> Map.put("id", String.replace(data["id"], "2", "3")) +        |> Map.put("object", user.ap_id) + +      {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(data) + +      accepts = +        from( +          a in Activity, +          where: fragment("?->>'type' = ?", a.data, "Accept") +        ) +        |> Repo.all() + +      assert length(accepts) == 2 +    end + +    test "it rejects incoming follow requests from blocked users when deny_follow_blocked is enabled" do +      Pleroma.Config.put([:user, :deny_follow_blocked], true) + +      user = insert(:user) +      {:ok, target} = User.get_or_fetch("http://mastodon.example.org/users/admin") + +      {:ok, user} = User.block(user, target) + +      data = +        File.read!("test/fixtures/mastodon-follow-activity.json") +        |> Poison.decode!() +        |> Map.put("object", user.ap_id) + +      {:ok, %Activity{data: %{"id" => id}}} = Transmogrifier.handle_incoming(data) + +      %Activity{} = activity = Activity.get_by_ap_id(id) + +      assert activity.data["state"] == "reject" +    end + +    test "it works for incoming follow requests from hubzilla" do +      user = insert(:user) + +      data = +        File.read!("test/fixtures/hubzilla-follow-activity.json") +        |> Poison.decode!() +        |> Map.put("object", user.ap_id) +        |> Utils.normalize_params() + +      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +      assert data["actor"] == "https://hubzilla.example.org/channel/kaniini" +      assert data["type"] == "Follow" +      assert data["id"] == "https://hubzilla.example.org/channel/kaniini#follows/2" +      assert User.following?(User.get_cached_by_ap_id(data["actor"]), user) +    end +  end +end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 89c8f79c9..28971ae45 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -11,7 +11,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub    alias Pleroma.Web.ActivityPub.Transmogrifier -  alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.OStatus    alias Pleroma.Web.Websub.WebsubClientSubscription @@ -248,59 +247,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert object_data["cc"] == to      end -    test "it works for incoming follow requests" do -      user = insert(:user) - -      data = -        File.read!("test/fixtures/mastodon-follow-activity.json") -        |> Poison.decode!() -        |> Map.put("object", user.ap_id) - -      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - -      assert data["actor"] == "http://mastodon.example.org/users/admin" -      assert data["type"] == "Follow" -      assert data["id"] == "http://mastodon.example.org/users/admin#follows/2" -      assert User.following?(User.get_cached_by_ap_id(data["actor"]), user) -    end - -    test "it rejects incoming follow requests from blocked users when deny_follow_blocked is enabled" do -      Pleroma.Config.put([:user, :deny_follow_blocked], true) - -      user = insert(:user) -      {:ok, target} = User.get_or_fetch("http://mastodon.example.org/users/admin") - -      {:ok, user} = User.block(user, target) - -      data = -        File.read!("test/fixtures/mastodon-follow-activity.json") -        |> Poison.decode!() -        |> Map.put("object", user.ap_id) - -      {:ok, %Activity{data: %{"id" => id}}} = Transmogrifier.handle_incoming(data) - -      %Activity{} = activity = Activity.get_by_ap_id(id) - -      assert activity.data["state"] == "reject" -    end - -    test "it works for incoming follow requests from hubzilla" do -      user = insert(:user) - -      data = -        File.read!("test/fixtures/hubzilla-follow-activity.json") -        |> Poison.decode!() -        |> Map.put("object", user.ap_id) -        |> Utils.normalize_params() - -      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - -      assert data["actor"] == "https://hubzilla.example.org/channel/kaniini" -      assert data["type"] == "Follow" -      assert data["id"] == "https://hubzilla.example.org/channel/kaniini#follows/2" -      assert User.following?(User.get_cached_by_ap_id(data["actor"]), user) -    end -      test "it works for incoming likes" do        user = insert(:user)        {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) diff --git a/test/web/activity_pub/utils_test.exs b/test/web/activity_pub/utils_test.exs index de741c64b..932d5f5e7 100644 --- a/test/web/activity_pub/utils_test.exs +++ b/test/web/activity_pub/utils_test.exs @@ -2,6 +2,7 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do    use Pleroma.DataCase    alias Pleroma.Activity    alias Pleroma.Object +  alias Pleroma.Repo    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub    alias Pleroma.Web.ActivityPub.Utils @@ -247,4 +248,51 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do        assert fetched_vote.id == vote.id      end    end + +  describe "update_follow_state_for_all/2" do +    test "updates the state of all Follow activities with the same actor and object" do +      user = insert(:user, info: %{locked: true}) +      follower = insert(:user) + +      {:ok, follow_activity} = ActivityPub.follow(follower, user) +      {:ok, follow_activity_two} = ActivityPub.follow(follower, user) + +      data = +        follow_activity_two.data +        |> Map.put("state", "accept") + +      cng = Ecto.Changeset.change(follow_activity_two, data: data) + +      {:ok, follow_activity_two} = Repo.update(cng) + +      {:ok, follow_activity_two} = +        Utils.update_follow_state_for_all(follow_activity_two, "accept") + +      assert Repo.get(Activity, follow_activity.id).data["state"] == "accept" +      assert Repo.get(Activity, follow_activity_two.id).data["state"] == "accept" +    end +  end + +  describe "update_follow_state/2" do +    test "updates the state of the given follow activity" do +      user = insert(:user, info: %{locked: true}) +      follower = insert(:user) + +      {:ok, follow_activity} = ActivityPub.follow(follower, user) +      {:ok, follow_activity_two} = ActivityPub.follow(follower, user) + +      data = +        follow_activity_two.data +        |> Map.put("state", "accept") + +      cng = Ecto.Changeset.change(follow_activity_two, data: data) + +      {:ok, follow_activity_two} = Repo.update(cng) + +      {:ok, follow_activity_two} = Utils.update_follow_state(follow_activity_two, "reject") + +      assert Repo.get(Activity, follow_activity.id).data["state"] == "pending" +      assert Repo.get(Activity, follow_activity_two.id).data["state"] == "reject" +    end +  end  end  | 
