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.VisibilityTest do
6 use Pleroma.DataCase, async: true
10 alias Pleroma.Web.ActivityPub.Visibility
11 alias Pleroma.Web.CommonAPI
12 import Pleroma.Factory
16 mentioned = insert(:user)
17 following = insert(:user)
18 unrelated = insert(:user)
19 {:ok, following, user} = Pleroma.User.follow(following, user)
20 {:ok, list} = Pleroma.List.create("foo", user)
22 Pleroma.List.follow(list, unrelated)
25 CommonAPI.post(user, %{status: "@#{mentioned.nickname}", visibility: "public"})
28 CommonAPI.post(user, %{status: "@#{mentioned.nickname}", visibility: "private"})
31 CommonAPI.post(user, %{status: "@#{mentioned.nickname}", visibility: "direct"})
34 CommonAPI.post(user, %{status: "@#{mentioned.nickname}", visibility: "unlisted"})
37 CommonAPI.post(user, %{
38 status: "@#{mentioned.nickname}",
39 visibility: "list:#{list.id}"
62 assert Visibility.direct?(direct)
63 refute Visibility.direct?(public)
64 refute Visibility.direct?(private)
65 refute Visibility.direct?(unlisted)
66 assert Visibility.direct?(list)
76 refute Visibility.public?(direct)
77 assert Visibility.public?(public)
78 refute Visibility.public?(private)
79 assert Visibility.public?(unlisted)
80 refute Visibility.public?(list)
90 refute Visibility.private?(direct)
91 refute Visibility.private?(public)
92 assert Visibility.private?(private)
93 refute Visibility.private?(unlisted)
94 refute Visibility.private?(list)
104 refute Visibility.list?(direct)
105 refute Visibility.list?(public)
106 refute Visibility.list?(private)
107 refute Visibility.list?(unlisted)
108 assert Visibility.list?(list)
111 test "visible_for_user? Activity", %{
117 mentioned: mentioned,
118 following: following,
119 unrelated: unrelated,
122 # All visible to author
124 assert Visibility.visible_for_user?(public, user)
125 assert Visibility.visible_for_user?(private, user)
126 assert Visibility.visible_for_user?(unlisted, user)
127 assert Visibility.visible_for_user?(direct, user)
128 assert Visibility.visible_for_user?(list, user)
130 # All visible to a mentioned user
132 assert Visibility.visible_for_user?(public, mentioned)
133 assert Visibility.visible_for_user?(private, mentioned)
134 assert Visibility.visible_for_user?(unlisted, mentioned)
135 assert Visibility.visible_for_user?(direct, mentioned)
136 assert Visibility.visible_for_user?(list, mentioned)
138 # DM not visible for just follower
140 assert Visibility.visible_for_user?(public, following)
141 assert Visibility.visible_for_user?(private, following)
142 assert Visibility.visible_for_user?(unlisted, following)
143 refute Visibility.visible_for_user?(direct, following)
144 refute Visibility.visible_for_user?(list, following)
146 # Public and unlisted visible for unrelated user
148 assert Visibility.visible_for_user?(public, unrelated)
149 assert Visibility.visible_for_user?(unlisted, unrelated)
150 refute Visibility.visible_for_user?(private, unrelated)
151 refute Visibility.visible_for_user?(direct, unrelated)
153 # Public and unlisted visible for unauthenticated
155 assert Visibility.visible_for_user?(public, nil)
156 assert Visibility.visible_for_user?(unlisted, nil)
157 refute Visibility.visible_for_user?(private, nil)
158 refute Visibility.visible_for_user?(direct, nil)
160 # Visible for a list member
161 assert Visibility.visible_for_user?(list, unrelated)
164 test "visible_for_user? Object", %{
170 mentioned: mentioned,
171 following: following,
172 unrelated: unrelated,
175 public = Object.normalize(public)
176 private = Object.normalize(private)
177 unlisted = Object.normalize(unlisted)
178 direct = Object.normalize(direct)
179 list = Object.normalize(list)
181 # All visible to author
183 assert Visibility.visible_for_user?(public, user)
184 assert Visibility.visible_for_user?(private, user)
185 assert Visibility.visible_for_user?(unlisted, user)
186 assert Visibility.visible_for_user?(direct, user)
187 assert Visibility.visible_for_user?(list, user)
189 # All visible to a mentioned user
191 assert Visibility.visible_for_user?(public, mentioned)
192 assert Visibility.visible_for_user?(private, mentioned)
193 assert Visibility.visible_for_user?(unlisted, mentioned)
194 assert Visibility.visible_for_user?(direct, mentioned)
195 assert Visibility.visible_for_user?(list, mentioned)
197 # DM not visible for just follower
199 assert Visibility.visible_for_user?(public, following)
200 assert Visibility.visible_for_user?(private, following)
201 assert Visibility.visible_for_user?(unlisted, following)
202 refute Visibility.visible_for_user?(direct, following)
203 refute Visibility.visible_for_user?(list, following)
205 # Public and unlisted visible for unrelated user
207 assert Visibility.visible_for_user?(public, unrelated)
208 assert Visibility.visible_for_user?(unlisted, unrelated)
209 refute Visibility.visible_for_user?(private, unrelated)
210 refute Visibility.visible_for_user?(direct, unrelated)
212 # Public and unlisted visible for unauthenticated
214 assert Visibility.visible_for_user?(public, nil)
215 assert Visibility.visible_for_user?(unlisted, nil)
216 refute Visibility.visible_for_user?(private, nil)
217 refute Visibility.visible_for_user?(direct, nil)
219 # Visible for a list member
220 # assert Visibility.visible_for_user?(list, unrelated)
223 test "doesn't die when the user doesn't exist",
229 Pleroma.User.invalidate_cache(user)
230 refute Visibility.private?(direct)
233 test "get_visibility", %{
240 assert Visibility.get_visibility(public) == "public"
241 assert Visibility.get_visibility(private) == "private"
242 assert Visibility.get_visibility(direct) == "direct"
243 assert Visibility.get_visibility(unlisted) == "unlisted"
244 assert Visibility.get_visibility(list) == "list"
247 test "get_visibility with directMessage flag" do
248 assert Visibility.get_visibility(%{data: %{"directMessage" => true}}) == "direct"
251 test "get_visibility with listMessage flag" do
252 assert Visibility.get_visibility(%{data: %{"listMessage" => ""}}) == "list"
255 describe "entire_thread_visible_for_user?/2" do
256 test "returns false if not found activity", %{user: user} do
257 refute Visibility.entire_thread_visible_for_user?(%Activity{}, user)
260 test "returns true if activity hasn't 'Create' type", %{user: user} do
261 activity = insert(:like_activity)
262 assert Visibility.entire_thread_visible_for_user?(activity, user)
265 test "returns false when invalid recipients", %{user: user} do
266 author = insert(:user)
269 insert(:note_activity,
273 data: %{"to" => ["test-user"]}
277 refute Visibility.entire_thread_visible_for_user?(activity, user)
280 test "returns true if user following to author" do
281 author = insert(:user)
283 Pleroma.User.follow(user, author)
286 insert(:note_activity,
290 data: %{"to" => [user.ap_id]}
294 assert Visibility.entire_thread_visible_for_user?(activity, user)