From d4cf273f289168c6555624717a4060e0c15b7197 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Tue, 21 Mar 2017 20:22:05 +0100 Subject: [PATCH] Add limiting to activity pub fetching. --- lib/pleroma/web/activity_pub/activity_pub.ex | 5 ++- test/support/builders/activity_builder.ex | 35 ++++++++++++-------- test/web/activity_pub/activity_pub_test.exs | 15 +++++++-- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 0317b4cd5..1f6ee4744 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -9,8 +9,11 @@ def insert(map) when is_map(map) do def fetch_public_activities do query = from activity in Activity, - where: fragment(~s(? @> '{"to": ["https://www.w3.org/ns/activitystreams#Public"]}'), activity.data) + where: fragment(~s(? @> '{"to": ["https://www.w3.org/ns/activitystreams#Public"]}'), activity.data), + limit: 20, + order_by: [desc: :inserted_at] Repo.all(query) + |> Enum.reverse end end diff --git a/test/support/builders/activity_builder.ex b/test/support/builders/activity_builder.ex index 0b7f79c5f..b44afa896 100644 --- a/test/support/builders/activity_builder.ex +++ b/test/support/builders/activity_builder.ex @@ -1,11 +1,10 @@ defmodule Pleroma.Builders.ActivityBuilder do alias Pleroma.Builders.UserBuilder alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.User - def public_and_non_public do - {:ok, user} = UserBuilder.insert - public = %{ + def build(data \\ %{}, opts \\ %{}) do + user = opts[:user] || UserBuilder.build + activity = %{ "id" => 1, "actor" => user.ap_id, "to" => ["https://www.w3.org/ns/activitystreams#Public"], @@ -14,16 +13,26 @@ def public_and_non_public do "content" => "test" } } + Map.merge(activity, data) + end - non_public = %{ - "id" => 2, - "actor" => user.ap_id, - "to" => [], - "object" => %{ - "type" => "Note", - "content" => "test" - } - } + def insert(data \\ %{}, opts \\ %{}) do + activity = build(data, opts) + ActivityPub.insert(activity) + end + + def insert_list(times, data \\ %{}, opts \\ %{}) do + Enum.map(1..times, fn (n) -> + {:ok, activity} = insert(%{"id" => n}) + activity + end) + end + + def public_and_non_public do + {:ok, user} = UserBuilder.insert + + public = build(%{"id" => 1}, %{user: user}) + non_public = build(%{"id" => 2, "to" => []}, %{user: user}) {:ok, public} = ActivityPub.insert(public) {:ok, non_public} = ActivityPub.insert(non_public) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index aa4abbec1..d640bfa2b 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -15,13 +15,24 @@ test "inserts a given map into the activity database" do end end - describe "fetch activities" do - test "retrieves all public activities" do + describe "public fetch activities" do + test "retrieves public activities" do %{public: public} = ActivityBuilder.public_and_non_public activities = ActivityPub.fetch_public_activities assert length(activities) == 1 assert Enum.at(activities, 0) == public end + + test "retrieves a maximum of 20 activities" do + activities = ActivityBuilder.insert_list(30) + last_expected = List.last(activities) + + activities = ActivityPub.fetch_public_activities + last = List.last(activities) + + assert length(activities) == 20 + assert last == last_expected + end end end