Merge branch 'refactor/notification-controller' into 'develop'
Extract notification actions from `MastodonAPIController` into `NotificationController` See merge request pleroma/pleroma!1646
This commit is contained in:
commit
6abe12dced
|
@ -16,7 +16,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
alias Pleroma.Emoji
|
alias Pleroma.Emoji
|
||||||
alias Pleroma.Filter
|
alias Pleroma.Filter
|
||||||
alias Pleroma.HTTP
|
alias Pleroma.HTTP
|
||||||
alias Pleroma.Notification
|
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
alias Pleroma.Pagination
|
alias Pleroma.Pagination
|
||||||
alias Pleroma.Plugs.RateLimiter
|
alias Pleroma.Plugs.RateLimiter
|
||||||
|
@ -35,7 +34,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
alias Pleroma.Web.MastodonAPI.ListView
|
alias Pleroma.Web.MastodonAPI.ListView
|
||||||
alias Pleroma.Web.MastodonAPI.MastodonAPI
|
alias Pleroma.Web.MastodonAPI.MastodonAPI
|
||||||
alias Pleroma.Web.MastodonAPI.MastodonView
|
alias Pleroma.Web.MastodonAPI.MastodonView
|
||||||
alias Pleroma.Web.MastodonAPI.NotificationView
|
|
||||||
alias Pleroma.Web.MastodonAPI.ReportView
|
alias Pleroma.Web.MastodonAPI.ReportView
|
||||||
alias Pleroma.Web.MastodonAPI.ScheduledActivityView
|
alias Pleroma.Web.MastodonAPI.ScheduledActivityView
|
||||||
alias Pleroma.Web.MastodonAPI.StatusView
|
alias Pleroma.Web.MastodonAPI.StatusView
|
||||||
|
@ -715,49 +713,6 @@ def unmute_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def notifications(%{assigns: %{user: user}} = conn, params) do
|
|
||||||
notifications = MastodonAPI.get_notifications(user, params)
|
|
||||||
|
|
||||||
conn
|
|
||||||
|> add_link_headers(notifications)
|
|
||||||
|> put_view(NotificationView)
|
|
||||||
|> render("index.json", %{notifications: notifications, for: user})
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_notification(%{assigns: %{user: user}} = conn, %{"id" => id} = _params) do
|
|
||||||
with {:ok, notification} <- Notification.get(user, id) do
|
|
||||||
conn
|
|
||||||
|> put_view(NotificationView)
|
|
||||||
|> render("show.json", %{notification: notification, for: user})
|
|
||||||
else
|
|
||||||
{:error, reason} ->
|
|
||||||
conn
|
|
||||||
|> put_status(:forbidden)
|
|
||||||
|> json(%{"error" => reason})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def clear_notifications(%{assigns: %{user: user}} = conn, _params) do
|
|
||||||
Notification.clear(user)
|
|
||||||
json(conn, %{})
|
|
||||||
end
|
|
||||||
|
|
||||||
def dismiss_notification(%{assigns: %{user: user}} = conn, %{"id" => id} = _params) do
|
|
||||||
with {:ok, _notif} <- Notification.dismiss(user, id) do
|
|
||||||
json(conn, %{})
|
|
||||||
else
|
|
||||||
{:error, reason} ->
|
|
||||||
conn
|
|
||||||
|> put_status(:forbidden)
|
|
||||||
|> json(%{"error" => reason})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def destroy_multiple(%{assigns: %{user: user}} = conn, %{"ids" => ids} = _params) do
|
|
||||||
Notification.destroy_multiple(user, ids)
|
|
||||||
json(conn, %{})
|
|
||||||
end
|
|
||||||
|
|
||||||
def relationships(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
def relationships(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
id = List.wrap(id)
|
id = List.wrap(id)
|
||||||
q = from(u in User, where: u.id in ^id)
|
q = from(u in User, where: u.id in ^id)
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.MastodonAPI.NotificationController do
|
||||||
|
use Pleroma.Web, :controller
|
||||||
|
|
||||||
|
import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2]
|
||||||
|
|
||||||
|
alias Pleroma.Notification
|
||||||
|
alias Pleroma.Web.MastodonAPI.MastodonAPI
|
||||||
|
|
||||||
|
# GET /api/v1/notifications
|
||||||
|
def index(%{assigns: %{user: user}} = conn, params) do
|
||||||
|
notifications = MastodonAPI.get_notifications(user, params)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> add_link_headers(notifications)
|
||||||
|
|> render("index.json", notifications: notifications, for: user)
|
||||||
|
end
|
||||||
|
|
||||||
|
# GET /api/v1/notifications/:id
|
||||||
|
def show(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
|
with {:ok, notification} <- Notification.get(user, id) do
|
||||||
|
render(conn, "show.json", notification: notification, for: user)
|
||||||
|
else
|
||||||
|
{:error, reason} ->
|
||||||
|
conn
|
||||||
|
|> put_status(:forbidden)
|
||||||
|
|> json(%{"error" => reason})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# POST /api/v1/notifications/clear
|
||||||
|
def clear(%{assigns: %{user: user}} = conn, _params) do
|
||||||
|
Notification.clear(user)
|
||||||
|
json(conn, %{})
|
||||||
|
end
|
||||||
|
|
||||||
|
# POST /api/v1/notifications/dismiss
|
||||||
|
def dismiss(%{assigns: %{user: user}} = conn, %{"id" => id} = _params) do
|
||||||
|
with {:ok, _notif} <- Notification.dismiss(user, id) do
|
||||||
|
json(conn, %{})
|
||||||
|
else
|
||||||
|
{:error, reason} ->
|
||||||
|
conn
|
||||||
|
|> put_status(:forbidden)
|
||||||
|
|> json(%{"error" => reason})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# DELETE /api/v1/notifications/destroy_multiple
|
||||||
|
def destroy_multiple(%{assigns: %{user: user}} = conn, %{"ids" => ids} = _params) do
|
||||||
|
Notification.destroy_multiple(user, ids)
|
||||||
|
json(conn, %{})
|
||||||
|
end
|
||||||
|
end
|
|
@ -325,11 +325,11 @@ defmodule Pleroma.Web.Router do
|
||||||
get("/favourites", MastodonAPIController, :favourites)
|
get("/favourites", MastodonAPIController, :favourites)
|
||||||
get("/bookmarks", MastodonAPIController, :bookmarks)
|
get("/bookmarks", MastodonAPIController, :bookmarks)
|
||||||
|
|
||||||
post("/notifications/clear", MastodonAPIController, :clear_notifications)
|
get("/notifications", NotificationController, :index)
|
||||||
post("/notifications/dismiss", MastodonAPIController, :dismiss_notification)
|
get("/notifications/:id", NotificationController, :show)
|
||||||
get("/notifications", MastodonAPIController, :notifications)
|
post("/notifications/clear", NotificationController, :clear)
|
||||||
get("/notifications/:id", MastodonAPIController, :get_notification)
|
post("/notifications/dismiss", NotificationController, :dismiss)
|
||||||
delete("/notifications/destroy_multiple", MastodonAPIController, :destroy_multiple)
|
delete("/notifications/destroy_multiple", NotificationController, :destroy_multiple)
|
||||||
|
|
||||||
get("/scheduled_statuses", MastodonAPIController, :scheduled_statuses)
|
get("/scheduled_statuses", MastodonAPIController, :scheduled_statuses)
|
||||||
get("/scheduled_statuses/:id", MastodonAPIController, :show_scheduled_status)
|
get("/scheduled_statuses/:id", MastodonAPIController, :show_scheduled_status)
|
||||||
|
|
|
@ -0,0 +1,299 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do
|
||||||
|
use Pleroma.Web.ConnCase
|
||||||
|
|
||||||
|
alias Pleroma.Notification
|
||||||
|
alias Pleroma.Repo
|
||||||
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Web.CommonAPI
|
||||||
|
|
||||||
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
test "list of notifications", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
||||||
|
|
||||||
|
{:ok, [_notification]} = Notification.create_notifications(activity)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> get("/api/v1/notifications")
|
||||||
|
|
||||||
|
expected_response =
|
||||||
|
"hi <span class=\"h-card\"><a data-user=\"#{user.id}\" class=\"u-url mention\" href=\"#{
|
||||||
|
user.ap_id
|
||||||
|
}\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>"
|
||||||
|
|
||||||
|
assert [%{"status" => %{"content" => response}} | _rest] = json_response(conn, 200)
|
||||||
|
assert response == expected_response
|
||||||
|
end
|
||||||
|
|
||||||
|
test "getting a single notification", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
||||||
|
|
||||||
|
{:ok, [notification]} = Notification.create_notifications(activity)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> get("/api/v1/notifications/#{notification.id}")
|
||||||
|
|
||||||
|
expected_response =
|
||||||
|
"hi <span class=\"h-card\"><a data-user=\"#{user.id}\" class=\"u-url mention\" href=\"#{
|
||||||
|
user.ap_id
|
||||||
|
}\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>"
|
||||||
|
|
||||||
|
assert %{"status" => %{"content" => response}} = json_response(conn, 200)
|
||||||
|
assert response == expected_response
|
||||||
|
end
|
||||||
|
|
||||||
|
test "dismissing a single notification", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
||||||
|
|
||||||
|
{:ok, [notification]} = Notification.create_notifications(activity)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> post("/api/v1/notifications/dismiss", %{"id" => notification.id})
|
||||||
|
|
||||||
|
assert %{} = json_response(conn, 200)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "clearing all notifications", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
||||||
|
|
||||||
|
{:ok, [_notification]} = Notification.create_notifications(activity)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> post("/api/v1/notifications/clear")
|
||||||
|
|
||||||
|
assert %{} = json_response(conn, 200)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
build_conn()
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> get("/api/v1/notifications")
|
||||||
|
|
||||||
|
assert all = json_response(conn, 200)
|
||||||
|
assert all == []
|
||||||
|
end
|
||||||
|
|
||||||
|
test "paginates notifications using min_id, since_id, max_id, and limit", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity1} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
||||||
|
{:ok, activity2} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
||||||
|
{:ok, activity3} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
||||||
|
{:ok, activity4} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
||||||
|
|
||||||
|
notification1_id = get_notification_id_by_activity(activity1)
|
||||||
|
notification2_id = get_notification_id_by_activity(activity2)
|
||||||
|
notification3_id = get_notification_id_by_activity(activity3)
|
||||||
|
notification4_id = get_notification_id_by_activity(activity4)
|
||||||
|
|
||||||
|
conn = assign(conn, :user, user)
|
||||||
|
|
||||||
|
# min_id
|
||||||
|
result =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/notifications?limit=2&min_id=#{notification1_id}")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result
|
||||||
|
|
||||||
|
# since_id
|
||||||
|
result =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/notifications?limit=2&since_id=#{notification1_id}")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
|
||||||
|
|
||||||
|
# max_id
|
||||||
|
result =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/notifications?limit=2&max_id=#{notification4_id}")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result
|
||||||
|
end
|
||||||
|
|
||||||
|
test "filters notifications using exclude_types", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, mention_activity} = CommonAPI.post(other_user, %{"status" => "hey @#{user.nickname}"})
|
||||||
|
{:ok, create_activity} = CommonAPI.post(user, %{"status" => "hey"})
|
||||||
|
{:ok, favorite_activity, _} = CommonAPI.favorite(create_activity.id, other_user)
|
||||||
|
{:ok, reblog_activity, _} = CommonAPI.repeat(create_activity.id, other_user)
|
||||||
|
{:ok, _, _, follow_activity} = CommonAPI.follow(other_user, user)
|
||||||
|
|
||||||
|
mention_notification_id = get_notification_id_by_activity(mention_activity)
|
||||||
|
favorite_notification_id = get_notification_id_by_activity(favorite_activity)
|
||||||
|
reblog_notification_id = get_notification_id_by_activity(reblog_activity)
|
||||||
|
follow_notification_id = get_notification_id_by_activity(follow_activity)
|
||||||
|
|
||||||
|
conn = assign(conn, :user, user)
|
||||||
|
|
||||||
|
conn_res =
|
||||||
|
get(conn, "/api/v1/notifications", %{exclude_types: ["mention", "favourite", "reblog"]})
|
||||||
|
|
||||||
|
assert [%{"id" => ^follow_notification_id}] = json_response(conn_res, 200)
|
||||||
|
|
||||||
|
conn_res =
|
||||||
|
get(conn, "/api/v1/notifications", %{exclude_types: ["favourite", "reblog", "follow"]})
|
||||||
|
|
||||||
|
assert [%{"id" => ^mention_notification_id}] = json_response(conn_res, 200)
|
||||||
|
|
||||||
|
conn_res =
|
||||||
|
get(conn, "/api/v1/notifications", %{exclude_types: ["reblog", "follow", "mention"]})
|
||||||
|
|
||||||
|
assert [%{"id" => ^favorite_notification_id}] = json_response(conn_res, 200)
|
||||||
|
|
||||||
|
conn_res =
|
||||||
|
get(conn, "/api/v1/notifications", %{exclude_types: ["follow", "mention", "favourite"]})
|
||||||
|
|
||||||
|
assert [%{"id" => ^reblog_notification_id}] = json_response(conn_res, 200)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "destroy multiple", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity1} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
||||||
|
{:ok, activity2} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
||||||
|
{:ok, activity3} = CommonAPI.post(user, %{"status" => "hi @#{other_user.nickname}"})
|
||||||
|
{:ok, activity4} = CommonAPI.post(user, %{"status" => "hi @#{other_user.nickname}"})
|
||||||
|
|
||||||
|
notification1_id = get_notification_id_by_activity(activity1)
|
||||||
|
notification2_id = get_notification_id_by_activity(activity2)
|
||||||
|
notification3_id = get_notification_id_by_activity(activity3)
|
||||||
|
notification4_id = get_notification_id_by_activity(activity4)
|
||||||
|
|
||||||
|
conn = assign(conn, :user, user)
|
||||||
|
|
||||||
|
result =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/notifications")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert [%{"id" => ^notification2_id}, %{"id" => ^notification1_id}] = result
|
||||||
|
|
||||||
|
conn2 =
|
||||||
|
conn
|
||||||
|
|> assign(:user, other_user)
|
||||||
|
|
||||||
|
result =
|
||||||
|
conn2
|
||||||
|
|> get("/api/v1/notifications")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
|
||||||
|
|
||||||
|
conn_destroy =
|
||||||
|
conn
|
||||||
|
|> delete("/api/v1/notifications/destroy_multiple", %{
|
||||||
|
"ids" => [notification1_id, notification2_id]
|
||||||
|
})
|
||||||
|
|
||||||
|
assert json_response(conn_destroy, 200) == %{}
|
||||||
|
|
||||||
|
result =
|
||||||
|
conn2
|
||||||
|
|> get("/api/v1/notifications")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
|
||||||
|
end
|
||||||
|
|
||||||
|
test "doesn't see notifications after muting user with notifications", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
user2 = insert(:user)
|
||||||
|
|
||||||
|
{:ok, _, _, _} = CommonAPI.follow(user, user2)
|
||||||
|
{:ok, _} = CommonAPI.post(user2, %{"status" => "hey @#{user.nickname}"})
|
||||||
|
|
||||||
|
conn = assign(conn, :user, user)
|
||||||
|
|
||||||
|
conn = get(conn, "/api/v1/notifications")
|
||||||
|
|
||||||
|
assert length(json_response(conn, 200)) == 1
|
||||||
|
|
||||||
|
{:ok, user} = User.mute(user, user2)
|
||||||
|
|
||||||
|
conn = assign(build_conn(), :user, user)
|
||||||
|
conn = get(conn, "/api/v1/notifications")
|
||||||
|
|
||||||
|
assert json_response(conn, 200) == []
|
||||||
|
end
|
||||||
|
|
||||||
|
test "see notifications after muting user without notifications", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
user2 = insert(:user)
|
||||||
|
|
||||||
|
{:ok, _, _, _} = CommonAPI.follow(user, user2)
|
||||||
|
{:ok, _} = CommonAPI.post(user2, %{"status" => "hey @#{user.nickname}"})
|
||||||
|
|
||||||
|
conn = assign(conn, :user, user)
|
||||||
|
|
||||||
|
conn = get(conn, "/api/v1/notifications")
|
||||||
|
|
||||||
|
assert length(json_response(conn, 200)) == 1
|
||||||
|
|
||||||
|
{:ok, user} = User.mute(user, user2, false)
|
||||||
|
|
||||||
|
conn = assign(build_conn(), :user, user)
|
||||||
|
conn = get(conn, "/api/v1/notifications")
|
||||||
|
|
||||||
|
assert length(json_response(conn, 200)) == 1
|
||||||
|
end
|
||||||
|
|
||||||
|
test "see notifications after muting user with notifications and with_muted parameter", %{
|
||||||
|
conn: conn
|
||||||
|
} do
|
||||||
|
user = insert(:user)
|
||||||
|
user2 = insert(:user)
|
||||||
|
|
||||||
|
{:ok, _, _, _} = CommonAPI.follow(user, user2)
|
||||||
|
{:ok, _} = CommonAPI.post(user2, %{"status" => "hey @#{user.nickname}"})
|
||||||
|
|
||||||
|
conn = assign(conn, :user, user)
|
||||||
|
|
||||||
|
conn = get(conn, "/api/v1/notifications")
|
||||||
|
|
||||||
|
assert length(json_response(conn, 200)) == 1
|
||||||
|
|
||||||
|
{:ok, user} = User.mute(user, user2)
|
||||||
|
|
||||||
|
conn = assign(build_conn(), :user, user)
|
||||||
|
conn = get(conn, "/api/v1/notifications", %{"with_muted" => "true"})
|
||||||
|
|
||||||
|
assert length(json_response(conn, 200)) == 1
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_notification_id_by_activity(%{id: id}) do
|
||||||
|
Notification
|
||||||
|
|> Repo.get_by(activity_id: id)
|
||||||
|
|> Map.get(:id)
|
||||||
|
|> to_string()
|
||||||
|
end
|
||||||
|
end
|
|
@ -999,299 +999,6 @@ test "list timeline does not leak non-public statuses for unfollowed users", %{c
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "notifications" do
|
|
||||||
test "list of notifications", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
other_user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
|
||||||
|
|
||||||
{:ok, [_notification]} = Notification.create_notifications(activity)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/notifications")
|
|
||||||
|
|
||||||
expected_response =
|
|
||||||
~s(hi <span class="h-card"><a data-user="#{user.id}" class="u-url mention" href="#{
|
|
||||||
user.ap_id
|
|
||||||
}" rel="ugc">@<span>#{user.nickname}</span></a></span>)
|
|
||||||
|
|
||||||
assert [%{"status" => %{"content" => response}} | _rest] = json_response(conn, 200)
|
|
||||||
assert response == expected_response
|
|
||||||
end
|
|
||||||
|
|
||||||
test "getting a single notification", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
other_user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
|
||||||
|
|
||||||
{:ok, [notification]} = Notification.create_notifications(activity)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/notifications/#{notification.id}")
|
|
||||||
|
|
||||||
expected_response =
|
|
||||||
~s(hi <span class="h-card"><a data-user="#{user.id}" class="u-url mention" href="#{
|
|
||||||
user.ap_id
|
|
||||||
}" rel="ugc">@<span>#{user.nickname}</span></a></span>)
|
|
||||||
|
|
||||||
assert %{"status" => %{"content" => response}} = json_response(conn, 200)
|
|
||||||
assert response == expected_response
|
|
||||||
end
|
|
||||||
|
|
||||||
test "dismissing a single notification", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
other_user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
|
||||||
|
|
||||||
{:ok, [notification]} = Notification.create_notifications(activity)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> post("/api/v1/notifications/dismiss", %{"id" => notification.id})
|
|
||||||
|
|
||||||
assert %{} = json_response(conn, 200)
|
|
||||||
end
|
|
||||||
|
|
||||||
test "clearing all notifications", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
other_user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
|
||||||
|
|
||||||
{:ok, [_notification]} = Notification.create_notifications(activity)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> post("/api/v1/notifications/clear")
|
|
||||||
|
|
||||||
assert %{} = json_response(conn, 200)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
build_conn()
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/notifications")
|
|
||||||
|
|
||||||
assert all = json_response(conn, 200)
|
|
||||||
assert all == []
|
|
||||||
end
|
|
||||||
|
|
||||||
test "paginates notifications using min_id, since_id, max_id, and limit", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
other_user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, activity1} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
|
||||||
{:ok, activity2} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
|
||||||
{:ok, activity3} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
|
||||||
{:ok, activity4} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
|
||||||
|
|
||||||
notification1_id = Repo.get_by(Notification, activity_id: activity1.id).id |> to_string()
|
|
||||||
notification2_id = Repo.get_by(Notification, activity_id: activity2.id).id |> to_string()
|
|
||||||
notification3_id = Repo.get_by(Notification, activity_id: activity3.id).id |> to_string()
|
|
||||||
notification4_id = Repo.get_by(Notification, activity_id: activity4.id).id |> to_string()
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|
|
||||||
# min_id
|
|
||||||
conn_res =
|
|
||||||
conn
|
|
||||||
|> get("/api/v1/notifications?limit=2&min_id=#{notification1_id}")
|
|
||||||
|
|
||||||
result = json_response(conn_res, 200)
|
|
||||||
assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result
|
|
||||||
|
|
||||||
# since_id
|
|
||||||
conn_res =
|
|
||||||
conn
|
|
||||||
|> get("/api/v1/notifications?limit=2&since_id=#{notification1_id}")
|
|
||||||
|
|
||||||
result = json_response(conn_res, 200)
|
|
||||||
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
|
|
||||||
|
|
||||||
# max_id
|
|
||||||
conn_res =
|
|
||||||
conn
|
|
||||||
|> get("/api/v1/notifications?limit=2&max_id=#{notification4_id}")
|
|
||||||
|
|
||||||
result = json_response(conn_res, 200)
|
|
||||||
assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result
|
|
||||||
end
|
|
||||||
|
|
||||||
test "filters notifications using exclude_types", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
other_user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, mention_activity} = CommonAPI.post(other_user, %{"status" => "hey @#{user.nickname}"})
|
|
||||||
{:ok, create_activity} = CommonAPI.post(user, %{"status" => "hey"})
|
|
||||||
{:ok, favorite_activity, _} = CommonAPI.favorite(create_activity.id, other_user)
|
|
||||||
{:ok, reblog_activity, _} = CommonAPI.repeat(create_activity.id, other_user)
|
|
||||||
{:ok, _, _, follow_activity} = CommonAPI.follow(other_user, user)
|
|
||||||
|
|
||||||
mention_notification_id =
|
|
||||||
Repo.get_by(Notification, activity_id: mention_activity.id).id |> to_string()
|
|
||||||
|
|
||||||
favorite_notification_id =
|
|
||||||
Repo.get_by(Notification, activity_id: favorite_activity.id).id |> to_string()
|
|
||||||
|
|
||||||
reblog_notification_id =
|
|
||||||
Repo.get_by(Notification, activity_id: reblog_activity.id).id |> to_string()
|
|
||||||
|
|
||||||
follow_notification_id =
|
|
||||||
Repo.get_by(Notification, activity_id: follow_activity.id).id |> to_string()
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|
|
||||||
conn_res =
|
|
||||||
get(conn, "/api/v1/notifications", %{exclude_types: ["mention", "favourite", "reblog"]})
|
|
||||||
|
|
||||||
assert [%{"id" => ^follow_notification_id}] = json_response(conn_res, 200)
|
|
||||||
|
|
||||||
conn_res =
|
|
||||||
get(conn, "/api/v1/notifications", %{exclude_types: ["favourite", "reblog", "follow"]})
|
|
||||||
|
|
||||||
assert [%{"id" => ^mention_notification_id}] = json_response(conn_res, 200)
|
|
||||||
|
|
||||||
conn_res =
|
|
||||||
get(conn, "/api/v1/notifications", %{exclude_types: ["reblog", "follow", "mention"]})
|
|
||||||
|
|
||||||
assert [%{"id" => ^favorite_notification_id}] = json_response(conn_res, 200)
|
|
||||||
|
|
||||||
conn_res =
|
|
||||||
get(conn, "/api/v1/notifications", %{exclude_types: ["follow", "mention", "favourite"]})
|
|
||||||
|
|
||||||
assert [%{"id" => ^reblog_notification_id}] = json_response(conn_res, 200)
|
|
||||||
end
|
|
||||||
|
|
||||||
test "destroy multiple", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
other_user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, activity1} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
|
||||||
{:ok, activity2} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
|
|
||||||
{:ok, activity3} = CommonAPI.post(user, %{"status" => "hi @#{other_user.nickname}"})
|
|
||||||
{:ok, activity4} = CommonAPI.post(user, %{"status" => "hi @#{other_user.nickname}"})
|
|
||||||
|
|
||||||
notification1_id = Repo.get_by(Notification, activity_id: activity1.id).id |> to_string()
|
|
||||||
notification2_id = Repo.get_by(Notification, activity_id: activity2.id).id |> to_string()
|
|
||||||
notification3_id = Repo.get_by(Notification, activity_id: activity3.id).id |> to_string()
|
|
||||||
notification4_id = Repo.get_by(Notification, activity_id: activity4.id).id |> to_string()
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|
|
||||||
conn_res =
|
|
||||||
conn
|
|
||||||
|> get("/api/v1/notifications")
|
|
||||||
|
|
||||||
result = json_response(conn_res, 200)
|
|
||||||
assert [%{"id" => ^notification2_id}, %{"id" => ^notification1_id}] = result
|
|
||||||
|
|
||||||
conn2 =
|
|
||||||
conn
|
|
||||||
|> assign(:user, other_user)
|
|
||||||
|
|
||||||
conn_res =
|
|
||||||
conn2
|
|
||||||
|> get("/api/v1/notifications")
|
|
||||||
|
|
||||||
result = json_response(conn_res, 200)
|
|
||||||
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
|
|
||||||
|
|
||||||
conn_destroy =
|
|
||||||
conn
|
|
||||||
|> delete("/api/v1/notifications/destroy_multiple", %{
|
|
||||||
"ids" => [notification1_id, notification2_id]
|
|
||||||
})
|
|
||||||
|
|
||||||
assert json_response(conn_destroy, 200) == %{}
|
|
||||||
|
|
||||||
conn_res =
|
|
||||||
conn2
|
|
||||||
|> get("/api/v1/notifications")
|
|
||||||
|
|
||||||
result = json_response(conn_res, 200)
|
|
||||||
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
|
|
||||||
end
|
|
||||||
|
|
||||||
test "doesn't see notifications after muting user with notifications", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
user2 = insert(:user)
|
|
||||||
|
|
||||||
{:ok, _, _, _} = CommonAPI.follow(user, user2)
|
|
||||||
{:ok, _} = CommonAPI.post(user2, %{"status" => "hey @#{user.nickname}"})
|
|
||||||
|
|
||||||
conn = assign(conn, :user, user)
|
|
||||||
|
|
||||||
conn = get(conn, "/api/v1/notifications")
|
|
||||||
|
|
||||||
assert length(json_response(conn, 200)) == 1
|
|
||||||
|
|
||||||
{:ok, user} = User.mute(user, user2)
|
|
||||||
|
|
||||||
conn = assign(build_conn(), :user, user)
|
|
||||||
conn = get(conn, "/api/v1/notifications")
|
|
||||||
|
|
||||||
assert json_response(conn, 200) == []
|
|
||||||
end
|
|
||||||
|
|
||||||
test "see notifications after muting user without notifications", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
user2 = insert(:user)
|
|
||||||
|
|
||||||
{:ok, _, _, _} = CommonAPI.follow(user, user2)
|
|
||||||
{:ok, _} = CommonAPI.post(user2, %{"status" => "hey @#{user.nickname}"})
|
|
||||||
|
|
||||||
conn = assign(conn, :user, user)
|
|
||||||
|
|
||||||
conn = get(conn, "/api/v1/notifications")
|
|
||||||
|
|
||||||
assert length(json_response(conn, 200)) == 1
|
|
||||||
|
|
||||||
{:ok, user} = User.mute(user, user2, false)
|
|
||||||
|
|
||||||
conn = assign(build_conn(), :user, user)
|
|
||||||
conn = get(conn, "/api/v1/notifications")
|
|
||||||
|
|
||||||
assert length(json_response(conn, 200)) == 1
|
|
||||||
end
|
|
||||||
|
|
||||||
test "see notifications after muting user with notifications and with_muted parameter", %{
|
|
||||||
conn: conn
|
|
||||||
} do
|
|
||||||
user = insert(:user)
|
|
||||||
user2 = insert(:user)
|
|
||||||
|
|
||||||
{:ok, _, _, _} = CommonAPI.follow(user, user2)
|
|
||||||
{:ok, _} = CommonAPI.post(user2, %{"status" => "hey @#{user.nickname}"})
|
|
||||||
|
|
||||||
conn = assign(conn, :user, user)
|
|
||||||
|
|
||||||
conn = get(conn, "/api/v1/notifications")
|
|
||||||
|
|
||||||
assert length(json_response(conn, 200)) == 1
|
|
||||||
|
|
||||||
{:ok, user} = User.mute(user, user2)
|
|
||||||
|
|
||||||
conn = assign(build_conn(), :user, user)
|
|
||||||
conn = get(conn, "/api/v1/notifications", %{"with_muted" => "true"})
|
|
||||||
|
|
||||||
assert length(json_response(conn, 200)) == 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "reblogging" do
|
describe "reblogging" do
|
||||||
test "reblogs and returns the reblogged status", %{conn: conn} do
|
test "reblogs and returns the reblogged status", %{conn: conn} do
|
||||||
activity = insert(:note_activity)
|
activity = insert(:note_activity)
|
||||||
|
|
Loading…
Reference in New Issue