[#1505] Added tests, changelog entry, tweaked config settings related to replies...
authorIvan Tashkinov <ivantashkinov@gmail.com>
Sat, 8 Feb 2020 16:58:02 +0000 (19:58 +0300)
committerIvan Tashkinov <ivantashkinov@gmail.com>
Sat, 8 Feb 2020 16:58:02 +0000 (19:58 +0300)
CHANGELOG.md
config/config.exs
config/description.exs
lib/pleroma/web/activity_pub/transmogrifier.ex
lib/pleroma/workers/remote_fetcher_worker.ex
test/web/activity_pub/transmogrifier_test.exs
test/web/activity_pub/views/object_view_test.exs

index 713ae436177d8af517668805cf43438752525525..a1fbe152ade1c071c716f33106465a7a24f1611c 100644 (file)
@@ -66,6 +66,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Support for custom Elixir modules (such as MRF policies)
 - User settings: Add _This account is a_ option.
 - OAuth: admin scopes support (relevant setting: `[:auth, :enforce_oauth_admin_scope_usage]`).
+- ActivityPub: support for `replies` collection (output for outgoing federation & fetching on incoming federation).
 <details>
   <summary>API Changes</summary>
 
@@ -107,6 +108,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Configuration: `feed.logo` option for tag feed.
 - Tag feed: `/tags/:tag.rss` - list public statuses by hashtag.
 - Mastodon API: Add `reacted` property to `emoji_reactions`
+- ActivityPub: `[:activitypub, :note_replies_output_limit]` setting sets the number of note self-replies to output on outgoing federation.
 </details>
 
 ### Fixed
index 370828c1ced3145a1ad4213211cb769f298ce701..62a10ca4119753ff7668e73225a81ed6f658a91a 100644 (file)
@@ -340,6 +340,7 @@ config :pleroma, :activitypub,
   unfollow_blocked: true,
   outgoing_blocks: true,
   follow_handshake_timeout: 500,
+  note_replies_output_limit: 5,
   sign_object_fetches: true
 
 config :pleroma, :streamer,
@@ -624,10 +625,6 @@ config :pleroma, :modules, runtime_dir: "instance/modules"
 
 config :pleroma, configurable_from_database: false
 
-config :pleroma, :mastodon_compatibility,
-  # https://git.pleroma.social/pleroma/pleroma/issues/1505
-  federated_note_replies_limit: 5
-
 config :swarm, node_blacklist: [~r/myhtml_.*$/]
 # Import environment specific config. This must remain at the bottom
 # of this file so it overrides the configuration defined above.
index 909ae00d998ef3ca25679c2cdb0f5d4123935f6f..9fd52f50e70e8e1200bbd118a4a989ef9dfee4a7 100644 (file)
@@ -1790,6 +1790,12 @@ config :pleroma, :config_description, [
         type: :boolean,
         description: "Sign object fetches with HTTP signatures"
       },
+      %{
+        key: :note_replies_output_limit,
+        type: :integer,
+        description:
+          "The number of Note replies' URIs to be included with outgoing federation (`5` to match Mastodon hardcoded value, `0` to disable the output)."
+      },
       %{
         key: :follow_handshake_timeout,
         type: :integer,
@@ -3097,20 +3103,6 @@ config :pleroma, :config_description, [
       }
     ]
   },
-  %{
-    group: :pleroma,
-    key: :mastodon_compatibility,
-    type: :group,
-    description: "Mastodon compatibility-related settings.",
-    children: [
-      %{
-        key: :federated_note_replies_limit,
-        type: :integer,
-        description:
-          "The number of Note self-reply URIs to be included with outgoing federation (`5` to mimic Mastodon hardcoded value, `0` to disable)."
-      }
-    ]
-  },
   %{
     group: :pleroma,
     type: :group,
index d129334c2a075fcd37d06b5a14d8d68f323fafbe..6232367208af4db29e07854621da341297c8eb51 100644 (file)
@@ -914,7 +914,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
   Based on Mastodon's ActivityPub::NoteSerializer#replies.
   """
   def set_replies(obj) do
-    limit = Pleroma.Config.get([:mastodon_compatibility, :federated_note_replies_limit], 0)
+    limit = Pleroma.Config.get([:activitypub, :note_replies_output_limit], 0)
 
     replies_uris =
       with true <- limit > 0 || nil,
@@ -953,7 +953,13 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
   end
 
   def replies(%{"replies" => replies = %{}}) do
-    replies = with %{} <- replies["first"], do: replies["first"], else: (_ -> replies)
+    replies =
+      if is_map(replies["first"]) do
+        replies["first"]
+      else
+        replies
+      end
+
     replies["items"] || []
   end
 
index 60eafe2c1924d40ea352195a92cccf2bac89d39e..52db6059b6f277f0ab646ebefc98f47105abe346 100644 (file)
@@ -15,6 +15,6 @@ defmodule Pleroma.Workers.RemoteFetcherWorker do
         },
         _job
       ) do
-    Fetcher.fetch_object_from_id!(id)
+    {:ok, _object} = Fetcher.fetch_object_from_id(id)
   end
 end
index 194b314a311270b16cd610c9b77fe50b1e152084..729594ded69fd1b0c6b898f3e8ab317e8f10eac5 100644 (file)
@@ -1350,7 +1350,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
     end
   end
 
-  describe "handle_incoming:`replies` handling" do
+  describe "`replies` handling in handle_incoming/2" do
     setup do
       data =
         File.read!("test/fixtures/mastodon-post-activity.json")
@@ -1361,7 +1361,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
       %{data: data, items: items, collection: collection}
     end
 
-    test "it schedules background fetching of wrapped `replies` collection items", %{
+    test "with wrapped `replies` collection, it schedules background fetching of items", %{
       data: data,
       items: items,
       collection: collection
@@ -2096,8 +2096,8 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
   end
 
   describe "set_replies/1" do
-    clear_config([:mastodon_compatibility, :federated_note_replies_limit]) do
-      Pleroma.Config.put([:mastodon_compatibility, :federated_note_replies_limit], 2)
+    clear_config([:activitypub, :note_replies_output_limit]) do
+      Pleroma.Config.put([:activitypub, :note_replies_output_limit], 2)
     end
 
     test "returns unmodified object if activity doesn't have self-replies" do
@@ -2116,7 +2116,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
       {:ok, self_reply2} =
         CommonAPI.post(user, %{"status" => "self-reply 2", "in_reply_to_status_id" => id1})
 
-      # Assuming to _not_ be present in `replies` due to :federated_note_replies_limit is set to 2
+      # Assuming to _not_ be present in `replies` due to :note_replies_output_limit is set to 2
       {:ok, _} =
         CommonAPI.post(user, %{"status" => "self-reply 3", "in_reply_to_status_id" => id1})
 
index 13447dc297172731211ebd936186732b3eb43188..6784788cc2eae11fcc3b5752cfe42bb7e395c08d 100644 (file)
@@ -36,6 +36,28 @@ defmodule Pleroma.Web.ActivityPub.ObjectViewTest do
     assert result["@context"]
   end
 
+  describe "note activity's `replies` collection rendering" do
+    clear_config([:activitypub, :note_replies_output_limit]) do
+      Pleroma.Config.put([:activitypub, :note_replies_output_limit], 5)
+    end
+
+    test "renders `replies` collection for a note activity" do
+      user = insert(:user)
+      activity = insert(:note_activity, user: user)
+
+      {:ok, self_reply1} =
+        CommonAPI.post(user, %{"status" => "self-reply 1", "in_reply_to_status_id" => activity.id})
+
+      result = ObjectView.render("object.json", %{object: refresh_record(activity)})
+      replies_uris = [self_reply1.data["id"]]
+
+      assert %{
+               "type" => "Collection",
+               "first" => %{"type" => "Collection", "items" => ^replies_uris}
+             } = get_in(result, ["object", "replies"])
+    end
+  end
+
   test "renders a like activity" do
     note = insert(:note_activity)
     object = Object.normalize(note)