forked from AkkomaGang/akkoma
362 lines
11 KiB
Elixir
362 lines
11 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
defmodule Pleroma.Web.Push.ImplTest do
|
|
use Pleroma.DataCase
|
|
|
|
alias Pleroma.Notification
|
|
alias Pleroma.Object
|
|
alias Pleroma.User
|
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
|
alias Pleroma.Web.CommonAPI
|
|
alias Pleroma.Web.Push.Impl
|
|
alias Pleroma.Web.Push.Subscription
|
|
alias Pleroma.Web.WebPushHttpClientMock
|
|
|
|
import Mock
|
|
import Pleroma.Factory
|
|
|
|
setup do
|
|
Tesla.Mock.mock(fn
|
|
%{method: :post, url: "https://example.com/example/1234"} ->
|
|
%Tesla.Env{status: 200}
|
|
|
|
%{method: :post, url: "https://example.com/example/not_found"} ->
|
|
%Tesla.Env{status: 400}
|
|
|
|
%{method: :post, url: "https://example.com/example/bad"} ->
|
|
%Tesla.Env{status: 100}
|
|
end)
|
|
|
|
:ok
|
|
end
|
|
|
|
@sub %{
|
|
endpoint: "https://example.com/example/1234",
|
|
keys: %{
|
|
auth: "8eDyX_uCN0XRhSbY5hs7Hg==",
|
|
p256dh:
|
|
"BCIWgsnyXDv1VkhqL2P7YRBvdeuDnlwAPT2guNhdIoW3IP7GmHh1SMKPLxRf7x8vJy6ZFK3ol2ohgn_-0yP7QQA="
|
|
}
|
|
}
|
|
@api_key "BASgACIHpN1GYgzSRp"
|
|
@message "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..."
|
|
|
|
test "performs sending notifications" do
|
|
user = insert(:user)
|
|
user2 = insert(:user)
|
|
insert(:push_subscription, user: user, data: %{alerts: %{"mention" => true}})
|
|
insert(:push_subscription, user: user2, data: %{alerts: %{"mention" => true}})
|
|
|
|
insert(:push_subscription,
|
|
user: user,
|
|
data: %{alerts: %{"follow" => true, "mention" => true}}
|
|
)
|
|
|
|
insert(:push_subscription,
|
|
user: user,
|
|
data: %{alerts: %{"follow" => true, "mention" => false}}
|
|
)
|
|
|
|
{:ok, activity} = CommonAPI.post(user, %{status: "<Lorem ipsum dolor sit amet."})
|
|
|
|
notif =
|
|
insert(:notification,
|
|
user: user,
|
|
activity: activity,
|
|
type: "mention"
|
|
)
|
|
|
|
assert Impl.perform(notif) == {:ok, [:ok, :ok]}
|
|
end
|
|
|
|
@tag capture_log: true
|
|
test "returns error if notif does not match " do
|
|
assert Impl.perform(%{}) == {:error, :unknown_type}
|
|
end
|
|
|
|
test "successful message sending" do
|
|
assert Impl.push_message(@message, @sub, @api_key, %Subscription{}) == :ok
|
|
end
|
|
|
|
test_with_mock "uses WebPushHttpClientMock as an HTTP client", WebPushHttpClientMock,
|
|
post: fn _, _, _ -> {:ok, %{status_code: 200}} end do
|
|
Impl.push_message(@message, @sub, @api_key, %Subscription{})
|
|
assert_called(WebPushHttpClientMock.post("https://example.com/example/1234", :_, :_))
|
|
end
|
|
|
|
test_with_mock "uses Pleroma.HTTP as an HTTP client", Pleroma.HTTP,
|
|
post: fn _, _, _ -> {:ok, %{status_code: 200}} end do
|
|
client = Application.get_env(:web_push_encryption, :http_client)
|
|
on_exit(fn -> Application.put_env(:web_push_encryption, :http_client, client) end)
|
|
Application.put_env(:web_push_encryption, :http_client, Pleroma.HTTP)
|
|
|
|
Impl.push_message(@message, @sub, @api_key, %Subscription{})
|
|
assert_called(Pleroma.HTTP.post("https://example.com/example/1234", :_, :_))
|
|
end
|
|
|
|
@tag capture_log: true
|
|
test "fail message sending" do
|
|
assert Impl.push_message(
|
|
@message,
|
|
Map.merge(@sub, %{endpoint: "https://example.com/example/bad"}),
|
|
@api_key,
|
|
%Subscription{}
|
|
) == :error
|
|
end
|
|
|
|
test "delete subscription if result send message between 400..500" do
|
|
subscription = insert(:push_subscription)
|
|
|
|
assert Impl.push_message(
|
|
@message,
|
|
Map.merge(@sub, %{endpoint: "https://example.com/example/not_found"}),
|
|
@api_key,
|
|
subscription
|
|
) == :ok
|
|
|
|
refute Pleroma.Repo.get(Subscription, subscription.id)
|
|
end
|
|
|
|
test "deletes subscription when token has been deleted" do
|
|
subscription = insert(:push_subscription)
|
|
|
|
Pleroma.Repo.delete(subscription.token)
|
|
|
|
refute Pleroma.Repo.get(Subscription, subscription.id)
|
|
end
|
|
|
|
test "renders title and body for create activity" do
|
|
user = insert(:user, nickname: "Bob")
|
|
|
|
{:ok, activity} =
|
|
CommonAPI.post(user, %{
|
|
status:
|
|
"<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
|
|
})
|
|
|
|
object = Object.normalize(activity)
|
|
|
|
assert Impl.format_body(
|
|
%{
|
|
activity: activity
|
|
},
|
|
user,
|
|
object
|
|
) ==
|
|
"@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..."
|
|
|
|
assert Impl.format_title(%{activity: activity, type: "mention"}) ==
|
|
"New Mention"
|
|
end
|
|
|
|
test "renders title and body for follow activity" do
|
|
user = insert(:user, nickname: "Bob")
|
|
other_user = insert(:user)
|
|
{:ok, _, _, activity} = CommonAPI.follow(user, other_user)
|
|
object = Object.normalize(activity, false)
|
|
|
|
assert Impl.format_body(%{activity: activity, type: "follow"}, user, object) ==
|
|
"@Bob has followed you"
|
|
|
|
assert Impl.format_title(%{activity: activity, type: "follow"}) ==
|
|
"New Follower"
|
|
end
|
|
|
|
test "renders title and body for announce activity" do
|
|
user = insert(:user)
|
|
|
|
{:ok, activity} =
|
|
CommonAPI.post(user, %{
|
|
status:
|
|
"<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
|
|
})
|
|
|
|
{:ok, announce_activity} = CommonAPI.repeat(activity.id, user)
|
|
object = Object.normalize(activity)
|
|
|
|
assert Impl.format_body(%{activity: announce_activity}, user, object) ==
|
|
"@#{user.nickname} repeated: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..."
|
|
|
|
assert Impl.format_title(%{activity: announce_activity, type: "reblog"}) ==
|
|
"New Repeat"
|
|
end
|
|
|
|
test "renders title and body for like activity" do
|
|
user = insert(:user, nickname: "Bob")
|
|
|
|
{:ok, activity} =
|
|
CommonAPI.post(user, %{
|
|
status:
|
|
"<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
|
|
})
|
|
|
|
{:ok, activity} = CommonAPI.favorite(user, activity.id)
|
|
object = Object.normalize(activity)
|
|
|
|
assert Impl.format_body(%{activity: activity, type: "favourite"}, user, object) ==
|
|
"@Bob has favorited your post"
|
|
|
|
assert Impl.format_title(%{activity: activity, type: "favourite"}) ==
|
|
"New Favorite"
|
|
end
|
|
|
|
test "renders title for create activity with direct visibility" do
|
|
user = insert(:user, nickname: "Bob")
|
|
|
|
{:ok, activity} =
|
|
CommonAPI.post(user, %{
|
|
visibility: "direct",
|
|
status: "This is just between you and me, pal"
|
|
})
|
|
|
|
assert Impl.format_title(%{activity: activity}) ==
|
|
"New Direct Message"
|
|
end
|
|
|
|
describe "build_content/3" do
|
|
test "builds content for chat messages" do
|
|
user = insert(:user)
|
|
recipient = insert(:user)
|
|
|
|
{:ok, chat} = CommonAPI.post_chat_message(user, recipient, "hey")
|
|
object = Object.normalize(chat, false)
|
|
[notification] = Notification.for_user(recipient)
|
|
|
|
res = Impl.build_content(notification, user, object)
|
|
|
|
assert res == %{
|
|
body: "@#{user.nickname}: hey",
|
|
title: "New Chat Message"
|
|
}
|
|
end
|
|
|
|
test "builds content for chat messages with no content" do
|
|
user = insert(:user)
|
|
recipient = insert(:user)
|
|
|
|
file = %Plug.Upload{
|
|
content_type: "image/jpg",
|
|
path: Path.absname("test/fixtures/image.jpg"),
|
|
filename: "an_image.jpg"
|
|
}
|
|
|
|
{:ok, upload} = ActivityPub.upload(file, actor: user.ap_id)
|
|
|
|
{:ok, chat} = CommonAPI.post_chat_message(user, recipient, nil, media_id: upload.id)
|
|
object = Object.normalize(chat, false)
|
|
[notification] = Notification.for_user(recipient)
|
|
|
|
res = Impl.build_content(notification, user, object)
|
|
|
|
assert res == %{
|
|
body: "@#{user.nickname}: (Attachment)",
|
|
title: "New Chat Message"
|
|
}
|
|
end
|
|
|
|
test "hides contents of notifications when option enabled" do
|
|
user = insert(:user, nickname: "Bob")
|
|
|
|
user2 =
|
|
insert(:user, nickname: "Rob", notification_settings: %{hide_notification_contents: true})
|
|
|
|
{:ok, activity} =
|
|
CommonAPI.post(user, %{
|
|
visibility: "direct",
|
|
status: "<Lorem ipsum dolor sit amet."
|
|
})
|
|
|
|
notif = insert(:notification, user: user2, activity: activity)
|
|
|
|
actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
|
|
object = Object.normalize(activity)
|
|
|
|
assert Impl.build_content(notif, actor, object) == %{
|
|
body: "New Direct Message"
|
|
}
|
|
|
|
{:ok, activity} =
|
|
CommonAPI.post(user, %{
|
|
visibility: "public",
|
|
status: "<Lorem ipsum dolor sit amet."
|
|
})
|
|
|
|
notif = insert(:notification, user: user2, activity: activity, type: "mention")
|
|
|
|
actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
|
|
object = Object.normalize(activity)
|
|
|
|
assert Impl.build_content(notif, actor, object) == %{
|
|
body: "New Mention"
|
|
}
|
|
|
|
{:ok, activity} = CommonAPI.favorite(user, activity.id)
|
|
|
|
notif = insert(:notification, user: user2, activity: activity, type: "favourite")
|
|
|
|
actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
|
|
object = Object.normalize(activity)
|
|
|
|
assert Impl.build_content(notif, actor, object) == %{
|
|
body: "New Favorite"
|
|
}
|
|
end
|
|
|
|
test "returns regular content when hiding contents option disabled" do
|
|
user = insert(:user, nickname: "Bob")
|
|
|
|
user2 =
|
|
insert(:user, nickname: "Rob", notification_settings: %{hide_notification_contents: false})
|
|
|
|
{:ok, activity} =
|
|
CommonAPI.post(user, %{
|
|
visibility: "direct",
|
|
status:
|
|
"<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
|
|
})
|
|
|
|
notif = insert(:notification, user: user2, activity: activity)
|
|
|
|
actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
|
|
object = Object.normalize(activity)
|
|
|
|
assert Impl.build_content(notif, actor, object) == %{
|
|
body:
|
|
"@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini...",
|
|
title: "New Direct Message"
|
|
}
|
|
|
|
{:ok, activity} =
|
|
CommonAPI.post(user, %{
|
|
visibility: "public",
|
|
status:
|
|
"<span>Lorem ipsum dolor sit amet</span>, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis."
|
|
})
|
|
|
|
notif = insert(:notification, user: user2, activity: activity, type: "mention")
|
|
|
|
actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
|
|
object = Object.normalize(activity)
|
|
|
|
assert Impl.build_content(notif, actor, object) == %{
|
|
body:
|
|
"@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini...",
|
|
title: "New Mention"
|
|
}
|
|
|
|
{:ok, activity} = CommonAPI.favorite(user, activity.id)
|
|
|
|
notif = insert(:notification, user: user2, activity: activity, type: "favourite")
|
|
|
|
actor = User.get_cached_by_ap_id(notif.activity.data["actor"])
|
|
object = Object.normalize(activity)
|
|
|
|
assert Impl.build_content(notif, actor, object) == %{
|
|
body: "@Bob has favorited your post",
|
|
title: "New Favorite"
|
|
}
|
|
end
|
|
end
|
|
end
|