diff options
Diffstat (limited to 'test/web/activity_pub')
14 files changed, 478 insertions, 207 deletions
diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index ed900d8f8..0517571f2 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -533,7 +533,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        end)        :ok = Mix.Tasks.Pleroma.Relay.run(["list"]) -      assert_receive {:mix_shell, :info, ["relay.mastodon.host"]} +      assert_receive {:mix_shell, :info, ["https://relay.mastodon.host/actor"]}      end      @tag capture_log: true @@ -905,6 +905,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do    end    describe "POST /users/:nickname/outbox (C2S)" do +    setup do: clear_config([:instance, :limit]) +      setup do        [          activity: %{ @@ -1121,6 +1123,20 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        assert cirno_object.data["actor"] == cirno.ap_id        assert cirno_object.data["attributedTo"] == cirno.ap_id      end + +    test "Character limitation", %{conn: conn, activity: activity} do +      Pleroma.Config.put([:instance, :limit], 5) +      user = insert(:user) + +      result = +        conn +        |> assign(:user, user) +        |> put_req_header("content-type", "application/activity+json") +        |> post("/users/#{user.nickname}/outbox", activity) +        |> json_response(400) + +      assert result == "Note is over the character limit" +    end    end    describe "/relay/followers" do diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 03f968aaf..7bdad3810 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"}) @@ -1773,6 +1810,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do          |> Enum.map(& &1.id)        assert activities_ids == [] + +      activities_ids = +        %{} +        |> Map.put(:reply_visibility, "self") +        |> Map.put(:reply_filtering_user, nil) +        |> ActivityPub.fetch_public_activities() + +      assert activities_ids == []      end      test "home timeline", %{users: %{u1: user}} do @@ -2069,18 +2114,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/mrf/mediaproxy_warming_policy_test.exs b/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs index 313d59a66..1710c4d2a 100644 --- a/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs +++ b/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs @@ -22,6 +22,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicyTest do      }    } +  setup do: clear_config([:media_proxy, :enabled], true) +    test "it prefetches media proxy URIs" do      with_mock HTTP, get: fn _, _, _ -> {:ok, []} end do        MediaProxyWarmingPolicy.filter(@message) diff --git a/test/web/activity_pub/object_validators/note_validator_test.exs b/test/web/activity_pub/object_validators/article_note_validator_test.exs index 30c481ffb..cc6dab872 100644 --- a/test/web/activity_pub/object_validators/note_validator_test.exs +++ b/test/web/activity_pub/object_validators/article_note_validator_test.exs @@ -2,10 +2,10 @@  # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidatorTest do +defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNoteValidatorTest do    use Pleroma.DataCase -  alias Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator +  alias Pleroma.Web.ActivityPub.ObjectValidators.ArticleNoteValidator    alias Pleroma.Web.ActivityPub.Utils    import Pleroma.Factory @@ -29,7 +29,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidatorTest do      end      test "a basic note validates", %{note: note} do -      %{valid?: true} = NoteValidator.cast_and_validate(note) +      %{valid?: true} = ArticleNoteValidator.cast_and_validate(note)      end    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/pipeline_test.exs b/test/web/activity_pub/pipeline_test.exs index f2a231eaf..210a06563 100644 --- a/test/web/activity_pub/pipeline_test.exs +++ b/test/web/activity_pub/pipeline_test.exs @@ -26,7 +26,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do          {            Pleroma.Web.ActivityPub.MRF,            [], -          [filter: fn o -> {:ok, o} end] +          [pipeline_filter: fn o, m -> {:ok, o, m} end]          },          {            Pleroma.Web.ActivityPub.ActivityPub, @@ -51,7 +51,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do                   Pleroma.Web.ActivityPub.Pipeline.common_pipeline(activity, meta)          assert_called(Pleroma.Web.ActivityPub.ObjectValidator.validate(activity, meta)) -        assert_called(Pleroma.Web.ActivityPub.MRF.filter(activity)) +        assert_called(Pleroma.Web.ActivityPub.MRF.pipeline_filter(activity, meta))          assert_called(Pleroma.Web.ActivityPub.ActivityPub.persist(activity, meta))          assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta))          refute called(Pleroma.Web.Federator.publish(activity)) @@ -68,7 +68,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do          {            Pleroma.Web.ActivityPub.MRF,            [], -          [filter: fn o -> {:ok, o} end] +          [pipeline_filter: fn o, m -> {:ok, o, m} end]          },          {            Pleroma.Web.ActivityPub.ActivityPub, @@ -93,7 +93,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do                   Pleroma.Web.ActivityPub.Pipeline.common_pipeline(activity, meta)          assert_called(Pleroma.Web.ActivityPub.ObjectValidator.validate(activity, meta)) -        assert_called(Pleroma.Web.ActivityPub.MRF.filter(activity)) +        assert_called(Pleroma.Web.ActivityPub.MRF.pipeline_filter(activity, meta))          assert_called(Pleroma.Web.ActivityPub.ActivityPub.persist(activity, meta))          assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta))          assert_called(Pleroma.Web.Federator.publish(activity)) @@ -109,7 +109,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do          {            Pleroma.Web.ActivityPub.MRF,            [], -          [filter: fn o -> {:ok, o} end] +          [pipeline_filter: fn o, m -> {:ok, o, m} end]          },          {            Pleroma.Web.ActivityPub.ActivityPub, @@ -131,7 +131,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do                   Pleroma.Web.ActivityPub.Pipeline.common_pipeline(activity, meta)          assert_called(Pleroma.Web.ActivityPub.ObjectValidator.validate(activity, meta)) -        assert_called(Pleroma.Web.ActivityPub.MRF.filter(activity)) +        assert_called(Pleroma.Web.ActivityPub.MRF.pipeline_filter(activity, meta))          assert_called(Pleroma.Web.ActivityPub.ActivityPub.persist(activity, meta))          assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta))        end @@ -148,7 +148,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do          {            Pleroma.Web.ActivityPub.MRF,            [], -          [filter: fn o -> {:ok, o} end] +          [pipeline_filter: fn o, m -> {:ok, o, m} end]          },          {            Pleroma.Web.ActivityPub.ActivityPub, @@ -170,7 +170,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do                   Pleroma.Web.ActivityPub.Pipeline.common_pipeline(activity, meta)          assert_called(Pleroma.Web.ActivityPub.ObjectValidator.validate(activity, meta)) -        assert_called(Pleroma.Web.ActivityPub.MRF.filter(activity)) +        assert_called(Pleroma.Web.ActivityPub.MRF.pipeline_filter(activity, meta))          assert_called(Pleroma.Web.ActivityPub.ActivityPub.persist(activity, meta))          assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta))        end diff --git a/test/web/activity_pub/transmogrifier/article_handling_test.exs b/test/web/activity_pub/transmogrifier/article_handling_test.exs new file mode 100644 index 000000000..9b12a470a --- /dev/null +++ b/test/web/activity_pub/transmogrifier/article_handling_test.exs @@ -0,0 +1,75 @@ +# 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.ArticleHandlingTest do +  use Oban.Testing, repo: Pleroma.Repo +  use Pleroma.DataCase + +  alias Pleroma.Activity +  alias Pleroma.Object +  alias Pleroma.Object.Fetcher +  alias Pleroma.Web.ActivityPub.Transmogrifier + +  test "Pterotype (Wordpress Plugin) Article" do +    Tesla.Mock.mock(fn %{url: "https://wedistribute.org/wp-json/pterotype/v1/actor/-blog"} -> +      %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/wedistribute-user.json")} +    end) + +    data = +      File.read!("test/fixtures/tesla_mock/wedistribute-create-article.json") |> Jason.decode!() + +    {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + +    object = Object.normalize(data["object"]) + +    assert object.data["name"] == "The end is near: Mastodon plans to drop OStatus support" + +    assert object.data["summary"] == +             "One of the largest platforms in the federated social web is dropping the protocol that it started with." + +    assert object.data["url"] == "https://wedistribute.org/2019/07/mastodon-drops-ostatus/" +  end + +  test "Plume Article" do +    Tesla.Mock.mock(fn +      %{url: "https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/"} -> +        %Tesla.Env{ +          status: 200, +          body: File.read!("test/fixtures/tesla_mock/baptiste.gelex.xyz-article.json") +        } + +      %{url: "https://baptiste.gelez.xyz/@/BaptisteGelez"} -> +        %Tesla.Env{ +          status: 200, +          body: File.read!("test/fixtures/tesla_mock/baptiste.gelex.xyz-user.json") +        } +    end) + +    {:ok, object} = +      Fetcher.fetch_object_from_id( +        "https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/" +      ) + +    assert object.data["name"] == "This Month in Plume: June 2018" + +    assert object.data["url"] == +             "https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/" +  end + +  test "Prismo Article" do +    Tesla.Mock.mock(fn %{url: "https://prismo.news/@mxb"} -> +      %Tesla.Env{ +        status: 200, +        body: File.read!("test/fixtures/tesla_mock/https___prismo.news__mxb.json") +      } +    end) + +    data = File.read!("test/fixtures/prismo-url-map.json") |> Jason.decode!() + +    {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) +    object = Object.normalize(data["object"]) + +    assert object.data["url"] == "https://prismo.news/posts/83" +  end +end diff --git a/test/web/activity_pub/transmogrifier/audio_handling_test.exs b/test/web/activity_pub/transmogrifier/audio_handling_test.exs index c74a9c45d..0636d00c5 100644 --- a/test/web/activity_pub/transmogrifier/audio_handling_test.exs +++ b/test/web/activity_pub/transmogrifier/audio_handling_test.exs @@ -42,4 +42,42 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AudioHandlingTest do      assert object.data["album"] == "lain radio"      assert object.data["length"] == 180_000    end + +  test "Funkwhale Audio object" do +    Tesla.Mock.mock(fn +      %{url: "https://channels.tests.funkwhale.audio/federation/actors/compositions"} -> +        %Tesla.Env{ +          status: 200, +          body: File.read!("test/fixtures/tesla_mock/funkwhale_channel.json") +        } +    end) + +    data = File.read!("test/fixtures/tesla_mock/funkwhale_create_audio.json") |> Poison.decode!() + +    {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data) + +    assert object = Object.normalize(activity, false) + +    assert object.data["to"] == ["https://www.w3.org/ns/activitystreams#Public"] + +    assert object.data["cc"] == [] + +    assert object.data["url"] == "https://channels.tests.funkwhale.audio/library/tracks/74" + +    assert object.data["attachment"] == [ +             %{ +               "mediaType" => "audio/ogg", +               "type" => "Link", +               "name" => nil, +               "url" => [ +                 %{ +                   "href" => +                     "https://channels.tests.funkwhale.audio/api/v1/listen/3901e5d8-0445-49d5-9711-e096cf32e515/?upload=42342395-0208-4fee-a38d-259a6dae0871&download=false", +                   "mediaType" => "audio/ogg", +                   "type" => "Link" +                 } +               ] +             } +           ] +  end  end diff --git a/test/web/activity_pub/transmogrifier/event_handling_test.exs b/test/web/activity_pub/transmogrifier/event_handling_test.exs new file mode 100644 index 000000000..7f1ef2cbd --- /dev/null +++ b/test/web/activity_pub/transmogrifier/event_handling_test.exs @@ -0,0 +1,40 @@ +# 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.EventHandlingTest do +  use Oban.Testing, repo: Pleroma.Repo +  use Pleroma.DataCase + +  alias Pleroma.Object.Fetcher + +  test "Mobilizon Event object" do +    Tesla.Mock.mock(fn +      %{url: "https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39"} -> +        %Tesla.Env{ +          status: 200, +          body: File.read!("test/fixtures/tesla_mock/mobilizon.org-event.json") +        } + +      %{url: "https://mobilizon.org/@tcit"} -> +        %Tesla.Env{ +          status: 200, +          body: File.read!("test/fixtures/tesla_mock/mobilizon.org-user.json") +        } +    end) + +    assert {:ok, object} = +             Fetcher.fetch_object_from_id( +               "https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39" +             ) + +    assert object.data["to"] == ["https://www.w3.org/ns/activitystreams#Public"] +    assert object.data["cc"] == [] + +    assert object.data["url"] == +             "https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39" + +    assert object.data["published"] == "2019-12-17T11:33:56Z" +    assert object.data["name"] == "Mobilizon Launching Party" +  end +end diff --git a/test/web/activity_pub/transmogrifier/question_handling_test.exs b/test/web/activity_pub/transmogrifier/question_handling_test.exs index 9fb965d7f..74ee79543 100644 --- a/test/web/activity_pub/transmogrifier/question_handling_test.exs +++ b/test/web/activity_pub/transmogrifier/question_handling_test.exs @@ -24,6 +24,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.QuestionHandlingTest do      object = Object.normalize(activity, false) +    assert object.data["url"] == "https://mastodon.sdf.org/@rinpatch/102070944809637304" +      assert object.data["closed"] == "2019-05-11T09:03:36Z"      assert object.data["context"] == activity.data["context"] @@ -104,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/video_handling_test.exs b/test/web/activity_pub/transmogrifier/video_handling_test.exs new file mode 100644 index 000000000..69c953a2e --- /dev/null +++ b/test/web/activity_pub/transmogrifier/video_handling_test.exs @@ -0,0 +1,93 @@ +# 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.VideoHandlingTest do +  use Oban.Testing, repo: Pleroma.Repo +  use Pleroma.DataCase + +  alias Pleroma.Activity +  alias Pleroma.Object +  alias Pleroma.Object.Fetcher +  alias Pleroma.Web.ActivityPub.Transmogrifier + +  setup_all do +    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) +    :ok +  end + +  test "skip converting the content when it is nil" do +    data = +      File.read!("test/fixtures/tesla_mock/framatube.org-video.json") +      |> Jason.decode!() +      |> Kernel.put_in(["object", "content"], nil) + +    {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data) + +    assert object = Object.normalize(activity, false) + +    assert object.data["content"] == nil +  end + +  test "it converts content of object to html" do +    data = File.read!("test/fixtures/tesla_mock/framatube.org-video.json") |> Jason.decode!() + +    {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data) + +    assert object = Object.normalize(activity, false) + +    assert object.data["content"] == +             "<p>Après avoir mené avec un certain succès la campagne « Dégooglisons Internet » en 2014, l’association Framasoft annonce fin 2019 arrêter progressivement un certain nombre de ses services alternatifs aux GAFAM. Pourquoi ?</p><p>Transcription par @aprilorg ici : <a href=\"https://www.april.org/deframasoftisons-internet-pierre-yves-gosset-framasoft\">https://www.april.org/deframasoftisons-internet-pierre-yves-gosset-framasoft</a></p>" +  end + +  test "it remaps video URLs as attachments if necessary" do +    {:ok, object} = +      Fetcher.fetch_object_from_id( +        "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3" +      ) + +    assert object.data["url"] == +             "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3" + +    assert object.data["attachment"] == [ +             %{ +               "type" => "Link", +               "mediaType" => "video/mp4", +               "name" => nil, +               "url" => [ +                 %{ +                   "href" => +                     "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4", +                   "mediaType" => "video/mp4", +                   "type" => "Link" +                 } +               ] +             } +           ] + +    data = File.read!("test/fixtures/tesla_mock/framatube.org-video.json") |> Jason.decode!() + +    {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data) + +    assert object = Object.normalize(activity, false) + +    assert object.data["attachment"] == [ +             %{ +               "type" => "Link", +               "mediaType" => "video/mp4", +               "name" => nil, +               "url" => [ +                 %{ +                   "href" => +                     "https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4", +                   "mediaType" => "video/mp4", +                   "type" => "Link" +                 } +               ] +             } +           ] + +    assert object.data["url"] == +             "https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206" +  end +end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 3fa41b0c7..561674f01 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -8,7 +8,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    alias Pleroma.Activity    alias Pleroma.Object -  alias Pleroma.Object.Fetcher    alias Pleroma.Tests.ObanHelpers    alias Pleroma.User    alias Pleroma.Web.ActivityPub.Transmogrifier @@ -45,15 +44,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        assert "test" in object.data["tag"]      end -    test "it works for incoming notices with url not being a string (prismo)" do -      data = File.read!("test/fixtures/prismo-url-map.json") |> Poison.decode!() - -      {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) -      object = Object.normalize(data["object"]) - -      assert object.data["url"] == "https://prismo.news/posts/83" -    end -      test "it cleans up incoming notices which are not really DMs" do        user = insert(:user)        other_user = insert(:user) @@ -105,7 +95,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 +103,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 +131,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 @@ -355,83 +345,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        refute User.following?(User.get_cached_by_ap_id(data["actor"]), user)      end -    test "skip converting the content when it is nil" do -      object_id = "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe" - -      {:ok, object} = Fetcher.fetch_and_contain_remote_object_from_id(object_id) - -      result = -        Pleroma.Web.ActivityPub.Transmogrifier.fix_object(Map.merge(object, %{"content" => nil})) - -      assert result["content"] == nil -    end - -    test "it converts content of object to html" do -      object_id = "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe" - -      {:ok, %{"content" => content_markdown}} = -        Fetcher.fetch_and_contain_remote_object_from_id(object_id) - -      {:ok, %Pleroma.Object{data: %{"content" => content}} = object} = -        Fetcher.fetch_object_from_id(object_id) - -      assert content_markdown == -               "Support this and our other Michigan!/usr/group videos and meetings. Learn more at http://mug.org/membership\n\nTwenty Years in Jail: FreeBSD's Jails, Then and Now\n\nJails started as a limited virtualization system, but over the last two years they've..." - -      assert content == -               "<p>Support this and our other Michigan!/usr/group videos and meetings. Learn more at <a href=\"http://mug.org/membership\">http://mug.org/membership</a></p><p>Twenty Years in Jail: FreeBSD’s Jails, Then and Now</p><p>Jails started as a limited virtualization system, but over the last two years they’ve…</p>" - -      assert object.data["mediaType"] == "text/html" -    end - -    test "it remaps video URLs as attachments if necessary" do -      {:ok, object} = -        Fetcher.fetch_object_from_id( -          "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3" -        ) - -      assert object.data["url"] == -               "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3" - -      assert object.data["attachment"] == [ -               %{ -                 "type" => "Link", -                 "mediaType" => "video/mp4", -                 "url" => [ -                   %{ -                     "href" => -                       "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4", -                     "mediaType" => "video/mp4", -                     "type" => "Link" -                   } -                 ] -               } -             ] - -      {:ok, object} = -        Fetcher.fetch_object_from_id( -          "https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206" -        ) - -      assert object.data["attachment"] == [ -               %{ -                 "type" => "Link", -                 "mediaType" => "video/mp4", -                 "url" => [ -                   %{ -                     "href" => -                       "https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4", -                     "mediaType" => "video/mp4", -                     "type" => "Link" -                   } -                 ] -               } -             ] - -      assert object.data["url"] == -               "https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206" -    end -      test "it accepts Flag activities" do        user = insert(:user)        other_user = insert(:user) @@ -1072,7 +985,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 +993,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 +1017,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 @@ -1139,75 +1046,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do               }      end -    test "fixes data for video object" do -      object = %{ -        "type" => "Video", -        "url" => [ -          %{ -            "type" => "Link", -            "mimeType" => "video/mp4", -            "href" => "https://peede8d-46fb-ad81-2d4c2d1630e3-480.mp4" -          }, -          %{ -            "type" => "Link", -            "mimeType" => "video/mp4", -            "href" => "https://peertube46fb-ad81-2d4c2d1630e3-240.mp4" -          }, -          %{ -            "type" => "Link", -            "mimeType" => "text/html", -            "href" => "https://peertube.-2d4c2d1630e3" -          }, -          %{ -            "type" => "Link", -            "mimeType" => "text/html", -            "href" => "https://peertube.-2d4c2d16377-42" -          } -        ] -      } - -      assert Transmogrifier.fix_url(object) == %{ -               "attachment" => [ -                 %{ -                   "href" => "https://peede8d-46fb-ad81-2d4c2d1630e3-480.mp4", -                   "mimeType" => "video/mp4", -                   "type" => "Link" -                 } -               ], -               "type" => "Video", -               "url" => "https://peertube.-2d4c2d1630e3" -             } -    end - -    test "fixes url for not Video object" do -      object = %{ -        "type" => "Text", -        "url" => [ -          %{ -            "type" => "Link", -            "mimeType" => "text/html", -            "href" => "https://peertube.-2d4c2d1630e3" -          }, -          %{ -            "type" => "Link", -            "mimeType" => "text/html", -            "href" => "https://peertube.-2d4c2d16377-42" -          } -        ] -      } - -      assert Transmogrifier.fix_url(object) == %{ -               "type" => "Text", -               "url" => "https://peertube.-2d4c2d1630e3" -             } - -      assert Transmogrifier.fix_url(%{"type" => "Text", "url" => []}) == %{ -               "type" => "Text", -               "url" => "" -             } -    end - -    test "retunrs not modified object" do +    test "returns non-modified object" do        assert Transmogrifier.fix_url(%{"type" => "Text"}) == %{"type" => "Text"}      end    end @@ -1222,7 +1061,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  | 
