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.

241 lines
7.3KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2020 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. setup do: clear_config([:instance, :limit_to_local_content])
  113. test "finds utf8 text in statuses", %{
  114. japanese_activity: japanese_activity,
  115. user: user
  116. } do
  117. activities = Activity.search(user, "更新情報")
  118. assert [^japanese_activity] = activities
  119. end
  120. test "find local and remote statuses for authenticated users", %{
  121. local_activity: local_activity,
  122. remote_activity: remote_activity,
  123. user: user
  124. } do
  125. activities = Enum.sort_by(Activity.search(user, "find me"), & &1.id)
  126. assert [^local_activity, ^remote_activity] = activities
  127. end
  128. test "find only local statuses for unauthenticated users", %{local_activity: local_activity} do
  129. assert [^local_activity] = Activity.search(nil, "find me")
  130. end
  131. test "find only local statuses for unauthenticated users when `limit_to_local_content` is `:all`",
  132. %{local_activity: local_activity} do
  133. Pleroma.Config.put([:instance, :limit_to_local_content], :all)
  134. assert [^local_activity] = Activity.search(nil, "find me")
  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. end
  145. end
  146. test "add an activity with an expiration" do
  147. activity = insert(:note_activity)
  148. insert(:expiration_in_the_future, %{activity_id: activity.id})
  149. Pleroma.ActivityExpiration
  150. |> where([a], a.activity_id == ^activity.id)
  151. |> Repo.one!()
  152. end
  153. test "all_by_ids_with_object/1" do
  154. %{id: id1} = insert(:note_activity)
  155. %{id: id2} = insert(:note_activity)
  156. activities =
  157. [id1, id2]
  158. |> Activity.all_by_ids_with_object()
  159. |> Enum.sort(&(&1.id < &2.id))
  160. assert [%{id: ^id1, object: %Object{}}, %{id: ^id2, object: %Object{}}] = activities
  161. end
  162. test "get_by_id_with_object/1" do
  163. %{id: id} = insert(:note_activity)
  164. assert %Activity{id: ^id, object: %Object{}} = Activity.get_by_id_with_object(id)
  165. end
  166. test "get_by_ap_id_with_object/1" do
  167. %{data: %{"id" => ap_id}} = insert(:note_activity)
  168. assert %Activity{data: %{"id" => ^ap_id}, object: %Object{}} =
  169. Activity.get_by_ap_id_with_object(ap_id)
  170. end
  171. test "get_by_id/1" do
  172. %{id: id} = insert(:note_activity)
  173. assert %Activity{id: ^id} = Activity.get_by_id(id)
  174. end
  175. test "all_by_actor_and_id/2" do
  176. user = insert(:user)
  177. {:ok, %{id: id1}} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofe"})
  178. {:ok, %{id: id2}} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofefe"})
  179. assert [] == Activity.all_by_actor_and_id(user, [])
  180. activities =
  181. user.ap_id
  182. |> Activity.all_by_actor_and_id([id1, id2])
  183. |> Enum.sort(&(&1.id < &2.id))
  184. assert [%Activity{id: ^id1}, %Activity{id: ^id2}] = activities
  185. end
  186. end