logo

pleroma

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

announce_handling_test.exs (5081B)


  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.Transmogrifier.AnnounceHandlingTest do
  5. use Pleroma.DataCase
  6. alias Pleroma.Activity
  7. alias Pleroma.Object
  8. alias Pleroma.Web.ActivityPub.Transmogrifier
  9. alias Pleroma.Web.CommonAPI
  10. import Pleroma.Factory
  11. test "it works for incoming honk announces" do
  12. user = insert(:user, ap_id: "https://honktest/u/test", local: false)
  13. other_user = insert(:user)
  14. {:ok, post} = CommonAPI.post(other_user, %{status: "bonkeronk"})
  15. announce = %{
  16. "@context" => "https://www.w3.org/ns/activitystreams",
  17. "actor" => "https://honktest/u/test",
  18. "id" => "https://honktest/u/test/bonk/1793M7B9MQ48847vdx",
  19. "object" => post.data["object"],
  20. "published" => "2019-06-25T19:33:58Z",
  21. "to" => "https://www.w3.org/ns/activitystreams#Public",
  22. "type" => "Announce"
  23. }
  24. {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(announce)
  25. object = Object.get_by_ap_id(post.data["object"])
  26. assert length(object.data["announcements"]) == 1
  27. assert user.ap_id in object.data["announcements"]
  28. end
  29. test "it works for incoming announces with actor being inlined (kroeg)" do
  30. data = File.read!("test/fixtures/kroeg-announce-with-inline-actor.json") |> Jason.decode!()
  31. _user = insert(:user, local: false, ap_id: data["actor"]["id"])
  32. other_user = insert(:user)
  33. {:ok, post} = CommonAPI.post(other_user, %{status: "kroegeroeg"})
  34. data =
  35. data
  36. |> put_in(["object", "id"], post.data["object"])
  37. {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
  38. assert data["actor"] == "https://puckipedia.com/"
  39. end
  40. test "it works for incoming announces, fetching the announced object" do
  41. data =
  42. File.read!("test/fixtures/mastodon-announce.json")
  43. |> Jason.decode!()
  44. |> Map.put("object", "http://mastodon.example.org/users/admin/statuses/99541947525187367")
  45. Tesla.Mock.mock(fn
  46. %{method: :get} ->
  47. %Tesla.Env{
  48. status: 200,
  49. body: File.read!("test/fixtures/mastodon-note-object.json"),
  50. headers: HttpRequestMock.activitypub_object_headers()
  51. }
  52. end)
  53. _user = insert(:user, local: false, ap_id: data["actor"])
  54. {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
  55. assert data["actor"] == "http://mastodon.example.org/users/admin"
  56. assert data["type"] == "Announce"
  57. assert data["id"] ==
  58. "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
  59. assert data["object"] ==
  60. "http://mastodon.example.org/users/admin/statuses/99541947525187367"
  61. assert(Activity.get_create_by_object_ap_id(data["object"]))
  62. end
  63. @tag capture_log: true
  64. test "it works for incoming announces with an existing activity" do
  65. user = insert(:user)
  66. {:ok, activity} = CommonAPI.post(user, %{status: "hey"})
  67. data =
  68. File.read!("test/fixtures/mastodon-announce.json")
  69. |> Jason.decode!()
  70. |> Map.put("object", activity.data["object"])
  71. _user = insert(:user, local: false, ap_id: data["actor"])
  72. {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
  73. assert data["actor"] == "http://mastodon.example.org/users/admin"
  74. assert data["type"] == "Announce"
  75. assert data["id"] ==
  76. "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
  77. assert data["object"] == activity.data["object"]
  78. assert Activity.get_create_by_object_ap_id(data["object"]).id == activity.id
  79. end
  80. # Ignore inlined activities for now
  81. @tag skip: true
  82. test "it works for incoming announces with an inlined activity" do
  83. data =
  84. File.read!("test/fixtures/mastodon-announce-private.json")
  85. |> Jason.decode!()
  86. _user =
  87. insert(:user,
  88. local: false,
  89. ap_id: data["actor"],
  90. follower_address: data["actor"] <> "/followers"
  91. )
  92. {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
  93. assert data["actor"] == "http://mastodon.example.org/users/admin"
  94. assert data["type"] == "Announce"
  95. assert data["id"] ==
  96. "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
  97. object = Object.normalize(data["object"], fetch: false)
  98. assert object.data["id"] == "http://mastodon.example.org/@admin/99541947525187368"
  99. assert object.data["content"] == "this is a private toot"
  100. end
  101. @tag capture_log: true
  102. test "it rejects incoming announces with an inlined activity from another origin" do
  103. Tesla.Mock.mock(fn
  104. %{method: :get} -> %Tesla.Env{status: 404, body: ""}
  105. end)
  106. data =
  107. File.read!("test/fixtures/bogus-mastodon-announce.json")
  108. |> Jason.decode!()
  109. _user = insert(:user, local: false, ap_id: data["actor"])
  110. assert {:error, _e} = Transmogrifier.handle_incoming(data)
  111. end
  112. end