Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

242 lines
7.4KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.ActivityTest do
  5. use Pleroma.DataCase
  6. alias Pleroma.Activity
  7. alias Pleroma.Bookmark
  8. alias Pleroma.Object
  9. alias Pleroma.Tests.ObanHelpers
  10. alias Pleroma.ThreadMute
  11. import Pleroma.Factory
  12. test "returns an activity by it's AP id" do
  13. activity = insert(:note_activity)
  14. found_activity = Activity.get_by_ap_id(activity.data["id"])
  15. assert activity == found_activity
  16. end
  17. test "returns activities by it's objects AP ids" do
  18. activity = insert(:note_activity)
  19. object_data = Object.normalize(activity).data
  20. [found_activity] = Activity.get_all_create_by_object_ap_id(object_data["id"])
  21. assert activity == found_activity
  22. end
  23. test "returns the activity that created an object" do
  24. activity = insert(:note_activity)
  25. object_data = Object.normalize(activity).data
  26. found_activity = Activity.get_create_by_object_ap_id(object_data["id"])
  27. assert activity == found_activity
  28. end
  29. test "preloading a bookmark" do
  30. user = insert(:user)
  31. user2 = insert(:user)
  32. user3 = insert(:user)
  33. activity = insert(:note_activity)
  34. {:ok, _bookmark} = Bookmark.create(user.id, activity.id)
  35. {:ok, _bookmark2} = Bookmark.create(user2.id, activity.id)
  36. {:ok, bookmark3} = Bookmark.create(user3.id, activity.id)
  37. queried_activity =
  38. Ecto.Query.from(Pleroma.Activity)
  39. |> Activity.with_preloaded_bookmark(user3)
  40. |> Repo.one()
  41. assert queried_activity.bookmark == bookmark3
  42. end
  43. test "setting thread_muted?" do
  44. activity = insert(:note_activity)
  45. user = insert(:user)
  46. annoyed_user = insert(:user)
  47. {:ok, _} = ThreadMute.add_mute(annoyed_user.id, activity.data["context"])
  48. activity_with_unset_thread_muted_field =
  49. Ecto.Query.from(Activity)
  50. |> Repo.one()
  51. activity_for_user =
  52. Ecto.Query.from(Activity)
  53. |> Activity.with_set_thread_muted_field(user)
  54. |> Repo.one()
  55. activity_for_annoyed_user =
  56. Ecto.Query.from(Activity)
  57. |> Activity.with_set_thread_muted_field(annoyed_user)
  58. |> Repo.one()
  59. assert activity_with_unset_thread_muted_field.thread_muted? == nil
  60. assert activity_for_user.thread_muted? == false
  61. assert activity_for_annoyed_user.thread_muted? == true
  62. end
  63. describe "getting a bookmark" do
  64. test "when association is loaded" do
  65. user = insert(:user)
  66. activity = insert(:note_activity)
  67. {:ok, bookmark} = Bookmark.create(user.id, activity.id)
  68. queried_activity =
  69. Ecto.Query.from(Pleroma.Activity)
  70. |> Activity.with_preloaded_bookmark(user)
  71. |> Repo.one()
  72. assert Activity.get_bookmark(queried_activity, user) == bookmark
  73. end
  74. test "when association is not loaded" do
  75. user = insert(:user)
  76. activity = insert(:note_activity)
  77. {:ok, bookmark} = Bookmark.create(user.id, activity.id)
  78. queried_activity =
  79. Ecto.Query.from(Pleroma.Activity)
  80. |> Repo.one()
  81. assert Activity.get_bookmark(queried_activity, user) == bookmark
  82. end
  83. end
  84. describe "search" do
  85. setup do
  86. Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
  87. user = insert(:user)
  88. params = %{
  89. "@context" => "https://www.w3.org/ns/activitystreams",
  90. "actor" => "http://mastodon.example.org/users/admin",
  91. "type" => "Create",
  92. "id" => "http://mastodon.example.org/users/admin/activities/1",
  93. "object" => %{
  94. "type" => "Note",
  95. "content" => "find me!",
  96. "id" => "http://mastodon.example.org/users/admin/objects/1",
  97. "attributedTo" => "http://mastodon.example.org/users/admin"
  98. },
  99. "to" => ["https://www.w3.org/ns/activitystreams#Public"]
  100. }
  101. {:ok, local_activity} = Pleroma.Web.CommonAPI.post(user, %{"status" => "find me!"})
  102. {:ok, japanese_activity} = Pleroma.Web.CommonAPI.post(user, %{"status" => "更新情報"})
  103. {:ok, job} = Pleroma.Web.Federator.incoming_ap_doc(params)
  104. {:ok, remote_activity} = ObanHelpers.perform(job)
  105. %{
  106. japanese_activity: japanese_activity,
  107. local_activity: local_activity,
  108. remote_activity: remote_activity,
  109. user: user
  110. }
  111. end
  112. test "finds utf8 text in statuses", %{
  113. japanese_activity: japanese_activity,
  114. user: user
  115. } do
  116. activities = Activity.search(user, "更新情報")
  117. assert [^japanese_activity] = activities
  118. end
  119. test "find local and remote statuses for authenticated users", %{
  120. local_activity: local_activity,
  121. remote_activity: remote_activity,
  122. user: user
  123. } do
  124. activities = Enum.sort_by(Activity.search(user, "find me"), & &1.id)
  125. assert [^local_activity, ^remote_activity] = activities
  126. end
  127. test "find only local statuses for unauthenticated users", %{local_activity: local_activity} do
  128. assert [^local_activity] = Activity.search(nil, "find me")
  129. end
  130. test "find only local statuses for unauthenticated users when `limit_to_local_content` is `:all`",
  131. %{local_activity: local_activity} do
  132. Pleroma.Config.put([:instance, :limit_to_local_content], :all)
  133. assert [^local_activity] = Activity.search(nil, "find me")
  134. Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
  135. end
  136. test "find all statuses for unauthenticated users when `limit_to_local_content` is `false`",
  137. %{
  138. local_activity: local_activity,
  139. remote_activity: remote_activity
  140. } do
  141. Pleroma.Config.put([:instance, :limit_to_local_content], false)
  142. activities = Enum.sort_by(Activity.search(nil, "find me"), & &1.id)
  143. assert [^local_activity, ^remote_activity] = activities
  144. Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
  145. end
  146. end
  147. test "add an activity with an expiration" do
  148. activity = insert(:note_activity)
  149. insert(:expiration_in_the_future, %{activity_id: activity.id})
  150. Pleroma.ActivityExpiration
  151. |> where([a], a.activity_id == ^activity.id)
  152. |> Repo.one!()
  153. end
  154. test "all_by_ids_with_object/1" do
  155. %{id: id1} = insert(:note_activity)
  156. %{id: id2} = insert(:note_activity)
  157. activities =
  158. [id1, id2]
  159. |> Activity.all_by_ids_with_object()
  160. |> Enum.sort(&(&1.id < &2.id))
  161. assert [%{id: ^id1, object: %Object{}}, %{id: ^id2, object: %Object{}}] = activities
  162. end
  163. test "get_by_id_with_object/1" do
  164. %{id: id} = insert(:note_activity)
  165. assert %Activity{id: ^id, object: %Object{}} = Activity.get_by_id_with_object(id)
  166. end
  167. test "get_by_ap_id_with_object/1" do
  168. %{data: %{"id" => ap_id}} = insert(:note_activity)
  169. assert %Activity{data: %{"id" => ^ap_id}, object: %Object{}} =
  170. Activity.get_by_ap_id_with_object(ap_id)
  171. end
  172. test "get_by_id/1" do
  173. %{id: id} = insert(:note_activity)
  174. assert %Activity{id: ^id} = Activity.get_by_id(id)
  175. end
  176. test "all_by_actor_and_id/2" do
  177. user = insert(:user)
  178. {:ok, %{id: id1}} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofe"})
  179. {:ok, %{id: id2}} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofefe"})
  180. assert [] == Activity.all_by_actor_and_id(user, [])
  181. activities =
  182. user.ap_id
  183. |> Activity.all_by_actor_and_id([id1, id2])
  184. |> Enum.sort(&(&1.id < &2.id))
  185. assert [%Activity{id: ^id1}, %Activity{id: ^id2}] = activities
  186. end
  187. end