|
|
@@ -1910,4 +1910,490 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do |
|
|
|
ActivityPub.move(old_user, new_user) |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
test "doesn't retrieve replies activities with exclude_replies" do |
|
|
|
user = insert(:user) |
|
|
|
|
|
|
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "yeah"}) |
|
|
|
|
|
|
|
{:ok, _reply} = |
|
|
|
CommonAPI.post(user, %{"status" => "yeah", "in_reply_to_status_id" => activity.id}) |
|
|
|
|
|
|
|
[result] = ActivityPub.fetch_public_activities(%{"exclude_replies" => "true"}) |
|
|
|
|
|
|
|
assert result.id == activity.id |
|
|
|
|
|
|
|
assert length(ActivityPub.fetch_public_activities()) == 2 |
|
|
|
end |
|
|
|
|
|
|
|
describe "replies filtering with public messages" do |
|
|
|
setup :public_messages |
|
|
|
|
|
|
|
test "public timeline", %{users: %{u1: user}} do |
|
|
|
activities_ids = |
|
|
|
%{} |
|
|
|
|> Map.put("type", ["Create", "Announce"]) |
|
|
|
|> Map.put("local_only", false) |
|
|
|
|> Map.put("blocking_user", user) |
|
|
|
|> Map.put("muting_user", user) |
|
|
|
|> Map.put("user", user) |
|
|
|
|> ActivityPub.fetch_public_activities() |
|
|
|
|> Enum.map(& &1.id) |
|
|
|
|
|
|
|
assert length(activities_ids) == 16 |
|
|
|
end |
|
|
|
|
|
|
|
test "public timeline with reply_visibility `following`", %{ |
|
|
|
users: %{u1: user}, |
|
|
|
u1: u1, |
|
|
|
u2: u2, |
|
|
|
u3: u3, |
|
|
|
u4: u4, |
|
|
|
activities: activities |
|
|
|
} do |
|
|
|
activities_ids = |
|
|
|
%{} |
|
|
|
|> Map.put("type", ["Create", "Announce"]) |
|
|
|
|> Map.put("local_only", false) |
|
|
|
|> Map.put("blocking_user", user) |
|
|
|
|> Map.put("muting_user", user) |
|
|
|
|> Map.put("reply_visibility", "following") |
|
|
|
|> Map.put("user", user) |
|
|
|
|> ActivityPub.fetch_public_activities() |
|
|
|
|> Enum.map(& &1.id) |
|
|
|
|
|
|
|
assert length(activities_ids) == 14 |
|
|
|
|
|
|
|
visible_ids = |
|
|
|
Map.values(u1) ++ Map.values(u2) ++ Map.values(u4) ++ Map.values(activities) ++ [u3[:r1]] |
|
|
|
|
|
|
|
assert Enum.all?(visible_ids, &(&1 in activities_ids)) |
|
|
|
end |
|
|
|
|
|
|
|
test "public timeline with reply_visibility `self`", %{ |
|
|
|
users: %{u1: user}, |
|
|
|
u1: u1, |
|
|
|
u2: u2, |
|
|
|
u3: u3, |
|
|
|
u4: u4, |
|
|
|
activities: activities |
|
|
|
} do |
|
|
|
activities_ids = |
|
|
|
%{} |
|
|
|
|> Map.put("type", ["Create", "Announce"]) |
|
|
|
|> Map.put("local_only", false) |
|
|
|
|> Map.put("blocking_user", user) |
|
|
|
|> Map.put("muting_user", user) |
|
|
|
|> Map.put("reply_visibility", "self") |
|
|
|
|> Map.put("user", user) |
|
|
|
|> ActivityPub.fetch_public_activities() |
|
|
|
|> Enum.map(& &1.id) |
|
|
|
|
|
|
|
assert length(activities_ids) == 10 |
|
|
|
visible_ids = Map.values(u1) ++ [u2[:r1], u3[:r1], u4[:r1]] ++ Map.values(activities) |
|
|
|
assert Enum.all?(visible_ids, &(&1 in activities_ids)) |
|
|
|
end |
|
|
|
|
|
|
|
test "home timeline", %{ |
|
|
|
users: %{u1: user}, |
|
|
|
activities: activities, |
|
|
|
u1: u1, |
|
|
|
u2: u2, |
|
|
|
u3: u3, |
|
|
|
u4: u4 |
|
|
|
} do |
|
|
|
params = |
|
|
|
%{} |
|
|
|
|> Map.put("type", ["Create", "Announce"]) |
|
|
|
|> Map.put("blocking_user", user) |
|
|
|
|> Map.put("muting_user", user) |
|
|
|
|> Map.put("user", user) |
|
|
|
|
|
|
|
activities_ids = |
|
|
|
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) |
|
|
|
|> Enum.map(& &1.id) |
|
|
|
|
|
|
|
assert length(activities_ids) == 13 |
|
|
|
|
|
|
|
visible_ids = |
|
|
|
Map.values(u1) ++ |
|
|
|
Map.values(u3) ++ |
|
|
|
[ |
|
|
|
activities[:a1], |
|
|
|
activities[:a2], |
|
|
|
activities[:a4], |
|
|
|
u2[:r1], |
|
|
|
u2[:r3], |
|
|
|
u4[:r1], |
|
|
|
u4[:r2] |
|
|
|
] |
|
|
|
|
|
|
|
assert Enum.all?(visible_ids, &(&1 in activities_ids)) |
|
|
|
end |
|
|
|
|
|
|
|
test "home timeline with reply_visibility `following`", %{ |
|
|
|
users: %{u1: user}, |
|
|
|
activities: activities, |
|
|
|
u1: u1, |
|
|
|
u2: u2, |
|
|
|
u3: u3, |
|
|
|
u4: u4 |
|
|
|
} do |
|
|
|
params = |
|
|
|
%{} |
|
|
|
|> Map.put("type", ["Create", "Announce"]) |
|
|
|
|> Map.put("blocking_user", user) |
|
|
|
|> Map.put("muting_user", user) |
|
|
|
|> Map.put("user", user) |
|
|
|
|> Map.put("reply_visibility", "following") |
|
|
|
|
|
|
|
activities_ids = |
|
|
|
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) |
|
|
|
|> Enum.map(& &1.id) |
|
|
|
|
|
|
|
assert length(activities_ids) == 11 |
|
|
|
|
|
|
|
visible_ids = |
|
|
|
Map.values(u1) ++ |
|
|
|
[ |
|
|
|
activities[:a1], |
|
|
|
activities[:a2], |
|
|
|
activities[:a4], |
|
|
|
u2[:r1], |
|
|
|
u2[:r3], |
|
|
|
u3[:r1], |
|
|
|
u4[:r1], |
|
|
|
u4[:r2] |
|
|
|
] |
|
|
|
|
|
|
|
assert Enum.all?(visible_ids, &(&1 in activities_ids)) |
|
|
|
end |
|
|
|
|
|
|
|
test "home timeline with reply_visibility `self`", %{ |
|
|
|
users: %{u1: user}, |
|
|
|
activities: activities, |
|
|
|
u1: u1, |
|
|
|
u2: u2, |
|
|
|
u3: u3, |
|
|
|
u4: u4 |
|
|
|
} do |
|
|
|
params = |
|
|
|
%{} |
|
|
|
|> Map.put("type", ["Create", "Announce"]) |
|
|
|
|> Map.put("blocking_user", user) |
|
|
|
|> Map.put("muting_user", user) |
|
|
|
|> Map.put("user", user) |
|
|
|
|> Map.put("reply_visibility", "self") |
|
|
|
|
|
|
|
activities_ids = |
|
|
|
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) |
|
|
|
|> Enum.map(& &1.id) |
|
|
|
|
|
|
|
assert length(activities_ids) == 9 |
|
|
|
|
|
|
|
visible_ids = |
|
|
|
Map.values(u1) ++ |
|
|
|
[ |
|
|
|
activities[:a1], |
|
|
|
activities[:a2], |
|
|
|
activities[:a4], |
|
|
|
u2[:r1], |
|
|
|
u3[:r1], |
|
|
|
u4[:r1] |
|
|
|
] |
|
|
|
|
|
|
|
assert Enum.all?(visible_ids, &(&1 in activities_ids)) |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
describe "replies filtering with private messages" do |
|
|
|
setup :private_messages |
|
|
|
|
|
|
|
test "public timeline", %{users: %{u1: user}} do |
|
|
|
activities_ids = |
|
|
|
%{} |
|
|
|
|> Map.put("type", ["Create", "Announce"]) |
|
|
|
|> Map.put("local_only", false) |
|
|
|
|> Map.put("blocking_user", user) |
|
|
|
|> Map.put("muting_user", user) |
|
|
|
|> Map.put("user", user) |
|
|
|
|> ActivityPub.fetch_public_activities() |
|
|
|
|> Enum.map(& &1.id) |
|
|
|
|
|
|
|
assert activities_ids == [] |
|
|
|
end |
|
|
|
|
|
|
|
test "public timeline with default reply_visibility `following`", %{users: %{u1: user}} do |
|
|
|
activities_ids = |
|
|
|
%{} |
|
|
|
|> Map.put("type", ["Create", "Announce"]) |
|
|
|
|> Map.put("local_only", false) |
|
|
|
|> Map.put("blocking_user", user) |
|
|
|
|> Map.put("muting_user", user) |
|
|
|
|> Map.put("reply_visibility", "following") |
|
|
|
|> Map.put("user", user) |
|
|
|
|> ActivityPub.fetch_public_activities() |
|
|
|
|> Enum.map(& &1.id) |
|
|
|
|
|
|
|
assert activities_ids == [] |
|
|
|
end |
|
|
|
|
|
|
|
test "public timeline with default reply_visibility `self`", %{users: %{u1: user}} do |
|
|
|
activities_ids = |
|
|
|
%{} |
|
|
|
|> Map.put("type", ["Create", "Announce"]) |
|
|
|
|> Map.put("local_only", false) |
|
|
|
|> Map.put("blocking_user", user) |
|
|
|
|> Map.put("muting_user", user) |
|
|
|
|> Map.put("reply_visibility", "self") |
|
|
|
|> Map.put("user", user) |
|
|
|
|> ActivityPub.fetch_public_activities() |
|
|
|
|> Enum.map(& &1.id) |
|
|
|
|
|
|
|
assert activities_ids == [] |
|
|
|
end |
|
|
|
|
|
|
|
test "home timeline", %{users: %{u1: user}} do |
|
|
|
params = |
|
|
|
%{} |
|
|
|
|> Map.put("type", ["Create", "Announce"]) |
|
|
|
|> Map.put("blocking_user", user) |
|
|
|
|> Map.put("muting_user", user) |
|
|
|
|> Map.put("user", user) |
|
|
|
|
|
|
|
activities_ids = |
|
|
|
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) |
|
|
|
|> Enum.map(& &1.id) |
|
|
|
|
|
|
|
assert length(activities_ids) == 12 |
|
|
|
end |
|
|
|
|
|
|
|
test "home timeline with default reply_visibility `following`", %{users: %{u1: user}} do |
|
|
|
params = |
|
|
|
%{} |
|
|
|
|> Map.put("type", ["Create", "Announce"]) |
|
|
|
|> Map.put("blocking_user", user) |
|
|
|
|> Map.put("muting_user", user) |
|
|
|
|> Map.put("user", user) |
|
|
|
|> Map.put("reply_visibility", "following") |
|
|
|
|
|
|
|
activities_ids = |
|
|
|
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) |
|
|
|
|> Enum.map(& &1.id) |
|
|
|
|
|
|
|
assert length(activities_ids) == 12 |
|
|
|
end |
|
|
|
|
|
|
|
test "home timeline with default reply_visibility `self`", %{ |
|
|
|
users: %{u1: user}, |
|
|
|
activities: activities, |
|
|
|
u1: u1, |
|
|
|
u2: u2, |
|
|
|
u3: u3, |
|
|
|
u4: u4 |
|
|
|
} do |
|
|
|
params = |
|
|
|
%{} |
|
|
|
|> Map.put("type", ["Create", "Announce"]) |
|
|
|
|> Map.put("blocking_user", user) |
|
|
|
|> Map.put("muting_user", user) |
|
|
|
|> Map.put("user", user) |
|
|
|
|> Map.put("reply_visibility", "self") |
|
|
|
|
|
|
|
activities_ids = |
|
|
|
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) |
|
|
|
|> Enum.map(& &1.id) |
|
|
|
|
|
|
|
assert length(activities_ids) == 10 |
|
|
|
|
|
|
|
visible_ids = |
|
|
|
Map.values(u1) ++ Map.values(u4) ++ [u2[:r1], u3[:r1]] ++ Map.values(activities) |
|
|
|
|
|
|
|
assert Enum.all?(visible_ids, &(&1 in activities_ids)) |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
defp public_messages(_) do |
|
|
|
[u1, u2, u3, u4] = insert_list(4, :user) |
|
|
|
{:ok, u1} = User.follow(u1, u2) |
|
|
|
{:ok, u2} = User.follow(u2, u1) |
|
|
|
{:ok, u1} = User.follow(u1, u4) |
|
|
|
{:ok, u4} = User.follow(u4, u1) |
|
|
|
|
|
|
|
{:ok, u2} = User.follow(u2, u3) |
|
|
|
{:ok, u3} = User.follow(u3, u2) |
|
|
|
|
|
|
|
{:ok, a1} = CommonAPI.post(u1, %{"status" => "Status"}) |
|
|
|
|
|
|
|
{:ok, r1_1} = |
|
|
|
CommonAPI.post(u2, %{ |
|
|
|
"status" => "@#{u1.nickname} reply from u2 to u1", |
|
|
|
"in_reply_to_status_id" => a1.id |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, r1_2} = |
|
|
|
CommonAPI.post(u3, %{ |
|
|
|
"status" => "@#{u1.nickname} reply from u3 to u1", |
|
|
|
"in_reply_to_status_id" => a1.id |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, r1_3} = |
|
|
|
CommonAPI.post(u4, %{ |
|
|
|
"status" => "@#{u1.nickname} reply from u4 to u1", |
|
|
|
"in_reply_to_status_id" => a1.id |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, a2} = CommonAPI.post(u2, %{"status" => "Status"}) |
|
|
|
|
|
|
|
{:ok, r2_1} = |
|
|
|
CommonAPI.post(u1, %{ |
|
|
|
"status" => "@#{u2.nickname} reply from u1 to u2", |
|
|
|
"in_reply_to_status_id" => a2.id |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, r2_2} = |
|
|
|
CommonAPI.post(u3, %{ |
|
|
|
"status" => "@#{u2.nickname} reply from u3 to u2", |
|
|
|
"in_reply_to_status_id" => a2.id |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, r2_3} = |
|
|
|
CommonAPI.post(u4, %{ |
|
|
|
"status" => "@#{u2.nickname} reply from u4 to u2", |
|
|
|
"in_reply_to_status_id" => a2.id |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, a3} = CommonAPI.post(u3, %{"status" => "Status"}) |
|
|
|
|
|
|
|
{:ok, r3_1} = |
|
|
|
CommonAPI.post(u1, %{ |
|
|
|
"status" => "@#{u3.nickname} reply from u1 to u3", |
|
|
|
"in_reply_to_status_id" => a3.id |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, r3_2} = |
|
|
|
CommonAPI.post(u2, %{ |
|
|
|
"status" => "@#{u3.nickname} reply from u2 to u3", |
|
|
|
"in_reply_to_status_id" => a3.id |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, r3_3} = |
|
|
|
CommonAPI.post(u4, %{ |
|
|
|
"status" => "@#{u3.nickname} reply from u4 to u3", |
|
|
|
"in_reply_to_status_id" => a3.id |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, a4} = CommonAPI.post(u4, %{"status" => "Status"}) |
|
|
|
|
|
|
|
{:ok, r4_1} = |
|
|
|
CommonAPI.post(u1, %{ |
|
|
|
"status" => "@#{u4.nickname} reply from u1 to u4", |
|
|
|
"in_reply_to_status_id" => a4.id |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, r4_2} = |
|
|
|
CommonAPI.post(u2, %{ |
|
|
|
"status" => "@#{u4.nickname} reply from u2 to u4", |
|
|
|
"in_reply_to_status_id" => a4.id |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, r4_3} = |
|
|
|
CommonAPI.post(u3, %{ |
|
|
|
"status" => "@#{u4.nickname} reply from u3 to u4", |
|
|
|
"in_reply_to_status_id" => a4.id |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, |
|
|
|
users: %{u1: u1, u2: u2, u3: u3, u4: u4}, |
|
|
|
activities: %{a1: a1.id, a2: a2.id, a3: a3.id, a4: a4.id}, |
|
|
|
u1: %{r1: r1_1.id, r2: r1_2.id, r3: r1_3.id}, |
|
|
|
u2: %{r1: r2_1.id, r2: r2_2.id, r3: r2_3.id}, |
|
|
|
u3: %{r1: r3_1.id, r2: r3_2.id, r3: r3_3.id}, |
|
|
|
u4: %{r1: r4_1.id, r2: r4_2.id, r3: r4_3.id}} |
|
|
|
end |
|
|
|
|
|
|
|
defp private_messages(_) do |
|
|
|
[u1, u2, u3, u4] = insert_list(4, :user) |
|
|
|
{:ok, u1} = User.follow(u1, u2) |
|
|
|
{:ok, u2} = User.follow(u2, u1) |
|
|
|
{:ok, u1} = User.follow(u1, u3) |
|
|
|
{:ok, u3} = User.follow(u3, u1) |
|
|
|
{:ok, u1} = User.follow(u1, u4) |
|
|
|
{:ok, u4} = User.follow(u4, u1) |
|
|
|
|
|
|
|
{:ok, u2} = User.follow(u2, u3) |
|
|
|
{:ok, u3} = User.follow(u3, u2) |
|
|
|
|
|
|
|
{:ok, a1} = CommonAPI.post(u1, %{"status" => "Status", "visibility" => "private"}) |
|
|
|
|
|
|
|
{:ok, r1_1} = |
|
|
|
CommonAPI.post(u2, %{ |
|
|
|
"status" => "@#{u1.nickname} reply from u2 to u1", |
|
|
|
"in_reply_to_status_id" => a1.id, |
|
|
|
"visibility" => "private" |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, r1_2} = |
|
|
|
CommonAPI.post(u3, %{ |
|
|
|
"status" => "@#{u1.nickname} reply from u3 to u1", |
|
|
|
"in_reply_to_status_id" => a1.id, |
|
|
|
"visibility" => "private" |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, r1_3} = |
|
|
|
CommonAPI.post(u4, %{ |
|
|
|
"status" => "@#{u1.nickname} reply from u4 to u1", |
|
|
|
"in_reply_to_status_id" => a1.id, |
|
|
|
"visibility" => "private" |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, a2} = CommonAPI.post(u2, %{"status" => "Status", "visibility" => "private"}) |
|
|
|
|
|
|
|
{:ok, r2_1} = |
|
|
|
CommonAPI.post(u1, %{ |
|
|
|
"status" => "@#{u2.nickname} reply from u1 to u2", |
|
|
|
"in_reply_to_status_id" => a2.id, |
|
|
|
"visibility" => "private" |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, r2_2} = |
|
|
|
CommonAPI.post(u3, %{ |
|
|
|
"status" => "@#{u2.nickname} reply from u3 to u2", |
|
|
|
"in_reply_to_status_id" => a2.id, |
|
|
|
"visibility" => "private" |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, a3} = CommonAPI.post(u3, %{"status" => "Status", "visibility" => "private"}) |
|
|
|
|
|
|
|
{:ok, r3_1} = |
|
|
|
CommonAPI.post(u1, %{ |
|
|
|
"status" => "@#{u3.nickname} reply from u1 to u3", |
|
|
|
"in_reply_to_status_id" => a3.id, |
|
|
|
"visibility" => "private" |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, r3_2} = |
|
|
|
CommonAPI.post(u2, %{ |
|
|
|
"status" => "@#{u3.nickname} reply from u2 to u3", |
|
|
|
"in_reply_to_status_id" => a3.id, |
|
|
|
"visibility" => "private" |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, a4} = CommonAPI.post(u4, %{"status" => "Status", "visibility" => "private"}) |
|
|
|
|
|
|
|
{:ok, r4_1} = |
|
|
|
CommonAPI.post(u1, %{ |
|
|
|
"status" => "@#{u4.nickname} reply from u1 to u4", |
|
|
|
"in_reply_to_status_id" => a4.id, |
|
|
|
"visibility" => "private" |
|
|
|
}) |
|
|
|
|
|
|
|
{:ok, |
|
|
|
users: %{u1: u1, u2: u2, u3: u3, u4: u4}, |
|
|
|
activities: %{a1: a1.id, a2: a2.id, a3: a3.id, a4: a4.id}, |
|
|
|
u1: %{r1: r1_1.id, r2: r1_2.id, r3: r1_3.id}, |
|
|
|
u2: %{r1: r2_1.id, r2: r2_2.id}, |
|
|
|
u3: %{r1: r3_1.id, r2: r3_2.id}, |
|
|
|
u4: %{r1: r4_1.id}} |
|
|
|
end |
|
|
|
end |