logo

pleroma

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

update_handling_test.exs (5091B)


  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.ObjectValidators.UpdateHandlingTest do
  5. use Pleroma.DataCase, async: true
  6. alias Pleroma.Web.ActivityPub.Builder
  7. alias Pleroma.Web.ActivityPub.ObjectValidator
  8. import Pleroma.Factory
  9. describe "updates" do
  10. setup do
  11. user = insert(:user)
  12. object = %{
  13. "id" => user.ap_id,
  14. "name" => "A new name",
  15. "summary" => "A new bio"
  16. }
  17. {:ok, valid_update, []} = Builder.update(user, object)
  18. %{user: user, valid_update: valid_update}
  19. end
  20. test "validates a basic object", %{valid_update: valid_update} do
  21. assert {:ok, _update, []} = ObjectValidator.validate(valid_update, [])
  22. end
  23. test "returns an error if the object can't be updated by the actor", %{
  24. valid_update: valid_update
  25. } do
  26. other_user = insert(:user, local: false)
  27. update =
  28. valid_update
  29. |> Map.put("actor", other_user.ap_id)
  30. assert {:error, _cng} = ObjectValidator.validate(update, [])
  31. end
  32. test "validates as long as the object is same-origin with the actor", %{
  33. valid_update: valid_update
  34. } do
  35. other_user = insert(:user)
  36. update =
  37. valid_update
  38. |> Map.put("actor", other_user.ap_id)
  39. assert {:ok, _update, []} = ObjectValidator.validate(update, [])
  40. end
  41. test "validates if the object is not of an Actor type" do
  42. note = insert(:note)
  43. updated_note = note.data |> Map.put("content", "edited content")
  44. other_user = insert(:user)
  45. {:ok, update, _} = Builder.update(other_user, updated_note)
  46. assert {:ok, _update, _} = ObjectValidator.validate(update, [])
  47. end
  48. end
  49. describe "update note" do
  50. test "converts object into Pleroma's format" do
  51. mastodon_tags = [
  52. %{
  53. "icon" => %{
  54. "mediaType" => "image/png",
  55. "type" => "Image",
  56. "url" => "https://somewhere.org/emoji/url/1.png"
  57. },
  58. "id" => "https://somewhere.org/emoji/1",
  59. "name" => ":some_emoji:",
  60. "type" => "Emoji",
  61. "updated" => "2021-04-07T11:00:00Z"
  62. }
  63. ]
  64. user = insert(:user)
  65. note = insert(:note, user: user)
  66. updated_note =
  67. note.data
  68. |> Map.put("content", "edited content")
  69. |> Map.put("tag", mastodon_tags)
  70. {:ok, update, _} = Builder.update(user, updated_note)
  71. assert {:ok, _update, meta} = ObjectValidator.validate(update, [])
  72. assert %{"emoji" => %{"some_emoji" => "https://somewhere.org/emoji/url/1.png"}} =
  73. meta[:object_data]
  74. end
  75. test "returns no object_data in meta for a local Update" do
  76. user = insert(:user)
  77. note = insert(:note, user: user)
  78. updated_note =
  79. note.data
  80. |> Map.put("content", "edited content")
  81. {:ok, update, _} = Builder.update(user, updated_note)
  82. assert {:ok, _update, meta} = ObjectValidator.validate(update, local: true)
  83. assert is_nil(meta[:object_data])
  84. end
  85. test "returns object_data in meta for a remote Update" do
  86. user = insert(:user)
  87. note = insert(:note, user: user)
  88. updated_note =
  89. note.data
  90. |> Map.put("content", "edited content")
  91. {:ok, update, _} = Builder.update(user, updated_note)
  92. assert {:ok, _update, meta} = ObjectValidator.validate(update, local: false)
  93. assert meta[:object_data]
  94. assert {:ok, _update, meta} = ObjectValidator.validate(update, [])
  95. assert meta[:object_data]
  96. end
  97. end
  98. describe "update with history" do
  99. setup do
  100. user = insert(:user)
  101. {:ok, activity} = Pleroma.Web.CommonAPI.post(user, %{status: "mew mew :dinosaur:"})
  102. {:ok, edit} = Pleroma.Web.CommonAPI.update(user, activity, %{status: "edited :blank:"})
  103. {:ok, external_rep} = Pleroma.Web.ActivityPub.Transmogrifier.prepare_outgoing(edit.data)
  104. %{external_rep: external_rep}
  105. end
  106. test "edited note", %{external_rep: external_rep} do
  107. {:ok, _validate_res, meta} = ObjectValidator.validate(external_rep, [])
  108. assert %{"formerRepresentations" => %{"orderedItems" => [%{"emoji" => %{"dinosaur" => _}}]}} =
  109. meta[:object_data]
  110. end
  111. test "edited note, badly-formed formerRepresentations", %{external_rep: external_rep} do
  112. external_rep = put_in(external_rep, ["object", "formerRepresentations"], %{})
  113. assert {:error, _} = ObjectValidator.validate(external_rep, [])
  114. end
  115. test "edited note, badly-formed history item", %{external_rep: external_rep} do
  116. history_item =
  117. Enum.at(external_rep["object"]["formerRepresentations"]["orderedItems"], 0)
  118. |> Map.put("type", "Foo")
  119. external_rep =
  120. put_in(
  121. external_rep,
  122. ["object", "formerRepresentations", "orderedItems"],
  123. [history_item]
  124. )
  125. assert {:error, _} = ObjectValidator.validate(external_rep, [])
  126. end
  127. end
  128. end