72d4d1b392
TwitterCard meta tags are supposed to use the attributes "name" and "content". OpenGraph tags use the attributes "property" and "content". Twitter itself is smart enough to detect broken meta tags and discover the TwitterCard using "property" and "content", but other platforms that only implement parsing of TwitterCards and not OpenGraph may fail to correctly detect the tags as they're under the wrong attributes. > "Open Graph protocol also specifies the use of property and content attributes for markup while > Twitter cards use name and content. Twitter’s parser will fall back to using property and content, > so there is no need to modify existing Open Graph protocol markup if it already exists." [0] [0] https://developer.twitter.com/en/docs/twitter-for-websites/cards/guides/getting-started
204 lines
7.3 KiB
Elixir
204 lines
7.3 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.Metadata.Providers.TwitterCardTest do
|
|
use Pleroma.DataCase
|
|
import Pleroma.Factory
|
|
|
|
alias Pleroma.User
|
|
alias Pleroma.Web.CommonAPI
|
|
alias Pleroma.Web.Endpoint
|
|
alias Pleroma.Web.MediaProxy
|
|
alias Pleroma.Web.Metadata.Providers.TwitterCard
|
|
alias Pleroma.Web.Metadata.Utils
|
|
alias Pleroma.Web.Router
|
|
|
|
setup do: clear_config([Pleroma.Web.Metadata, :unfurl_nsfw])
|
|
|
|
test "it renders twitter card for user info" do
|
|
user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994")
|
|
avatar_url = MediaProxy.preview_url(User.avatar_url(user))
|
|
res = TwitterCard.build_tags(%{user: user})
|
|
|
|
assert res == [
|
|
{:meta, [name: "twitter:title", content: Utils.user_name_string(user)], []},
|
|
{:meta, [name: "twitter:description", content: "born 19 March 1994"], []},
|
|
{:meta, [name: "twitter:image", content: avatar_url], []},
|
|
{:meta, [name: "twitter:card", content: "summary"], []}
|
|
]
|
|
end
|
|
|
|
test "it uses summary twittercard if post has no attachment" do
|
|
user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994")
|
|
{:ok, activity} = CommonAPI.post(user, %{status: "HI"})
|
|
|
|
note =
|
|
insert(:note, %{
|
|
data: %{
|
|
"actor" => user.ap_id,
|
|
"tag" => [],
|
|
"id" => "https://pleroma.gov/objects/whatever",
|
|
"summary" => "",
|
|
"content" => "pleroma in a nutshell"
|
|
}
|
|
})
|
|
|
|
result = TwitterCard.build_tags(%{object: note, user: user, activity_id: activity.id})
|
|
|
|
assert [
|
|
{:meta, [name: "twitter:title", content: Utils.user_name_string(user)], []},
|
|
{:meta, [name: "twitter:description", content: "pleroma in a nutshell"], []},
|
|
{:meta, [name: "twitter:image", content: "http://localhost:4001/images/avi.png"],
|
|
[]},
|
|
{:meta, [name: "twitter:card", content: "summary"], []}
|
|
] == result
|
|
end
|
|
|
|
test "it uses summary as description if post has one" do
|
|
user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994")
|
|
{:ok, activity} = CommonAPI.post(user, %{status: "HI"})
|
|
|
|
note =
|
|
insert(:note, %{
|
|
data: %{
|
|
"actor" => user.ap_id,
|
|
"tag" => [],
|
|
"id" => "https://pleroma.gov/objects/whatever",
|
|
"summary" => "Public service announcement on caffeine consumption",
|
|
"content" => "cofe"
|
|
}
|
|
})
|
|
|
|
result = TwitterCard.build_tags(%{object: note, user: user, activity_id: activity.id})
|
|
|
|
assert [
|
|
{:meta, [name: "twitter:title", content: Utils.user_name_string(user)], []},
|
|
{:meta,
|
|
[
|
|
name: "twitter:description",
|
|
content: "Public service announcement on caffeine consumption"
|
|
], []},
|
|
{:meta, [name: "twitter:image", content: "http://localhost:4001/images/avi.png"],
|
|
[]},
|
|
{:meta, [name: "twitter:card", content: "summary"], []}
|
|
] == result
|
|
end
|
|
|
|
test "it renders avatar not attachment if post is nsfw and unfurl_nsfw is disabled" do
|
|
clear_config([Pleroma.Web.Metadata, :unfurl_nsfw], false)
|
|
user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994")
|
|
{:ok, activity} = CommonAPI.post(user, %{status: "HI"})
|
|
|
|
note =
|
|
insert(:note, %{
|
|
data: %{
|
|
"actor" => user.ap_id,
|
|
"tag" => [],
|
|
"id" => "https://pleroma.gov/objects/whatever",
|
|
"summary" => "",
|
|
"content" => "pleroma in a nutshell",
|
|
"sensitive" => true,
|
|
"attachment" => [
|
|
%{
|
|
"url" => [%{"mediaType" => "image/png", "href" => "https://pleroma.gov/tenshi.png"}]
|
|
},
|
|
%{
|
|
"url" => [
|
|
%{
|
|
"mediaType" => "application/octet-stream",
|
|
"href" => "https://pleroma.gov/fqa/badapple.sfc"
|
|
}
|
|
]
|
|
},
|
|
%{
|
|
"url" => [
|
|
%{"mediaType" => "video/webm", "href" => "https://pleroma.gov/about/juche.webm"}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
})
|
|
|
|
result = TwitterCard.build_tags(%{object: note, user: user, activity_id: activity.id})
|
|
|
|
assert [
|
|
{:meta, [name: "twitter:title", content: Utils.user_name_string(user)], []},
|
|
{:meta, [name: "twitter:description", content: "pleroma in a nutshell"], []},
|
|
{:meta, [name: "twitter:image", content: "http://localhost:4001/images/avi.png"],
|
|
[]},
|
|
{:meta, [name: "twitter:card", content: "summary"], []}
|
|
] == result
|
|
end
|
|
|
|
test "it renders supported types of attachments and skips unknown types" do
|
|
user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994")
|
|
{:ok, activity} = CommonAPI.post(user, %{status: "HI"})
|
|
|
|
note =
|
|
insert(:note, %{
|
|
data: %{
|
|
"actor" => user.ap_id,
|
|
"tag" => [],
|
|
"id" => "https://pleroma.gov/objects/whatever",
|
|
"summary" => "",
|
|
"content" => "pleroma in a nutshell",
|
|
"attachment" => [
|
|
%{
|
|
"url" => [
|
|
%{
|
|
"mediaType" => "image/png",
|
|
"href" => "https://pleroma.gov/tenshi.png",
|
|
"height" => 1024,
|
|
"width" => 1280
|
|
}
|
|
]
|
|
},
|
|
%{
|
|
"url" => [
|
|
%{
|
|
"mediaType" => "application/octet-stream",
|
|
"href" => "https://pleroma.gov/fqa/badapple.sfc"
|
|
}
|
|
]
|
|
},
|
|
%{
|
|
"url" => [
|
|
%{
|
|
"mediaType" => "video/webm",
|
|
"href" => "https://pleroma.gov/about/juche.webm",
|
|
"height" => 600,
|
|
"width" => 800
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
})
|
|
|
|
result = TwitterCard.build_tags(%{object: note, user: user, activity_id: activity.id})
|
|
|
|
assert [
|
|
{:meta, [name: "twitter:title", content: Utils.user_name_string(user)], []},
|
|
{:meta, [name: "twitter:description", content: "pleroma in a nutshell"], []},
|
|
{:meta, [name: "twitter:card", content: "summary_large_image"], []},
|
|
{:meta, [name: "twitter:player", content: "https://pleroma.gov/tenshi.png"], []},
|
|
{:meta, [name: "twitter:player:width", content: "1280"], []},
|
|
{:meta, [name: "twitter:player:height", content: "1024"], []},
|
|
{:meta, [name: "twitter:card", content: "player"], []},
|
|
{:meta,
|
|
[
|
|
name: "twitter:player",
|
|
content: Router.Helpers.o_status_url(Endpoint, :notice_player, activity.id)
|
|
], []},
|
|
{:meta, [name: "twitter:player:width", content: "800"], []},
|
|
{:meta, [name: "twitter:player:height", content: "600"], []},
|
|
{:meta,
|
|
[
|
|
name: "twitter:player:stream",
|
|
content: "https://pleroma.gov/about/juche.webm"
|
|
], []},
|
|
{:meta, [name: "twitter:player:stream:content_type", content: "video/webm"], []}
|
|
] == result
|
|
end
|
|
end
|