logo

pleroma

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

relay_test.exs (5720B)


  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.RelayTest do
  5. use Pleroma.DataCase
  6. alias Pleroma.Activity
  7. alias Pleroma.User
  8. alias Pleroma.Web.ActivityPub.Relay
  9. alias Pleroma.Web.CommonAPI
  10. import ExUnit.CaptureLog
  11. import Pleroma.Factory
  12. import Mock
  13. test "gets an actor for the relay" do
  14. user = Relay.get_actor()
  15. assert user.ap_id == "#{Pleroma.Web.Endpoint.url()}/relay"
  16. end
  17. test "relay actor is invisible" do
  18. user = Relay.get_actor()
  19. assert User.invisible?(user)
  20. end
  21. describe "follow/1" do
  22. test "returns errors when user not found" do
  23. assert capture_log(fn ->
  24. {:error, _} = Relay.follow("test-ap-id")
  25. end) =~ "Could not decode user at fetch"
  26. end
  27. test "returns activity" do
  28. user = insert(:user)
  29. service_actor = Relay.get_actor()
  30. assert {:ok, %Activity{} = activity} = Relay.follow(user.ap_id)
  31. assert activity.actor == "#{Pleroma.Web.Endpoint.url()}/relay"
  32. assert user.ap_id in activity.recipients
  33. assert activity.data["type"] == "Follow"
  34. assert activity.data["actor"] == service_actor.ap_id
  35. assert activity.data["object"] == user.ap_id
  36. end
  37. end
  38. describe "unfollow/1" do
  39. test "returns errors when user not found" do
  40. assert capture_log(fn ->
  41. {:error, _} = Relay.unfollow("test-ap-id")
  42. end) =~ "Could not decode user at fetch"
  43. end
  44. test "returns activity" do
  45. user = insert(:user)
  46. service_actor = Relay.get_actor()
  47. CommonAPI.follow(service_actor, user)
  48. assert "#{user.ap_id}/followers" in User.following(service_actor)
  49. assert {:ok, %Activity{} = activity} = Relay.unfollow(user.ap_id)
  50. assert activity.actor == "#{Pleroma.Web.Endpoint.url()}/relay"
  51. assert user.ap_id in activity.recipients
  52. assert activity.data["type"] == "Undo"
  53. assert activity.data["actor"] == service_actor.ap_id
  54. assert activity.data["to"] == [user.ap_id]
  55. refute "#{user.ap_id}/followers" in User.following(service_actor)
  56. end
  57. test "force unfollow when target service is dead" do
  58. user = insert(:user)
  59. user_ap_id = user.ap_id
  60. user_id = user.id
  61. Tesla.Mock.mock(fn %{method: :get, url: ^user_ap_id} ->
  62. %Tesla.Env{status: 404}
  63. end)
  64. service_actor = Relay.get_actor()
  65. CommonAPI.follow(service_actor, user)
  66. assert "#{user.ap_id}/followers" in User.following(service_actor)
  67. assert Pleroma.Repo.get_by(
  68. Pleroma.FollowingRelationship,
  69. follower_id: service_actor.id,
  70. following_id: user_id
  71. )
  72. Pleroma.Repo.delete(user)
  73. User.invalidate_cache(user)
  74. assert {:ok, %Activity{} = activity} = Relay.unfollow(user_ap_id, %{force: true})
  75. assert refresh_record(service_actor).following_count == 0
  76. refute Pleroma.Repo.get_by(
  77. Pleroma.FollowingRelationship,
  78. follower_id: service_actor.id,
  79. following_id: user_id
  80. )
  81. assert activity.actor == "#{Pleroma.Web.Endpoint.url()}/relay"
  82. assert user.ap_id in activity.recipients
  83. assert activity.data["type"] == "Undo"
  84. assert activity.data["actor"] == service_actor.ap_id
  85. assert activity.data["to"] == [user_ap_id]
  86. refute "#{user.ap_id}/followers" in User.following(service_actor)
  87. end
  88. end
  89. describe "publish/1" do
  90. setup do: clear_config([:instance, :federating])
  91. test "returns error when activity not `Create` type" do
  92. activity = insert(:like_activity)
  93. assert Relay.publish(activity) == {:error, "Not implemented"}
  94. end
  95. @tag capture_log: true
  96. test "returns error when activity not public" do
  97. activity = insert(:direct_note_activity)
  98. assert Relay.publish(activity) == {:error, false}
  99. end
  100. test "returns error when object is unknown" do
  101. activity =
  102. insert(:note_activity,
  103. data: %{
  104. "type" => "Create",
  105. "object" => "http://mastodon.example.org/eee/99541947525187367"
  106. }
  107. )
  108. Tesla.Mock.mock(fn
  109. %{method: :get, url: "http://mastodon.example.org/eee/99541947525187367"} ->
  110. %Tesla.Env{status: 500, body: ""}
  111. end)
  112. assert capture_log(fn ->
  113. assert Relay.publish(activity) == {:error, false}
  114. end) =~ "[error] error: false"
  115. end
  116. test_with_mock "returns announce activity and publish to federate",
  117. Pleroma.Web.Federator,
  118. [:passthrough],
  119. [] do
  120. clear_config([:instance, :federating], true)
  121. service_actor = Relay.get_actor()
  122. note = insert(:note_activity)
  123. assert {:ok, %Activity{} = activity} = Relay.publish(note)
  124. assert activity.data["type"] == "Announce"
  125. assert activity.data["actor"] == service_actor.ap_id
  126. assert service_actor.follower_address in activity.data["to"]
  127. assert called(Pleroma.Web.Federator.publish(activity))
  128. end
  129. test_with_mock "returns announce activity and not publish to federate",
  130. Pleroma.Web.Federator,
  131. [:passthrough],
  132. [] do
  133. clear_config([:instance, :federating], false)
  134. service_actor = Relay.get_actor()
  135. note = insert(:note_activity)
  136. assert {:ok, %Activity{} = activity} = Relay.publish(note)
  137. assert activity.data["type"] == "Announce"
  138. assert activity.data["actor"] == service_actor.ap_id
  139. refute called(Pleroma.Web.Federator.publish(activity))
  140. end
  141. end
  142. end