diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 3e58864c8..4eeba9903 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1657,7 +1657,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do ) when type in ["OrderedCollection", "Collection"] do {:ok, objects} = Collections.Fetcher.fetch_collection(collection) - Map.new(objects, fn %{"id" => object_ap_id} -> {object_ap_id, NaiveDateTime.utc_now()} end) + + # Items can either be a map _or_ a string + objects + |> Map.new(fn + ap_id when is_binary(ap_id) -> {ap_id, NaiveDateTime.utc_now()} + %{"id" => object_ap_id} -> {object_ap_id, NaiveDateTime.utc_now()} + end) end def fetch_and_prepare_featured_from_ap_id(nil) do diff --git a/test/fixtures/mastodon/featured_collection.json b/test/fixtures/mastodon/featured_collection.json new file mode 100644 index 000000000..32727dc05 --- /dev/null +++ b/test/fixtures/mastodon/featured_collection.json @@ -0,0 +1,20 @@ +{ + "@context": [ + "https://www.w3.org/ns/activitystreams", + { + "ostatus": "http://ostatus.org#", + "atomUri": "ostatus:atomUri", + "inReplyToAtomUri": "ostatus:inReplyToAtomUri", + "conversation": "ostatus:conversation", + "sensitive": "as:sensitive", + "toot": "http://joinmastodon.org/ns#", + "votersCount": "toot:votersCount" + } + ], + "id": "https://example.com/users/alisaie/collections/featured", + "type": "OrderedCollection", + "totalItems": 5, + "orderedItems": [ + "https://example.com/users/alisaie/statuses/108311386746229284" + ] +} diff --git a/test/pleroma/web/activity_pub/activity_pub_test.exs b/test/pleroma/web/activity_pub/activity_pub_test.exs index a5f971bbb..e6cc20bba 100644 --- a/test/pleroma/web/activity_pub/activity_pub_test.exs +++ b/test/pleroma/web/activity_pub/activity_pub_test.exs @@ -347,6 +347,39 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do assert Map.has_key?(data, "http://inserted") end + test "fetches user featured when it has string IDs" do + featured_url = "https://example.com/alisaie/collections/featured" + dead_url = "https://example.com/users/alisaie/statuses/108311386746229284" + + featured_data = + "test/fixtures/mastodon/featured_collection.json" + |> File.read!() + + Tesla.Mock.mock(fn + %{ + method: :get, + url: ^featured_url + } -> + %Tesla.Env{ + status: 200, + body: featured_data, + headers: [{"content-type", "application/activity+json"}] + } + + %{ + method: :get, + url: ^dead_url + } -> + %Tesla.Env{ + status: 404, + body: "{}", + headers: [{"content-type", "application/activity+json"}] + } + end) + + {:ok, %{}} = ActivityPub.fetch_and_prepare_featured_from_ap_id(featured_url) + end + test "it fetches the appropriate tag-restricted posts" do user = insert(:user)