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.

226 lines
7.0KB

  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, job} = Pleroma.Web.Federator.incoming_ap_doc(params)
  103. {:ok, remote_activity} = ObanHelpers.perform(job)
  104. %{local_activity: local_activity, remote_activity: remote_activity, user: user}
  105. end
  106. test "find local and remote statuses for authenticated users", %{
  107. local_activity: local_activity,
  108. remote_activity: remote_activity,
  109. user: user
  110. } do
  111. activities = Enum.sort_by(Activity.search(user, "find me"), & &1.id)
  112. assert [^local_activity, ^remote_activity] = activities
  113. end
  114. test "find only local statuses for unauthenticated users", %{local_activity: local_activity} do
  115. assert [^local_activity] = Activity.search(nil, "find me")
  116. end
  117. test "find only local statuses for unauthenticated users when `limit_to_local_content` is `:all`",
  118. %{local_activity: local_activity} do
  119. Pleroma.Config.put([:instance, :limit_to_local_content], :all)
  120. assert [^local_activity] = Activity.search(nil, "find me")
  121. Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
  122. end
  123. test "find all statuses for unauthenticated users when `limit_to_local_content` is `false`",
  124. %{
  125. local_activity: local_activity,
  126. remote_activity: remote_activity
  127. } do
  128. Pleroma.Config.put([:instance, :limit_to_local_content], false)
  129. activities = Enum.sort_by(Activity.search(nil, "find me"), & &1.id)
  130. assert [^local_activity, ^remote_activity] = activities
  131. Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
  132. end
  133. end
  134. test "add an activity with an expiration" do
  135. activity = insert(:note_activity)
  136. insert(:expiration_in_the_future, %{activity_id: activity.id})
  137. Pleroma.ActivityExpiration
  138. |> where([a], a.activity_id == ^activity.id)
  139. |> Repo.one!()
  140. end
  141. test "all_by_ids_with_object/1" do
  142. %{id: id1} = insert(:note_activity)
  143. %{id: id2} = insert(:note_activity)
  144. activities =
  145. [id1, id2]
  146. |> Activity.all_by_ids_with_object()
  147. |> Enum.sort(&(&1.id < &2.id))
  148. assert [%{id: ^id1, object: %Object{}}, %{id: ^id2, object: %Object{}}] = activities
  149. end
  150. test "get_by_id_with_object/1" do
  151. %{id: id} = insert(:note_activity)
  152. assert %Activity{id: ^id, object: %Object{}} = Activity.get_by_id_with_object(id)
  153. end
  154. test "get_by_ap_id_with_object/1" do
  155. %{data: %{"id" => ap_id}} = insert(:note_activity)
  156. assert %Activity{data: %{"id" => ^ap_id}, object: %Object{}} =
  157. Activity.get_by_ap_id_with_object(ap_id)
  158. end
  159. test "get_by_id/1" do
  160. %{id: id} = insert(:note_activity)
  161. assert %Activity{id: ^id} = Activity.get_by_id(id)
  162. end
  163. test "all_by_actor_and_id/2" do
  164. user = insert(:user)
  165. {:ok, %{id: id1}} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofe"})
  166. {:ok, %{id: id2}} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofefe"})
  167. assert [] == Activity.all_by_actor_and_id(user, [])
  168. activities =
  169. user.ap_id
  170. |> Activity.all_by_actor_and_id([id1, id2])
  171. |> Enum.sort(&(&1.id < &2.id))
  172. assert [%Activity{id: ^id1}, %Activity{id: ^id2}] = activities
  173. end
  174. end