From b1dcc43c6dc1380fe2b441b24c46aa820b0e3e25 Mon Sep 17 00:00:00 2001 From: Hannah Ward Date: Sun, 23 Dec 2018 18:29:30 +0000 Subject: [PATCH 1/5] add check for already-seen follow notifications Ref #397 --- lib/pleroma/notification.ex | 2 +- test/notification_test.exs | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 47f6b6ee73..c9ceca6e12 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -106,7 +106,7 @@ def create_notifications(_), do: {:ok, []} # TODO move to sql, too. def create_notification(%Activity{} = activity, %User{} = user) do unless User.blocks?(user, %{ap_id: activity.data["actor"]}) or - user.ap_id == activity.data["actor"] do + user.ap_id == activity.data["actor"] or (activity.data["type"] == "Follow" and not Enum.any?(Notification.for_user(user), fn notif -> notif.activity.data["type"] == "Follow" and notif.activity.data["actor"] == activity.data["actor"] end)) do notification = %Notification{user_id: user.id, activity: activity} {:ok, notification} = Repo.insert(notification) Pleroma.Web.Streamer.stream("user", notification) diff --git a/test/notification_test.exs b/test/notification_test.exs index 3852107930..9821a2d994 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -42,6 +42,19 @@ test "it doesn't create a notification for user if he is the activity author" do assert nil == Notification.create_notification(activity, author) end + + test "it doesn't create a notification for follow-unfollow-follow chains" do + user = insert(:user) + followed_user = insert(:user) + {:ok, _, _, activity} = TwitterAPI.follow(user, %{"user_id" => followed_user.id}) + Notification.create_notification(activity, followed_user) + TwitterAPI.unfollow(user, %{"user_id" => followed_user.id}) + {:ok, _, _, activity_dupe} = TwitterAPI.follow(user, %{"user_id" => followed_user.id}) + assert nil == Notification.create_notification(activity_dupe, followed_user) + end + + + end describe "get notification" do -- GitLab From 860b5a0a7ea832a7a26e5216dc4a4771850cc103 Mon Sep 17 00:00:00 2001 From: Hannah Ward Date: Sun, 23 Dec 2018 18:32:36 +0000 Subject: [PATCH 2/5] run mix format --- lib/pleroma/notification.ex | 7 ++++++- test/notification_test.exs | 3 --- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index c9ceca6e12..240112e893 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -106,7 +106,12 @@ def create_notifications(_), do: {:ok, []} # TODO move to sql, too. def create_notification(%Activity{} = activity, %User{} = user) do unless User.blocks?(user, %{ap_id: activity.data["actor"]}) or - user.ap_id == activity.data["actor"] or (activity.data["type"] == "Follow" and not Enum.any?(Notification.for_user(user), fn notif -> notif.activity.data["type"] == "Follow" and notif.activity.data["actor"] == activity.data["actor"] end)) do + user.ap_id == activity.data["actor"] or + (activity.data["type"] == "Follow" and + not Enum.any?(Notification.for_user(user), fn notif -> + notif.activity.data["type"] == "Follow" and + notif.activity.data["actor"] == activity.data["actor"] + end)) do notification = %Notification{user_id: user.id, activity: activity} {:ok, notification} = Repo.insert(notification) Pleroma.Web.Streamer.stream("user", notification) diff --git a/test/notification_test.exs b/test/notification_test.exs index 9821a2d994..98a2746f07 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -52,9 +52,6 @@ test "it doesn't create a notification for follow-unfollow-follow chains" do {:ok, _, _, activity_dupe} = TwitterAPI.follow(user, %{"user_id" => followed_user.id}) assert nil == Notification.create_notification(activity_dupe, followed_user) end - - - end describe "get notification" do -- GitLab From 3055cbfe86f8af76795546c37ff4fbe833bab9d6 Mon Sep 17 00:00:00 2001 From: Hannah Ward Date: Sun, 23 Dec 2018 18:46:26 +0000 Subject: [PATCH 3/5] fix check for existing follow notification --- lib/pleroma/notification.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 240112e893..507c81064b 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -108,7 +108,7 @@ def create_notification(%Activity{} = activity, %User{} = user) do unless User.blocks?(user, %{ap_id: activity.data["actor"]}) or user.ap_id == activity.data["actor"] or (activity.data["type"] == "Follow" and - not Enum.any?(Notification.for_user(user), fn notif -> + Enum.any?(Notification.for_user(user), fn notif -> notif.activity.data["type"] == "Follow" and notif.activity.data["actor"] == activity.data["actor"] end)) do -- GitLab From fb0b7f7ce2b26c8ef95f95fe3f1642565938f2c1 Mon Sep 17 00:00:00 2001 From: Hannah Ward Date: Sun, 23 Dec 2018 23:47:01 +0000 Subject: [PATCH 4/5] add tests for fav/repeat duplicates --- test/notification_test.exs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/notification_test.exs b/test/notification_test.exs index 98a2746f07..59d3d0bd0b 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -52,6 +52,32 @@ test "it doesn't create a notification for follow-unfollow-follow chains" do {:ok, _, _, activity_dupe} = TwitterAPI.follow(user, %{"user_id" => followed_user.id}) assert nil == Notification.create_notification(activity_dupe, followed_user) end + + test "it doesn't create a notification for like-unlike-like chains" do + user = insert(:user) + liked_user = insert(:user) + {:ok, status} = TwitterAPI.create_status(liked_user, %{"status" => "Yui is best yuru"}) + {:ok, fav_status} = TwitterAPI.fav(user, status.id) + Notification.create_notification(fav_status, liked_user) + TwitterAPI.unfav(user, status.id) + {:ok, dupe} = TwitterAPI.fav(user, status.id) + assert nil == Notification.create_notification(dupe, liked_user) + end + + test "it doesn't create a notification for repeat-unrepeat-repeat chains" do + user = insert(:user) + retweeted_user = insert(:user) + + {:ok, status} = + TwitterAPI.create_status(retweeted_user, %{ + "status" => "Send dupe notifications to the shadow realm" + }) + + {:ok, retweeted_activity} = TwitterAPI.repeat(user, status.id) + Notification.create_notification(retweeted_activity, retweeted_user) + {:ok, dupe} = TwitterAPI.unrepeat(user, status.id) + assert nil == Notification.create_notification(dupe, retweeted_user) + end end describe "get notification" do -- GitLab From 32d8fd207f01a352a81e1788bb59ccded0c916a6 Mon Sep 17 00:00:00 2001 From: Hannah Ward Date: Sun, 23 Dec 2018 23:54:42 +0000 Subject: [PATCH 5/5] fix test for repeat-unrepeat-repeat notif --- test/notification_test.exs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/notification_test.exs b/test/notification_test.exs index 59d3d0bd0b..e3f328897e 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -75,7 +75,8 @@ test "it doesn't create a notification for repeat-unrepeat-repeat chains" do {:ok, retweeted_activity} = TwitterAPI.repeat(user, status.id) Notification.create_notification(retweeted_activity, retweeted_user) - {:ok, dupe} = TwitterAPI.unrepeat(user, status.id) + TwitterAPI.unrepeat(user, status.id) + {:ok, dupe} = TwitterAPI.repeat(user, status.id) assert nil == Notification.create_notification(dupe, retweeted_user) end end -- GitLab