@@ -16,7 +16,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do | |||||
alias Pleroma.Filter | alias Pleroma.Filter | ||||
alias Pleroma.Formatter | alias Pleroma.Formatter | ||||
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 | ||||
@@ -722,49 +720,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController 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 |
@@ -324,11 +324,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) | |||||
post("/notifications/dismiss", MastodonAPIController, :dismiss_notification) | |||||
get("/notifications", MastodonAPIController, :notifications) | |||||
get("/notifications/:id", MastodonAPIController, :get_notification) | |||||
delete("/notifications/destroy_multiple", MastodonAPIController, :destroy_multiple) | |||||
get("/notifications", NotificationController, :index) | |||||
get("/notifications/:id", NotificationController, :show) | |||||
post("/notifications/clear", NotificationController, :clear) | |||||
post("/notifications/dismiss", NotificationController, :dismiss) | |||||
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 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | |||||
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) | ||||