1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.ActivityPub.MRF.ForceMentionsInContentTest do
7 require Pleroma.Constants
9 alias Pleroma.Constants
11 alias Pleroma.Web.ActivityPub.MRF
12 alias Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent
13 alias Pleroma.Web.CommonAPI
15 import Pleroma.Factory
17 test "adds mentions to post content" do
18 [lain, coolboymew, dielan, hakui, fence] = [
19 insert(:user, ap_id: "https://lain.com/users/lain", nickname: "lain@lain.com", local: false),
21 ap_id: "https://shitposter.club/users/coolboymew",
22 nickname: "coolboymew@shitposter.club",
26 ap_id: "https://shitposter.club/users/dielan",
27 nickname: "dielan@shitposter.club",
31 ap_id: "https://tuusin.misono-ya.info/users/hakui",
32 nickname: "hakui@tuusin.misono-ya.info",
36 ap_id: "https://xyzzy.link/users/fence",
37 nickname: "fence@xyzzy.link",
42 object = File.read!("test/fixtures/soapbox_no_mentions_in_content.json") |> Jason.decode!()
46 "actor" => "https://gleasonator.com/users/alex",
50 {:ok, %{"object" => %{"content" => filtered}}} = ForceMentionsInContent.filter(activity)
53 "<p><span class=\"recipients-inline\"><span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{dielan.id}\" href=\"https://shitposter.club/users/dielan\" rel=\"ugc\">@<span>dielan</span></a></span> <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{coolboymew.id}\" href=\"https://shitposter.club/users/coolboymew\" rel=\"ugc\">@<span>coolboymew</span></a></span> <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{fence.id}\" href=\"https://xyzzy.link/users/fence\" rel=\"ugc\">@<span>fence</span></a></span> <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{hakui.id}\" href=\"https://tuusin.misono-ya.info/users/hakui\" rel=\"ugc\">@<span>hakui</span></a></span> <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{lain.id}\" href=\"https://lain.com/users/lain\" rel=\"ugc\">@<span>lain</span></a></span> </span>Haha yeah, you can control who you reply to.</p>"
56 test "the replied-to user is sorted to the left" do
57 [mario, luigi, wario] = [
58 insert(:user, nickname: "mario"),
59 insert(:user, nickname: "luigi"),
60 insert(:user, nickname: "wario")
63 {:ok, post1} = CommonAPI.post(mario, %{status: "Letsa go!"})
66 CommonAPI.post(luigi, %{status: "Oh yaah", in_reply_to_id: post1.id, to: [mario.ap_id]})
70 "actor" => wario.ap_id,
73 "actor" => wario.ap_id,
74 "content" => "WHA-HA!",
80 "inReplyTo" => Object.normalize(post2).data["id"]
84 {:ok, %{"object" => %{"content" => filtered}}} = ForceMentionsInContent.filter(activity)
87 "<span class=\"recipients-inline\"><span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{luigi.id}\" href=\"#{luigi.ap_id}\" rel=\"ugc\">@<span>luigi</span></a></span> <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{mario.id}\" href=\"#{mario.ap_id}\" rel=\"ugc\">@<span>mario</span></a></span> </span>WHA-HA!"
90 test "don't mention self" do
91 mario = insert(:user, nickname: "mario")
93 {:ok, post} = CommonAPI.post(mario, %{status: "Mama mia"})
97 "actor" => mario.ap_id,
100 "actor" => mario.ap_id,
101 "content" => "I'ma tired...",
104 Constants.as_public()
106 "inReplyTo" => Object.normalize(post).data["id"]
110 {:ok, %{"object" => %{"content" => filtered}}} = ForceMentionsInContent.filter(activity)
111 assert filtered == "I'ma tired..."
114 test "don't mention in top-level posts" do
115 mario = insert(:user, nickname: "mario")
116 luigi = insert(:user, nickname: "luigi")
118 {:ok, post} = CommonAPI.post(mario, %{status: "Letsa go"})
122 "actor" => mario.ap_id,
125 "actor" => mario.ap_id,
126 "content" => "Mama mia!",
129 Constants.as_public()
131 "quoteUrl" => Object.normalize(post).data["id"]
135 {:ok, %{"object" => %{"content" => filtered}}} = ForceMentionsInContent.filter(activity)
136 assert filtered == "Mama mia!"
139 test "with markdown formatting" do
140 mario = insert(:user, nickname: "mario")
141 luigi = insert(:user, nickname: "luigi")
143 {:ok, post} = CommonAPI.post(luigi, %{status: "Mama mia"})
147 "actor" => mario.ap_id,
150 "actor" => mario.ap_id,
151 "content" => "<p>I'ma tired...</p>",
154 Constants.as_public()
156 "inReplyTo" => Object.normalize(post).data["id"]
160 {:ok, %{"object" => %{"content" => filtered}}} = ForceMentionsInContent.filter(activity)
163 "<p><span class=\"recipients-inline\"><span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{luigi.id}\" href=\"#{luigi.ap_id}\" rel=\"ugc\">@<span>luigi</span></a></span> </span>I'ma tired...</p>"
166 test "aware of history" do
167 mario = insert(:user, nickname: "mario")
168 wario = insert(:user, nickname: "wario")
170 {:ok, post1} = CommonAPI.post(mario, %{status: "Letsa go!"})
174 "actor" => wario.ap_id,
177 "actor" => wario.ap_id,
178 "content" => "WHA-HA!",
181 Constants.as_public()
183 "inReplyTo" => post1.object.data["id"],
184 "formerRepresentations" => %{
188 "actor" => wario.ap_id,
189 "content" => "WHA-HA!",
192 Constants.as_public()
194 "inReplyTo" => post1.object.data["id"]
202 "<span class=\"recipients-inline\"><span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{mario.id}\" href=\"#{mario.ap_id}\" rel=\"ugc\">@<span>mario</span></a></span> </span>WHA-HA!"
207 "content" => ^expected,
208 "formerRepresentations" => %{"orderedItems" => [%{"content" => ^expected}]}
210 }} = MRF.filter_one(ForceMentionsInContent, activity)
213 test "works with Updates" do
214 mario = insert(:user, nickname: "mario")
215 wario = insert(:user, nickname: "wario")
217 {:ok, post1} = CommonAPI.post(mario, %{status: "Letsa go!"})
221 "actor" => wario.ap_id,
224 "actor" => wario.ap_id,
225 "content" => "WHA-HA!",
228 Constants.as_public()
230 "inReplyTo" => post1.object.data["id"],
231 "formerRepresentations" => %{
235 "actor" => wario.ap_id,
236 "content" => "WHA-HA!",
239 Constants.as_public()
241 "inReplyTo" => post1.object.data["id"]
249 "<span class=\"recipients-inline\"><span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{mario.id}\" href=\"#{mario.ap_id}\" rel=\"ugc\">@<span>mario</span></a></span> </span>WHA-HA!"
254 "content" => ^expected,
255 "formerRepresentations" => %{"orderedItems" => [%{"content" => ^expected}]}
257 }} = MRF.filter_one(ForceMentionsInContent, activity)