logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

visibility_test.exs (8860B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.ActivityPub.VisibilityTest do
  5. use Pleroma.DataCase, async: true
  6. alias Pleroma.Activity
  7. alias Pleroma.Object
  8. alias Pleroma.Web.ActivityPub.Visibility
  9. alias Pleroma.Web.CommonAPI
  10. import Pleroma.Factory
  11. setup do
  12. user = insert(:user)
  13. mentioned = insert(:user)
  14. following = insert(:user)
  15. unrelated = insert(:user)
  16. {:ok, following, user} = Pleroma.User.follow(following, user)
  17. {:ok, list} = Pleroma.List.create("foo", user)
  18. Pleroma.List.follow(list, unrelated)
  19. {:ok, public} =
  20. CommonAPI.post(user, %{status: "@#{mentioned.nickname}", visibility: "public"})
  21. {:ok, private} =
  22. CommonAPI.post(user, %{status: "@#{mentioned.nickname}", visibility: "private"})
  23. {:ok, direct} =
  24. CommonAPI.post(user, %{status: "@#{mentioned.nickname}", visibility: "direct"})
  25. {:ok, unlisted} =
  26. CommonAPI.post(user, %{status: "@#{mentioned.nickname}", visibility: "unlisted"})
  27. {:ok, list} =
  28. CommonAPI.post(user, %{
  29. status: "@#{mentioned.nickname}",
  30. visibility: "list:#{list.id}"
  31. })
  32. %{
  33. public: public,
  34. private: private,
  35. direct: direct,
  36. unlisted: unlisted,
  37. user: user,
  38. mentioned: mentioned,
  39. following: following,
  40. unrelated: unrelated,
  41. list: list
  42. }
  43. end
  44. test "direct?", %{
  45. public: public,
  46. private: private,
  47. direct: direct,
  48. unlisted: unlisted,
  49. list: list
  50. } do
  51. assert Visibility.direct?(direct)
  52. refute Visibility.direct?(public)
  53. refute Visibility.direct?(private)
  54. refute Visibility.direct?(unlisted)
  55. assert Visibility.direct?(list)
  56. end
  57. test "public?", %{
  58. public: public,
  59. private: private,
  60. direct: direct,
  61. unlisted: unlisted,
  62. list: list
  63. } do
  64. refute Visibility.public?(direct)
  65. assert Visibility.public?(public)
  66. refute Visibility.public?(private)
  67. assert Visibility.public?(unlisted)
  68. refute Visibility.public?(list)
  69. end
  70. test "private?", %{
  71. public: public,
  72. private: private,
  73. direct: direct,
  74. unlisted: unlisted,
  75. list: list
  76. } do
  77. refute Visibility.private?(direct)
  78. refute Visibility.private?(public)
  79. assert Visibility.private?(private)
  80. refute Visibility.private?(unlisted)
  81. refute Visibility.private?(list)
  82. end
  83. test "list?", %{
  84. public: public,
  85. private: private,
  86. direct: direct,
  87. unlisted: unlisted,
  88. list: list
  89. } do
  90. refute Visibility.list?(direct)
  91. refute Visibility.list?(public)
  92. refute Visibility.list?(private)
  93. refute Visibility.list?(unlisted)
  94. assert Visibility.list?(list)
  95. end
  96. test "visible_for_user? Activity", %{
  97. public: public,
  98. private: private,
  99. direct: direct,
  100. unlisted: unlisted,
  101. user: user,
  102. mentioned: mentioned,
  103. following: following,
  104. unrelated: unrelated,
  105. list: list
  106. } do
  107. # All visible to author
  108. assert Visibility.visible_for_user?(public, user)
  109. assert Visibility.visible_for_user?(private, user)
  110. assert Visibility.visible_for_user?(unlisted, user)
  111. assert Visibility.visible_for_user?(direct, user)
  112. assert Visibility.visible_for_user?(list, user)
  113. # All visible to a mentioned user
  114. assert Visibility.visible_for_user?(public, mentioned)
  115. assert Visibility.visible_for_user?(private, mentioned)
  116. assert Visibility.visible_for_user?(unlisted, mentioned)
  117. assert Visibility.visible_for_user?(direct, mentioned)
  118. assert Visibility.visible_for_user?(list, mentioned)
  119. # DM not visible for just follower
  120. assert Visibility.visible_for_user?(public, following)
  121. assert Visibility.visible_for_user?(private, following)
  122. assert Visibility.visible_for_user?(unlisted, following)
  123. refute Visibility.visible_for_user?(direct, following)
  124. refute Visibility.visible_for_user?(list, following)
  125. # Public and unlisted visible for unrelated user
  126. assert Visibility.visible_for_user?(public, unrelated)
  127. assert Visibility.visible_for_user?(unlisted, unrelated)
  128. refute Visibility.visible_for_user?(private, unrelated)
  129. refute Visibility.visible_for_user?(direct, unrelated)
  130. # Public and unlisted visible for unauthenticated
  131. assert Visibility.visible_for_user?(public, nil)
  132. assert Visibility.visible_for_user?(unlisted, nil)
  133. refute Visibility.visible_for_user?(private, nil)
  134. refute Visibility.visible_for_user?(direct, nil)
  135. # Visible for a list member
  136. assert Visibility.visible_for_user?(list, unrelated)
  137. end
  138. test "visible_for_user? Object", %{
  139. public: public,
  140. private: private,
  141. direct: direct,
  142. unlisted: unlisted,
  143. user: user,
  144. mentioned: mentioned,
  145. following: following,
  146. unrelated: unrelated,
  147. list: list
  148. } do
  149. public = Object.normalize(public)
  150. private = Object.normalize(private)
  151. unlisted = Object.normalize(unlisted)
  152. direct = Object.normalize(direct)
  153. list = Object.normalize(list)
  154. # All visible to author
  155. assert Visibility.visible_for_user?(public, user)
  156. assert Visibility.visible_for_user?(private, user)
  157. assert Visibility.visible_for_user?(unlisted, user)
  158. assert Visibility.visible_for_user?(direct, user)
  159. assert Visibility.visible_for_user?(list, user)
  160. # All visible to a mentioned user
  161. assert Visibility.visible_for_user?(public, mentioned)
  162. assert Visibility.visible_for_user?(private, mentioned)
  163. assert Visibility.visible_for_user?(unlisted, mentioned)
  164. assert Visibility.visible_for_user?(direct, mentioned)
  165. assert Visibility.visible_for_user?(list, mentioned)
  166. # DM not visible for just follower
  167. assert Visibility.visible_for_user?(public, following)
  168. assert Visibility.visible_for_user?(private, following)
  169. assert Visibility.visible_for_user?(unlisted, following)
  170. refute Visibility.visible_for_user?(direct, following)
  171. refute Visibility.visible_for_user?(list, following)
  172. # Public and unlisted visible for unrelated user
  173. assert Visibility.visible_for_user?(public, unrelated)
  174. assert Visibility.visible_for_user?(unlisted, unrelated)
  175. refute Visibility.visible_for_user?(private, unrelated)
  176. refute Visibility.visible_for_user?(direct, unrelated)
  177. # Public and unlisted visible for unauthenticated
  178. assert Visibility.visible_for_user?(public, nil)
  179. assert Visibility.visible_for_user?(unlisted, nil)
  180. refute Visibility.visible_for_user?(private, nil)
  181. refute Visibility.visible_for_user?(direct, nil)
  182. # Visible for a list member
  183. # assert Visibility.visible_for_user?(list, unrelated)
  184. end
  185. test "doesn't die when the user doesn't exist",
  186. %{
  187. direct: direct,
  188. user: user
  189. } do
  190. Repo.delete(user)
  191. Pleroma.User.invalidate_cache(user)
  192. refute Visibility.private?(direct)
  193. end
  194. test "get_visibility", %{
  195. public: public,
  196. private: private,
  197. direct: direct,
  198. unlisted: unlisted,
  199. list: list
  200. } do
  201. assert Visibility.get_visibility(public) == "public"
  202. assert Visibility.get_visibility(private) == "private"
  203. assert Visibility.get_visibility(direct) == "direct"
  204. assert Visibility.get_visibility(unlisted) == "unlisted"
  205. assert Visibility.get_visibility(list) == "list"
  206. end
  207. test "get_visibility with directMessage flag" do
  208. assert Visibility.get_visibility(%{data: %{"directMessage" => true}}) == "direct"
  209. end
  210. test "get_visibility with listMessage flag" do
  211. assert Visibility.get_visibility(%{data: %{"listMessage" => ""}}) == "list"
  212. end
  213. describe "entire_thread_visible_for_user?/2" do
  214. test "returns false if not found activity", %{user: user} do
  215. refute Visibility.entire_thread_visible_for_user?(%Activity{}, user)
  216. end
  217. test "returns true if activity hasn't 'Create' type", %{user: user} do
  218. activity = insert(:like_activity)
  219. assert Visibility.entire_thread_visible_for_user?(activity, user)
  220. end
  221. test "returns false when invalid recipients", %{user: user} do
  222. author = insert(:user)
  223. activity =
  224. insert(:note_activity,
  225. note:
  226. insert(:note,
  227. user: author,
  228. data: %{"to" => ["test-user"]}
  229. )
  230. )
  231. refute Visibility.entire_thread_visible_for_user?(activity, user)
  232. end
  233. test "returns true if user following to author" do
  234. author = insert(:user)
  235. user = insert(:user)
  236. Pleroma.User.follow(user, author)
  237. activity =
  238. insert(:note_activity,
  239. note:
  240. insert(:note,
  241. user: author,
  242. data: %{"to" => [user.ap_id]}
  243. )
  244. )
  245. assert Visibility.entire_thread_visible_for_user?(activity, user)
  246. end
  247. end
  248. end