f3e061c964
30 to 70% of the objects in the object table are simple JSON objects containing a single field, 'id', being the context's ID. The reason for the creation of an object per context seems to be an old relic from the StatusNet era, and has only been used nowadays as an helper for threads in Pleroma-FE via the `pleroma.conversation_id` field in status views. An object per context was created, and its numerical ID (table column) was used and stored as 'context_id' in the object and activity along with the full 'context' URI/string. This commit removes this field and stops creation of objects for each context, which will also allow incoming activities to use activity IDs as contexts, something which was not possible before, or would have been very broken under most circumstances. The `pleroma.conversation_id` field has been reimplemented in a way to maintain backwards-compatibility by calculating a CRC32 of the full context URI/string in the object, instead of relying on the row ID for the created context object.
173 lines
5.4 KiB
Elixir
173 lines
5.4 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
defmodule Pleroma.Web.ActivityPub.Transmogrifier.QuestionHandlingTest do
|
|
use Pleroma.DataCase
|
|
|
|
alias Pleroma.Activity
|
|
alias Pleroma.Object
|
|
alias Pleroma.Web.ActivityPub.Transmogrifier
|
|
alias Pleroma.Web.CommonAPI
|
|
|
|
import Pleroma.Factory
|
|
|
|
setup_all do
|
|
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
|
:ok
|
|
end
|
|
|
|
test "Mastodon Question activity" do
|
|
data = File.read!("test/fixtures/mastodon-question-activity.json") |> Jason.decode!()
|
|
|
|
{:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data)
|
|
|
|
object = Object.normalize(activity, fetch: false)
|
|
|
|
assert object.data["url"] == "https://mastodon.sdf.org/@rinpatch/102070944809637304"
|
|
|
|
assert object.data["closed"] == "2019-05-11T09:03:36Z"
|
|
|
|
assert object.data["context"] == activity.data["context"]
|
|
|
|
assert object.data["context"] ==
|
|
"tag:mastodon.sdf.org,2019-05-10:objectId=15095122:objectType=Conversation"
|
|
|
|
assert object.data["anyOf"] == []
|
|
|
|
assert Enum.sort(object.data["oneOf"]) ==
|
|
Enum.sort([
|
|
%{
|
|
"name" => "25 char limit is dumb",
|
|
"replies" => %{"totalItems" => 0, "type" => "Collection"},
|
|
"type" => "Note"
|
|
},
|
|
%{
|
|
"name" => "Dunno",
|
|
"replies" => %{"totalItems" => 0, "type" => "Collection"},
|
|
"type" => "Note"
|
|
},
|
|
%{
|
|
"name" => "Everyone knows that!",
|
|
"replies" => %{"totalItems" => 1, "type" => "Collection"},
|
|
"type" => "Note"
|
|
},
|
|
%{
|
|
"name" => "I can't even fit a funny",
|
|
"replies" => %{"totalItems" => 1, "type" => "Collection"},
|
|
"type" => "Note"
|
|
}
|
|
])
|
|
|
|
user = insert(:user)
|
|
|
|
{:ok, reply_activity} = CommonAPI.post(user, %{status: "hewwo", in_reply_to_id: activity.id})
|
|
|
|
reply_object = Object.normalize(reply_activity, fetch: false)
|
|
|
|
assert reply_object.data["context"] == object.data["context"]
|
|
end
|
|
|
|
test "Mastodon Question activity with HTML tags in plaintext" do
|
|
options = [
|
|
%{
|
|
"type" => "Note",
|
|
"name" => "<input type=\"date\">",
|
|
"replies" => %{"totalItems" => 0, "type" => "Collection"}
|
|
},
|
|
%{
|
|
"type" => "Note",
|
|
"name" => "<input type=\"date\"/>",
|
|
"replies" => %{"totalItems" => 0, "type" => "Collection"}
|
|
},
|
|
%{
|
|
"type" => "Note",
|
|
"name" => "<input type=\"date\" />",
|
|
"replies" => %{"totalItems" => 1, "type" => "Collection"}
|
|
},
|
|
%{
|
|
"type" => "Note",
|
|
"name" => "<input type=\"date\"></input>",
|
|
"replies" => %{"totalItems" => 1, "type" => "Collection"}
|
|
}
|
|
]
|
|
|
|
data =
|
|
File.read!("test/fixtures/mastodon-question-activity.json")
|
|
|> Jason.decode!()
|
|
|> Kernel.put_in(["object", "oneOf"], options)
|
|
|
|
{:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data)
|
|
object = Object.normalize(activity, fetch: false)
|
|
|
|
assert Enum.sort(object.data["oneOf"]) == Enum.sort(options)
|
|
end
|
|
|
|
test "Mastodon Question activity with custom emojis" do
|
|
options = [
|
|
%{
|
|
"type" => "Note",
|
|
"name" => ":blobcat:",
|
|
"replies" => %{"totalItems" => 0, "type" => "Collection"}
|
|
},
|
|
%{
|
|
"type" => "Note",
|
|
"name" => ":blobfox:",
|
|
"replies" => %{"totalItems" => 0, "type" => "Collection"}
|
|
}
|
|
]
|
|
|
|
tag = [
|
|
%{
|
|
"icon" => %{
|
|
"type" => "Image",
|
|
"url" => "https://blob.cat/emoji/custom/blobcats/blobcat.png"
|
|
},
|
|
"id" => "https://blob.cat/emoji/custom/blobcats/blobcat.png",
|
|
"name" => ":blobcat:",
|
|
"type" => "Emoji",
|
|
"updated" => "1970-01-01T00:00:00Z"
|
|
},
|
|
%{
|
|
"icon" => %{"type" => "Image", "url" => "https://blob.cat/emoji/blobfox/blobfox.png"},
|
|
"id" => "https://blob.cat/emoji/blobfox/blobfox.png",
|
|
"name" => ":blobfox:",
|
|
"type" => "Emoji",
|
|
"updated" => "1970-01-01T00:00:00Z"
|
|
}
|
|
]
|
|
|
|
data =
|
|
File.read!("test/fixtures/mastodon-question-activity.json")
|
|
|> Jason.decode!()
|
|
|> Kernel.put_in(["object", "oneOf"], options)
|
|
|> Kernel.put_in(["object", "tag"], tag)
|
|
|
|
{:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data)
|
|
object = Object.normalize(activity, fetch: false)
|
|
|
|
assert object.data["oneOf"] == options
|
|
|
|
assert object.data["emoji"] == %{
|
|
"blobcat" => "https://blob.cat/emoji/custom/blobcats/blobcat.png",
|
|
"blobfox" => "https://blob.cat/emoji/blobfox/blobfox.png"
|
|
}
|
|
end
|
|
|
|
test "returns same activity if received a second time" do
|
|
data = File.read!("test/fixtures/mastodon-question-activity.json") |> Jason.decode!()
|
|
|
|
assert {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data)
|
|
|
|
assert {:ok, ^activity} = Transmogrifier.handle_incoming(data)
|
|
end
|
|
|
|
test "accepts a Question with no content" do
|
|
data =
|
|
File.read!("test/fixtures/mastodon-question-activity.json")
|
|
|> Jason.decode!()
|
|
|> Kernel.put_in(["object", "content"], "")
|
|
|
|
assert {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(data)
|
|
end
|
|
end
|