diff options
Diffstat (limited to 'test/web/activity_pub')
6 files changed, 191 insertions, 39 deletions
diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 03f968aaf..d8caa0b00 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -239,7 +239,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do          }        } -      assert {:error, {:remote_limit_error, _}} = ActivityPub.insert(data) +      assert {:error, :remote_limit} = ActivityPub.insert(data)      end      test "doesn't drop activities with content being null" do @@ -386,9 +386,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    end    describe "create activities" do -    test "it reverts create" do -      user = insert(:user) +    setup do +      [user: insert(:user)] +    end +    test "it reverts create", %{user: user} do        with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do          assert {:error, :reverted} =                   ActivityPub.create(%{ @@ -407,9 +409,47 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert Repo.aggregate(Object, :count, :id) == 0      end -    test "removes doubled 'to' recipients" do -      user = insert(:user) +    test "creates activity if expiration is not configured and expires_at is not passed", %{ +      user: user +    } do +      clear_config([Pleroma.Workers.PurgeExpiredActivity, :enabled], false) + +      assert {:ok, _} = +               ActivityPub.create(%{ +                 to: ["user1", "user2"], +                 actor: user, +                 context: "", +                 object: %{ +                   "to" => ["user1", "user2"], +                   "type" => "Note", +                   "content" => "testing" +                 } +               }) +    end + +    test "rejects activity if expires_at present but expiration is not configured", %{user: user} do +      clear_config([Pleroma.Workers.PurgeExpiredActivity, :enabled], false) + +      assert {:error, :expired_activities_disabled} = +               ActivityPub.create(%{ +                 to: ["user1", "user2"], +                 actor: user, +                 context: "", +                 object: %{ +                   "to" => ["user1", "user2"], +                   "type" => "Note", +                   "content" => "testing" +                 }, +                 additional: %{ +                   "expires_at" => DateTime.utc_now() +                 } +               }) +      assert Repo.aggregate(Activity, :count, :id) == 0 +      assert Repo.aggregate(Object, :count, :id) == 0 +    end + +    test "removes doubled 'to' recipients", %{user: user} do        {:ok, activity} =          ActivityPub.create(%{            to: ["user1", "user1", "user2"], @@ -427,9 +467,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert activity.recipients == ["user1", "user2", user.ap_id]      end -    test "increases user note count only for public activities" do -      user = insert(:user) - +    test "increases user note count only for public activities", %{user: user} do        {:ok, _} =          CommonAPI.post(User.get_cached_by_id(user.id), %{            status: "1", @@ -458,8 +496,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert user.note_count == 2      end -    test "increases replies count" do -      user = insert(:user) +    test "increases replies count", %{user: user} do        user2 = insert(:user)        {:ok, activity} = CommonAPI.post(user, %{status: "1", visibility: "public"}) @@ -2069,18 +2106,25 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    end    describe "global activity expiration" do -    setup do: clear_config([:mrf, :policies]) -      test "creates an activity expiration for local Create activities" do -      Pleroma.Config.put( -        [:mrf, :policies], -        Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy +      clear_config([:mrf, :policies], Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy) + +      {:ok, activity} = ActivityBuilder.insert(%{"type" => "Create", "context" => "3hu"}) +      {:ok, follow} = ActivityBuilder.insert(%{"type" => "Follow", "context" => "3hu"}) + +      assert_enqueued( +        worker: Pleroma.Workers.PurgeExpiredActivity, +        args: %{activity_id: activity.id}, +        scheduled_at: +          activity.inserted_at +          |> DateTime.from_naive!("Etc/UTC") +          |> Timex.shift(days: 365)        ) -      {:ok, %{id: id_create}} = ActivityBuilder.insert(%{"type" => "Create", "context" => "3hu"}) -      {:ok, _follow} = ActivityBuilder.insert(%{"type" => "Follow", "context" => "3hu"}) - -      assert [%{activity_id: ^id_create}] = Pleroma.ActivityExpiration |> Repo.all() +      refute_enqueued( +        worker: Pleroma.Workers.PurgeExpiredActivity, +        args: %{activity_id: follow.id} +      )      end    end diff --git a/test/web/activity_pub/mrf/activity_expiration_policy_test.exs b/test/web/activity_pub/mrf/activity_expiration_policy_test.exs index f25cf8b12..e7370d4ef 100644 --- a/test/web/activity_pub/mrf/activity_expiration_policy_test.exs +++ b/test/web/activity_pub/mrf/activity_expiration_policy_test.exs @@ -18,11 +18,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do                 "object" => %{"type" => "Note"}               }) -    assert Timex.diff(expires_at, NaiveDateTime.utc_now(), :days) == 364 +    assert Timex.diff(expires_at, DateTime.utc_now(), :days) == 364    end    test "keeps existing `expires_at` if it less than the config setting" do -    expires_at = NaiveDateTime.utc_now() |> Timex.shift(days: 1) +    expires_at = DateTime.utc_now() |> Timex.shift(days: 1)      assert {:ok, %{"type" => "Create", "expires_at" => ^expires_at}} =               ActivityExpirationPolicy.filter(%{ @@ -35,7 +35,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do    end    test "overwrites existing `expires_at` if it greater than the config setting" do -    too_distant_future = NaiveDateTime.utc_now() |> Timex.shift(years: 2) +    too_distant_future = DateTime.utc_now() |> Timex.shift(years: 2)      assert {:ok, %{"type" => "Create", "expires_at" => expires_at}} =               ActivityExpirationPolicy.filter(%{ @@ -46,7 +46,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do                 "object" => %{"type" => "Note"}               }) -    assert Timex.diff(expires_at, NaiveDateTime.utc_now(), :days) == 364 +    assert Timex.diff(expires_at, DateTime.utc_now(), :days) == 364    end    test "ignores remote activities" do diff --git a/test/web/activity_pub/mrf/force_bot_unlisted_policy_test.exs b/test/web/activity_pub/mrf/force_bot_unlisted_policy_test.exs new file mode 100644 index 000000000..86dd9ddae --- /dev/null +++ b/test/web/activity_pub/mrf/force_bot_unlisted_policy_test.exs @@ -0,0 +1,60 @@ +# 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.MRF.ForceBotUnlistedPolicyTest do +  use Pleroma.DataCase +  import Pleroma.Factory + +  alias Pleroma.Web.ActivityPub.MRF.ForceBotUnlistedPolicy +  @public "https://www.w3.org/ns/activitystreams#Public" + +  defp generate_messages(actor) do +    {%{ +       "actor" => actor.ap_id, +       "type" => "Create", +       "object" => %{}, +       "to" => [@public, "f"], +       "cc" => [actor.follower_address, "d"] +     }, +     %{ +       "actor" => actor.ap_id, +       "type" => "Create", +       "object" => %{"to" => ["f", actor.follower_address], "cc" => ["d", @public]}, +       "to" => ["f", actor.follower_address], +       "cc" => ["d", @public] +     }} +  end + +  test "removes from the federated timeline by nickname heuristics 1" do +    actor = insert(:user, %{nickname: "annoying_ebooks@example.com"}) + +    {message, except_message} = generate_messages(actor) + +    assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message} +  end + +  test "removes from the federated timeline by nickname heuristics 2" do +    actor = insert(:user, %{nickname: "cirnonewsnetworkbot@meow.cat"}) + +    {message, except_message} = generate_messages(actor) + +    assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message} +  end + +  test "removes from the federated timeline by actor type Application" do +    actor = insert(:user, %{actor_type: "Application"}) + +    {message, except_message} = generate_messages(actor) + +    assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message} +  end + +  test "removes from the federated timeline by actor type Service" do +    actor = insert(:user, %{actor_type: "Service"}) + +    {message, except_message} = generate_messages(actor) + +    assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message} +  end +end diff --git a/test/web/activity_pub/object_validators/chat_validation_test.exs b/test/web/activity_pub/object_validators/chat_validation_test.exs index 50bf03515..16e4808e5 100644 --- a/test/web/activity_pub/object_validators/chat_validation_test.exs +++ b/test/web/activity_pub/object_validators/chat_validation_test.exs @@ -69,6 +69,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatValidationTest do        assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])        assert Map.put(valid_chat_message, "attachment", nil) == object +      assert match?(%{"firefox" => _}, object["emoji"])      end      test "validates for a basic object with an attachment", %{ diff --git a/test/web/activity_pub/transmogrifier/question_handling_test.exs b/test/web/activity_pub/transmogrifier/question_handling_test.exs index c82361828..74ee79543 100644 --- a/test/web/activity_pub/transmogrifier/question_handling_test.exs +++ b/test/web/activity_pub/transmogrifier/question_handling_test.exs @@ -106,6 +106,57 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.QuestionHandlingTest do      assert Enum.sort(object.data["oneOf"]) == Enum.sort(options)    end +  test "Mastodon Question activity with custom emojis" do +    options = [ +      %{ +        "type" => "Note", +        "name" => ":blobcat:", +        "replies" => %{"totalItems" => 0, "type" => "Collection"} +      }, +      %{ +        "type" => "Note", +        "name" => ":blobfox:", +        "replies" => %{"totalItems" => 0, "type" => "Collection"} +      } +    ] + +    tag = [ +      %{ +        "icon" => %{ +          "type" => "Image", +          "url" => "https://blob.cat/emoji/custom/blobcats/blobcat.png" +        }, +        "id" => "https://blob.cat/emoji/custom/blobcats/blobcat.png", +        "name" => ":blobcat:", +        "type" => "Emoji", +        "updated" => "1970-01-01T00:00:00Z" +      }, +      %{ +        "icon" => %{"type" => "Image", "url" => "https://blob.cat/emoji/blobfox/blobfox.png"}, +        "id" => "https://blob.cat/emoji/blobfox/blobfox.png", +        "name" => ":blobfox:", +        "type" => "Emoji", +        "updated" => "1970-01-01T00:00:00Z" +      } +    ] + +    data = +      File.read!("test/fixtures/mastodon-question-activity.json") +      |> Poison.decode!() +      |> Kernel.put_in(["object", "oneOf"], options) +      |> Kernel.put_in(["object", "tag"], tag) + +    {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data) +    object = Object.normalize(activity, false) + +    assert object.data["oneOf"] == options + +    assert object.data["emoji"] == %{ +             "blobcat" => "https://blob.cat/emoji/custom/blobcats/blobcat.png", +             "blobfox" => "https://blob.cat/emoji/blobfox/blobfox.png" +           } +  end +    test "returns an error if received a second time" do      data = File.read!("test/fixtures/mastodon-question-activity.json") |> Poison.decode!() diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 3fa41b0c7..cc55a7be7 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -105,7 +105,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        object =          data["object"] -        |> Map.put("inReplyTo", "https://shitposter.club/notice/2827873") +        |> Map.put("inReplyTo", "https://mstdn.io/users/mayuutann/statuses/99568293732299394")        data = Map.put(data, "object", object)        {:ok, returned_activity} = Transmogrifier.handle_incoming(data) @@ -113,10 +113,11 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert activity =                 Activity.get_create_by_object_ap_id( -                 "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" +                 "https://mstdn.io/users/mayuutann/statuses/99568293732299394"                 ) -      assert returned_object.data["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873" +      assert returned_object.data["inReplyTo"] == +               "https://mstdn.io/users/mayuutann/statuses/99568293732299394"      end      test "it does not fetch reply-to activities beyond max replies depth limit" do @@ -140,8 +141,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do                   "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"                 ) -        assert returned_object.data["inReplyToAtomUri"] == -                 "https://shitposter.club/notice/2827873" +        assert returned_object.data["inReplyTo"] == "https://shitposter.club/notice/2827873"        end      end @@ -1072,7 +1072,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert Transmogrifier.fix_in_reply_to(data) == data      end -    test "returns object with inReplyToAtomUri when denied incoming reply", %{data: data} do +    test "returns object with inReplyTo when denied incoming reply", %{data: data} do        Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 0)        object_with_reply = @@ -1080,26 +1080,22 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        modified_object = Transmogrifier.fix_in_reply_to(object_with_reply)        assert modified_object["inReplyTo"] == "https://shitposter.club/notice/2827873" -      assert modified_object["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873"        object_with_reply =          Map.put(data["object"], "inReplyTo", %{"id" => "https://shitposter.club/notice/2827873"})        modified_object = Transmogrifier.fix_in_reply_to(object_with_reply)        assert modified_object["inReplyTo"] == %{"id" => "https://shitposter.club/notice/2827873"} -      assert modified_object["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873"        object_with_reply =          Map.put(data["object"], "inReplyTo", ["https://shitposter.club/notice/2827873"])        modified_object = Transmogrifier.fix_in_reply_to(object_with_reply)        assert modified_object["inReplyTo"] == ["https://shitposter.club/notice/2827873"] -      assert modified_object["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873"        object_with_reply = Map.put(data["object"], "inReplyTo", [])        modified_object = Transmogrifier.fix_in_reply_to(object_with_reply)        assert modified_object["inReplyTo"] == [] -      assert modified_object["inReplyToAtomUri"] == ""      end      @tag capture_log: true @@ -1108,19 +1104,17 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do          Map.put(            data["object"],            "inReplyTo", -          "https://shitposter.club/notice/2827873" +          "https://mstdn.io/users/mayuutann/statuses/99568293732299394"          )        Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 5)        modified_object = Transmogrifier.fix_in_reply_to(object_with_reply)        assert modified_object["inReplyTo"] == -               "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" - -      assert modified_object["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873" +               "https://mstdn.io/users/mayuutann/statuses/99568293732299394"        assert modified_object["context"] == -               "tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26" +               "tag:shitposter.club,2018-02-22:objectType=thread:nonce=e5a7c72d60a9c0e4"      end    end @@ -1222,7 +1216,9 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do      @tag capture_log: true      test "returns {:ok, %Object{}} for success case" do        assert {:ok, %Object{}} = -               Transmogrifier.get_obj_helper("https://shitposter.club/notice/2827873") +               Transmogrifier.get_obj_helper( +                 "https://mstdn.io/users/mayuutann/statuses/99568293732299394" +               )      end    end  | 
