diff options
Diffstat (limited to 'test/web/activity_pub')
| -rw-r--r-- | test/web/activity_pub/activity_pub_test.exs | 82 | ||||
| -rw-r--r-- | test/web/activity_pub/transmogrifier_test.exs | 164 | 
2 files changed, 244 insertions, 2 deletions
diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 6d23adfcd..081c202b1 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -171,6 +171,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    end    describe "public fetch activities" do +    test "doesn't retrieve unlisted activities" do +      user = insert(:user) + +      {:ok, unlisted_activity} = +        CommonAPI.post(user, %{"status" => "yeah", "visibility" => "unlisted"}) + +      {:ok, listed_activity} = CommonAPI.post(user, %{"status" => "yeah"}) + +      [activity] = ActivityPub.fetch_public_activities() + +      assert activity == listed_activity +    end +      test "retrieves public activities" do        _activities = ActivityPub.fetch_public_activities() @@ -264,7 +277,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        {:ok, like_activity, object} = ActivityPub.like(user, object)        assert object.data["like_count"] == 1 -      {:ok, object} = ActivityPub.unlike(user, object) +      {:ok, _, _, object} = ActivityPub.unlike(user, object)        assert object.data["like_count"] == 0        assert Repo.get(Activity, like_activity.id) == nil @@ -292,6 +305,38 @@ 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.get_by_ap_id(note_activity.data["object"]["id"]) +      user = insert(:user) + +      # Unannouncing an object that is not announced does nothing +      # {:ok, object} = ActivityPub.unannounce(user, object) +      # assert object.data["announcement_count"] == 0 + +      {:ok, announce_activity, object} = ActivityPub.announce(user, object) +      assert object.data["announcement_count"] == 1 + +      {:ok, unannounce_activity, activity, object} = ActivityPub.unannounce(user, object) +      assert object.data["announcement_count"] == 0 + +      assert activity == announce_activity + +      assert unannounce_activity.data["to"] == [ +               User.ap_followers(user), +               announce_activity.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 Repo.get(Activity, announce_activity.id) == nil +    end +  end +    describe "uploading files" do      test "copies the file to the configured folder" do        file = %Plug.Upload{ @@ -380,7 +425,40 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert activity.data["type"] == "Undo"        assert activity.data["actor"] == follower.ap_id -      assert activity.data["object"] == follow_activity.data["id"] + +      assert is_map(activity.data["object"]) +      assert activity.data["object"]["type"] == "Follow" +      assert activity.data["object"]["object"] == followed.ap_id +      assert activity.data["object"]["id"] == follow_activity.data["id"] +    end +  end + +  describe "blocking / unblocking" do +    test "creates a block activity" do +      blocker = insert(:user) +      blocked = insert(:user) + +      {:ok, activity} = ActivityPub.block(blocker, blocked) + +      assert activity.data["type"] == "Block" +      assert activity.data["actor"] == blocker.ap_id +      assert activity.data["object"] == blocked.ap_id +    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 + +      assert is_map(activity.data["object"]) +      assert activity.data["object"]["type"] == "Block" +      assert activity.data["object"]["object"] == blocked.ap_id +      assert activity.data["object"]["id"] == block_activity.data["id"]      end    end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index eb093262f..cf6b1d0b5 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -1,6 +1,7 @@  defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    use Pleroma.DataCase    alias Pleroma.Web.ActivityPub.Transmogrifier +  alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.OStatus    alias Pleroma.Activity    alias Pleroma.User @@ -118,6 +119,23 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert User.following?(User.get_by_ap_id(data["actor"]), user)      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_by_ap_id(data["actor"]), user) +    end +      test "it works for incoming likes" do        user = insert(:user)        {:ok, activity} = CommonAPI.post(user, %{"status" => "hello"}) @@ -135,6 +153,43 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert data["object"] == activity.data["object"]["id"]      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"]["id"]) + +      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"]["id"]) + +      {: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 announces" do        data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode!() @@ -232,6 +287,104 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        refute Repo.get(Activity, activity.id)      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"]["id"]) + +      {: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"]["type"] == "Announce" +      assert data["object"]["object"] == activity.data["object"]["id"] + +      assert data["object"]["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) + +      follow_data = +        File.read!("test/fixtures/mastodon-follow-activity.json") +        |> Poison.decode!() +        |> Map.put("object", user.ap_id) + +      {: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_by_ap_id(data["actor"]), user) +    end + +    test "it works for incoming blocks" do +      user = insert(:user) + +      data = +        File.read!("test/fixtures/mastodon-block-activity.json") +        |> Poison.decode!() +        |> Map.put("object", user.ap_id) + +      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +      assert data["type"] == "Block" +      assert data["object"] == user.ap_id +      assert data["actor"] == "http://mastodon.example.org/users/admin" + +      blocker = User.get_by_ap_id(data["actor"]) + +      assert User.blocks?(blocker, 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) + +      {: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_by_ap_id(data["actor"]) + +      refute User.blocks?(blocker, user) +    end    end    describe "prepare outgoing" do @@ -392,4 +545,15 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert Repo.get(WebsubClientSubscription, ws2.id)      end    end + +  describe "actor rewriting" do +    test "it fixes the actor URL property to be a proper URI" do +      data = %{ +        "url" => %{"href" => "http://example.com"} +      } + +      rewritten = Transmogrifier.maybe_fix_user_object(data) +      assert rewritten["url"] == "http://example.com" +    end +  end  end  | 
