Merge branch 'openapi/notifications' into 'develop'
Add OpenAPI spec for NotificationController See merge request pleroma/pleroma!2437
This commit is contained in:
commit
3370bb0e46
|
@ -46,4 +46,12 @@ def pagination_params do
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def empty_object_response do
|
||||||
|
Operation.response("Empty object", "application/json", %Schema{type: :object, example: %{}})
|
||||||
|
end
|
||||||
|
|
||||||
|
def empty_array_response do
|
||||||
|
Operation.response("Empty array", "application/json", %Schema{type: :array, example: []})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -344,7 +344,7 @@ def endorsements_operation do
|
||||||
description: "Not implemented",
|
description: "Not implemented",
|
||||||
security: [%{"oAuth" => ["read:accounts"]}],
|
security: [%{"oAuth" => ["read:accounts"]}],
|
||||||
responses: %{
|
responses: %{
|
||||||
200 => Operation.response("Empry array", "application/json", %Schema{type: :array})
|
200 => empty_array_response()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
@ -356,7 +356,7 @@ def identity_proofs_operation do
|
||||||
operationId: "AccountController.identity_proofs",
|
operationId: "AccountController.identity_proofs",
|
||||||
description: "Not implemented",
|
description: "Not implemented",
|
||||||
responses: %{
|
responses: %{
|
||||||
200 => Operation.response("Empry array", "application/json", %Schema{type: :array})
|
200 => empty_array_response()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
defmodule Pleroma.Web.ApiSpec.DomainBlockOperation do
|
defmodule Pleroma.Web.ApiSpec.DomainBlockOperation do
|
||||||
alias OpenApiSpex.Operation
|
alias OpenApiSpex.Operation
|
||||||
alias OpenApiSpex.Schema
|
alias OpenApiSpex.Schema
|
||||||
alias Pleroma.Web.ApiSpec.Helpers
|
import Pleroma.Web.ApiSpec.Helpers
|
||||||
|
|
||||||
def open_api_operation(action) do
|
def open_api_operation(action) do
|
||||||
operation = String.to_existing_atom("#{action}_operation")
|
operation = String.to_existing_atom("#{action}_operation")
|
||||||
|
@ -46,9 +46,7 @@ def create_operation do
|
||||||
operationId: "DomainBlockController.create",
|
operationId: "DomainBlockController.create",
|
||||||
requestBody: domain_block_request(),
|
requestBody: domain_block_request(),
|
||||||
security: [%{"oAuth" => ["follow", "write:blocks"]}],
|
security: [%{"oAuth" => ["follow", "write:blocks"]}],
|
||||||
responses: %{
|
responses: %{200 => empty_object_response()}
|
||||||
200 => Operation.response("Empty object", "application/json", %Schema{type: :object})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -67,7 +65,7 @@ def delete_operation do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp domain_block_request do
|
defp domain_block_request do
|
||||||
Helpers.request_body(
|
request_body(
|
||||||
"Parameters",
|
"Parameters",
|
||||||
%Schema{
|
%Schema{
|
||||||
type: :object,
|
type: :object,
|
||||||
|
|
202
lib/pleroma/web/api_spec/operations/notification_operation.ex
Normal file
202
lib/pleroma/web/api_spec/operations/notification_operation.ex
Normal file
|
@ -0,0 +1,202 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.ApiSpec.NotificationOperation do
|
||||||
|
alias OpenApiSpex.Operation
|
||||||
|
alias OpenApiSpex.Operation
|
||||||
|
alias OpenApiSpex.Schema
|
||||||
|
alias Pleroma.Web.ApiSpec.Schemas.Account
|
||||||
|
alias Pleroma.Web.ApiSpec.Schemas.ApiError
|
||||||
|
alias Pleroma.Web.ApiSpec.Schemas.BooleanLike
|
||||||
|
alias Pleroma.Web.ApiSpec.Schemas.Status
|
||||||
|
alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope
|
||||||
|
|
||||||
|
import Pleroma.Web.ApiSpec.Helpers
|
||||||
|
|
||||||
|
def open_api_operation(action) do
|
||||||
|
operation = String.to_existing_atom("#{action}_operation")
|
||||||
|
apply(__MODULE__, operation, [])
|
||||||
|
end
|
||||||
|
|
||||||
|
def index_operation do
|
||||||
|
%Operation{
|
||||||
|
tags: ["Notifications"],
|
||||||
|
summary: "Get all notifications",
|
||||||
|
description:
|
||||||
|
"Notifications concerning the user. This API returns Link headers containing links to the next/previous page. However, the links can also be constructed dynamically using query params and `id` values.",
|
||||||
|
operationId: "NotificationController.index",
|
||||||
|
security: [%{"oAuth" => ["read:notifications"]}],
|
||||||
|
parameters:
|
||||||
|
[
|
||||||
|
Operation.parameter(
|
||||||
|
:exclude_types,
|
||||||
|
:query,
|
||||||
|
%Schema{type: :array, items: notification_type()},
|
||||||
|
"Array of types to exclude"
|
||||||
|
),
|
||||||
|
Operation.parameter(
|
||||||
|
:account_id,
|
||||||
|
:query,
|
||||||
|
%Schema{type: :string},
|
||||||
|
"Return only notifications received from this account"
|
||||||
|
),
|
||||||
|
Operation.parameter(
|
||||||
|
:exclude_visibilities,
|
||||||
|
:query,
|
||||||
|
%Schema{type: :array, items: VisibilityScope},
|
||||||
|
"Exclude the notifications for activities with the given visibilities"
|
||||||
|
),
|
||||||
|
Operation.parameter(
|
||||||
|
:include_types,
|
||||||
|
:query,
|
||||||
|
%Schema{type: :array, items: notification_type()},
|
||||||
|
"Include the notifications for activities with the given types"
|
||||||
|
),
|
||||||
|
Operation.parameter(
|
||||||
|
:with_muted,
|
||||||
|
:query,
|
||||||
|
BooleanLike,
|
||||||
|
"Include the notifications from muted users"
|
||||||
|
)
|
||||||
|
] ++ pagination_params(),
|
||||||
|
responses: %{
|
||||||
|
200 =>
|
||||||
|
Operation.response("Array of notifications", "application/json", %Schema{
|
||||||
|
type: :array,
|
||||||
|
items: notification()
|
||||||
|
}),
|
||||||
|
404 => Operation.response("Error", "application/json", ApiError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_operation do
|
||||||
|
%Operation{
|
||||||
|
tags: ["Notifications"],
|
||||||
|
summary: "Get a single notification",
|
||||||
|
description: "View information about a notification with a given ID.",
|
||||||
|
operationId: "NotificationController.show",
|
||||||
|
security: [%{"oAuth" => ["read:notifications"]}],
|
||||||
|
parameters: [id_param()],
|
||||||
|
responses: %{
|
||||||
|
200 => Operation.response("Notification", "application/json", notification())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def clear_operation do
|
||||||
|
%Operation{
|
||||||
|
tags: ["Notifications"],
|
||||||
|
summary: "Dismiss all notifications",
|
||||||
|
description: "Clear all notifications from the server.",
|
||||||
|
operationId: "NotificationController.clear",
|
||||||
|
security: [%{"oAuth" => ["write:notifications"]}],
|
||||||
|
responses: %{200 => empty_object_response()}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def dismiss_operation do
|
||||||
|
%Operation{
|
||||||
|
tags: ["Notifications"],
|
||||||
|
summary: "Dismiss a single notification",
|
||||||
|
description: "Clear a single notification from the server.",
|
||||||
|
operationId: "NotificationController.dismiss",
|
||||||
|
parameters: [id_param()],
|
||||||
|
security: [%{"oAuth" => ["write:notifications"]}],
|
||||||
|
responses: %{200 => empty_object_response()}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def dismiss_via_body_operation do
|
||||||
|
%Operation{
|
||||||
|
tags: ["Notifications"],
|
||||||
|
summary: "Dismiss a single notification",
|
||||||
|
deprecated: true,
|
||||||
|
description: "Clear a single notification from the server.",
|
||||||
|
operationId: "NotificationController.dismiss_via_body",
|
||||||
|
requestBody:
|
||||||
|
request_body(
|
||||||
|
"Parameters",
|
||||||
|
%Schema{type: :object, properties: %{id: %Schema{type: :string}}},
|
||||||
|
required: true
|
||||||
|
),
|
||||||
|
security: [%{"oAuth" => ["write:notifications"]}],
|
||||||
|
responses: %{200 => empty_object_response()}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy_multiple_operation do
|
||||||
|
%Operation{
|
||||||
|
tags: ["Notifications"],
|
||||||
|
summary: "Dismiss multiple notifications",
|
||||||
|
operationId: "NotificationController.destroy_multiple",
|
||||||
|
security: [%{"oAuth" => ["write:notifications"]}],
|
||||||
|
parameters: [
|
||||||
|
Operation.parameter(
|
||||||
|
:ids,
|
||||||
|
:query,
|
||||||
|
%Schema{type: :array, items: %Schema{type: :string}},
|
||||||
|
"Array of notification IDs to dismiss",
|
||||||
|
required: true
|
||||||
|
)
|
||||||
|
],
|
||||||
|
responses: %{200 => empty_object_response()}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp notification do
|
||||||
|
%Schema{
|
||||||
|
title: "Notification",
|
||||||
|
description: "Response schema for a notification",
|
||||||
|
type: :object,
|
||||||
|
properties: %{
|
||||||
|
id: %Schema{type: :string},
|
||||||
|
type: notification_type(),
|
||||||
|
created_at: %Schema{type: :string, format: :"date-time"},
|
||||||
|
account: %Schema{
|
||||||
|
allOf: [Account],
|
||||||
|
description: "The account that performed the action that generated the notification."
|
||||||
|
},
|
||||||
|
status: %Schema{
|
||||||
|
allOf: [Status],
|
||||||
|
description:
|
||||||
|
"Status that was the object of the notification, e.g. in mentions, reblogs, favourites, or polls.",
|
||||||
|
nullable: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
example: %{
|
||||||
|
"id" => "34975861",
|
||||||
|
"type" => "mention",
|
||||||
|
"created_at" => "2019-11-23T07:49:02.064Z",
|
||||||
|
"account" => Account.schema().example,
|
||||||
|
"status" => Status.schema().example
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp notification_type do
|
||||||
|
%Schema{
|
||||||
|
type: :string,
|
||||||
|
enum: ["follow", "favourite", "reblog", "mention", "poll", "pleroma:emoji_reaction", "move"],
|
||||||
|
description: """
|
||||||
|
The type of event that resulted in the notification.
|
||||||
|
|
||||||
|
- `follow` - Someone followed you
|
||||||
|
- `mention` - Someone mentioned you in their status
|
||||||
|
- `reblog` - Someone boosted one of your statuses
|
||||||
|
- `favourite` - Someone favourited one of your statuses
|
||||||
|
- `poll` - A poll you have voted in or created has ended
|
||||||
|
- `move` - Someone moved their account
|
||||||
|
- `pleroma:emoji_reaction` - Someone reacted with emoji to your status
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp id_param do
|
||||||
|
Operation.parameter(:id, :path, :string, "Notification ID",
|
||||||
|
example: "123",
|
||||||
|
required: true
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
|
@ -13,6 +13,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationController do
|
||||||
|
|
||||||
@oauth_read_actions [:show, :index]
|
@oauth_read_actions [:show, :index]
|
||||||
|
|
||||||
|
plug(OpenApiSpex.Plug.CastAndValidate, render_error: Pleroma.Web.ApiSpec.RenderError)
|
||||||
|
|
||||||
plug(
|
plug(
|
||||||
OAuthScopesPlug,
|
OAuthScopesPlug,
|
||||||
%{scopes: ["read:notifications"]} when action in @oauth_read_actions
|
%{scopes: ["read:notifications"]} when action in @oauth_read_actions
|
||||||
|
@ -20,14 +22,16 @@ defmodule Pleroma.Web.MastodonAPI.NotificationController do
|
||||||
|
|
||||||
plug(OAuthScopesPlug, %{scopes: ["write:notifications"]} when action not in @oauth_read_actions)
|
plug(OAuthScopesPlug, %{scopes: ["write:notifications"]} when action not in @oauth_read_actions)
|
||||||
|
|
||||||
|
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.NotificationOperation
|
||||||
|
|
||||||
# GET /api/v1/notifications
|
# GET /api/v1/notifications
|
||||||
def index(conn, %{"account_id" => account_id} = params) do
|
def index(conn, %{account_id: account_id} = params) do
|
||||||
case Pleroma.User.get_cached_by_id(account_id) do
|
case Pleroma.User.get_cached_by_id(account_id) do
|
||||||
%{ap_id: account_ap_id} ->
|
%{ap_id: account_ap_id} ->
|
||||||
params =
|
params =
|
||||||
params
|
params
|
||||||
|> Map.delete("account_id")
|
|> Map.delete(:account_id)
|
||||||
|> Map.put("account_ap_id", account_ap_id)
|
|> Map.put(:account_ap_id, account_ap_id)
|
||||||
|
|
||||||
index(conn, params)
|
index(conn, params)
|
||||||
|
|
||||||
|
@ -39,6 +43,7 @@ def index(conn, %{"account_id" => account_id} = params) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def index(%{assigns: %{user: user}} = conn, params) do
|
def index(%{assigns: %{user: user}} = conn, params) do
|
||||||
|
params = Map.new(params, fn {k, v} -> {to_string(k), v} end)
|
||||||
notifications = MastodonAPI.get_notifications(user, params)
|
notifications = MastodonAPI.get_notifications(user, params)
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|
@ -51,7 +56,7 @@ def index(%{assigns: %{user: user}} = conn, params) do
|
||||||
end
|
end
|
||||||
|
|
||||||
# GET /api/v1/notifications/:id
|
# GET /api/v1/notifications/:id
|
||||||
def show(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
def show(%{assigns: %{user: user}} = conn, %{id: id}) do
|
||||||
with {:ok, notification} <- Notification.get(user, id) do
|
with {:ok, notification} <- Notification.get(user, id) do
|
||||||
render(conn, "show.json", notification: notification, for: user)
|
render(conn, "show.json", notification: notification, for: user)
|
||||||
else
|
else
|
||||||
|
@ -69,8 +74,8 @@ def clear(%{assigns: %{user: user}} = conn, _params) do
|
||||||
end
|
end
|
||||||
|
|
||||||
# POST /api/v1/notifications/:id/dismiss
|
# POST /api/v1/notifications/:id/dismiss
|
||||||
# POST /api/v1/notifications/dismiss (deprecated)
|
|
||||||
def dismiss(%{assigns: %{user: user}} = conn, %{"id" => id} = _params) do
|
def dismiss(%{assigns: %{user: user}} = conn, %{id: id} = _params) do
|
||||||
with {:ok, _notif} <- Notification.dismiss(user, id) do
|
with {:ok, _notif} <- Notification.dismiss(user, id) do
|
||||||
json(conn, %{})
|
json(conn, %{})
|
||||||
else
|
else
|
||||||
|
@ -81,8 +86,13 @@ def dismiss(%{assigns: %{user: user}} = conn, %{"id" => id} = _params) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# POST /api/v1/notifications/dismiss (deprecated)
|
||||||
|
def dismiss_via_body(%{body_params: params} = conn, _) do
|
||||||
|
dismiss(conn, params)
|
||||||
|
end
|
||||||
|
|
||||||
# DELETE /api/v1/notifications/destroy_multiple
|
# DELETE /api/v1/notifications/destroy_multiple
|
||||||
def destroy_multiple(%{assigns: %{user: user}} = conn, %{"ids" => ids} = _params) do
|
def destroy_multiple(%{assigns: %{user: user}} = conn, %{ids: ids} = _params) do
|
||||||
Notification.destroy_multiple(user, ids)
|
Notification.destroy_multiple(user, ids)
|
||||||
json(conn, %{})
|
json(conn, %{})
|
||||||
end
|
end
|
||||||
|
|
|
@ -396,7 +396,7 @@ defmodule Pleroma.Web.Router do
|
||||||
post("/notifications/clear", NotificationController, :clear)
|
post("/notifications/clear", NotificationController, :clear)
|
||||||
delete("/notifications/destroy_multiple", NotificationController, :destroy_multiple)
|
delete("/notifications/destroy_multiple", NotificationController, :destroy_multiple)
|
||||||
# Deprecated: was removed in Mastodon v3, use `/notifications/:id/dismiss` instead
|
# Deprecated: was removed in Mastodon v3, use `/notifications/:id/dismiss` instead
|
||||||
post("/notifications/dismiss", NotificationController, :dismiss)
|
post("/notifications/dismiss", NotificationController, :dismiss_via_body)
|
||||||
|
|
||||||
post("/polls/:id/votes", PollController, :vote)
|
post("/polls/:id/votes", PollController, :vote)
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ test "does NOT render account/pleroma/relationship if this is disabled by defaul
|
||||||
conn
|
conn
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|> get("/api/v1/notifications")
|
|> get("/api/v1/notifications")
|
||||||
|> json_response(200)
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
assert Enum.all?(response, fn n ->
|
assert Enum.all?(response, fn n ->
|
||||||
get_in(n, ["account", "pleroma", "relationship"]) == %{}
|
get_in(n, ["account", "pleroma", "relationship"]) == %{}
|
||||||
|
@ -50,7 +50,9 @@ test "list of notifications" do
|
||||||
user.ap_id
|
user.ap_id
|
||||||
}\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>"
|
}\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>"
|
||||||
|
|
||||||
assert [%{"status" => %{"content" => response}} | _rest] = json_response(conn, 200)
|
assert [%{"status" => %{"content" => response}} | _rest] =
|
||||||
|
json_response_and_validate_schema(conn, 200)
|
||||||
|
|
||||||
assert response == expected_response
|
assert response == expected_response
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -69,7 +71,7 @@ test "getting a single notification" do
|
||||||
user.ap_id
|
user.ap_id
|
||||||
}\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>"
|
}\" rel=\"ugc\">@<span>#{user.nickname}</span></a></span>"
|
||||||
|
|
||||||
assert %{"status" => %{"content" => response}} = json_response(conn, 200)
|
assert %{"status" => %{"content" => response}} = json_response_and_validate_schema(conn, 200)
|
||||||
assert response == expected_response
|
assert response == expected_response
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -84,9 +86,10 @@ test "dismissing a single notification (deprecated endpoint)" do
|
||||||
conn =
|
conn =
|
||||||
conn
|
conn
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|> post("/api/v1/notifications/dismiss", %{"id" => notification.id})
|
|> put_req_header("content-type", "application/json")
|
||||||
|
|> post("/api/v1/notifications/dismiss", %{"id" => to_string(notification.id)})
|
||||||
|
|
||||||
assert %{} = json_response(conn, 200)
|
assert %{} = json_response_and_validate_schema(conn, 200)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "dismissing a single notification" do
|
test "dismissing a single notification" do
|
||||||
|
@ -102,7 +105,7 @@ test "dismissing a single notification" do
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|> post("/api/v1/notifications/#{notification.id}/dismiss")
|
|> post("/api/v1/notifications/#{notification.id}/dismiss")
|
||||||
|
|
||||||
assert %{} = json_response(conn, 200)
|
assert %{} = json_response_and_validate_schema(conn, 200)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "clearing all notifications" do
|
test "clearing all notifications" do
|
||||||
|
@ -115,11 +118,11 @@ test "clearing all notifications" do
|
||||||
|
|
||||||
ret_conn = post(conn, "/api/v1/notifications/clear")
|
ret_conn = post(conn, "/api/v1/notifications/clear")
|
||||||
|
|
||||||
assert %{} = json_response(ret_conn, 200)
|
assert %{} = json_response_and_validate_schema(ret_conn, 200)
|
||||||
|
|
||||||
ret_conn = get(conn, "/api/v1/notifications")
|
ret_conn = get(conn, "/api/v1/notifications")
|
||||||
|
|
||||||
assert all = json_response(ret_conn, 200)
|
assert all = json_response_and_validate_schema(ret_conn, 200)
|
||||||
assert all == []
|
assert all == []
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -143,7 +146,7 @@ test "paginates notifications using min_id, since_id, max_id, and limit" do
|
||||||
result =
|
result =
|
||||||
conn
|
conn
|
||||||
|> get("/api/v1/notifications?limit=2&min_id=#{notification1_id}")
|
|> get("/api/v1/notifications?limit=2&min_id=#{notification1_id}")
|
||||||
|> json_response(:ok)
|
|> json_response_and_validate_schema(:ok)
|
||||||
|
|
||||||
assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result
|
assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result
|
||||||
|
|
||||||
|
@ -151,7 +154,7 @@ test "paginates notifications using min_id, since_id, max_id, and limit" do
|
||||||
result =
|
result =
|
||||||
conn
|
conn
|
||||||
|> get("/api/v1/notifications?limit=2&since_id=#{notification1_id}")
|
|> get("/api/v1/notifications?limit=2&since_id=#{notification1_id}")
|
||||||
|> json_response(:ok)
|
|> json_response_and_validate_schema(:ok)
|
||||||
|
|
||||||
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
|
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
|
||||||
|
|
||||||
|
@ -159,7 +162,7 @@ test "paginates notifications using min_id, since_id, max_id, and limit" do
|
||||||
result =
|
result =
|
||||||
conn
|
conn
|
||||||
|> get("/api/v1/notifications?limit=2&max_id=#{notification4_id}")
|
|> get("/api/v1/notifications?limit=2&max_id=#{notification4_id}")
|
||||||
|> json_response(:ok)
|
|> json_response_and_validate_schema(:ok)
|
||||||
|
|
||||||
assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result
|
assert [%{"id" => ^notification3_id}, %{"id" => ^notification2_id}] = result
|
||||||
end
|
end
|
||||||
|
@ -181,36 +184,28 @@ test "filters notifications for mentions" do
|
||||||
{:ok, private_activity} =
|
{:ok, private_activity} =
|
||||||
CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "private"})
|
CommonAPI.post(other_user, %{"status" => "@#{user.nickname}", "visibility" => "private"})
|
||||||
|
|
||||||
conn_res =
|
query = params_to_query(%{exclude_visibilities: ["public", "unlisted", "private"]})
|
||||||
get(conn, "/api/v1/notifications", %{
|
conn_res = get(conn, "/api/v1/notifications?" <> query)
|
||||||
exclude_visibilities: ["public", "unlisted", "private"]
|
|
||||||
})
|
|
||||||
|
|
||||||
assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200)
|
assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200)
|
||||||
assert id == direct_activity.id
|
assert id == direct_activity.id
|
||||||
|
|
||||||
conn_res =
|
query = params_to_query(%{exclude_visibilities: ["public", "unlisted", "direct"]})
|
||||||
get(conn, "/api/v1/notifications", %{
|
conn_res = get(conn, "/api/v1/notifications?" <> query)
|
||||||
exclude_visibilities: ["public", "unlisted", "direct"]
|
|
||||||
})
|
|
||||||
|
|
||||||
assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200)
|
assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200)
|
||||||
assert id == private_activity.id
|
assert id == private_activity.id
|
||||||
|
|
||||||
conn_res =
|
query = params_to_query(%{exclude_visibilities: ["public", "private", "direct"]})
|
||||||
get(conn, "/api/v1/notifications", %{
|
conn_res = get(conn, "/api/v1/notifications?" <> query)
|
||||||
exclude_visibilities: ["public", "private", "direct"]
|
|
||||||
})
|
|
||||||
|
|
||||||
assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200)
|
assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200)
|
||||||
assert id == unlisted_activity.id
|
assert id == unlisted_activity.id
|
||||||
|
|
||||||
conn_res =
|
query = params_to_query(%{exclude_visibilities: ["unlisted", "private", "direct"]})
|
||||||
get(conn, "/api/v1/notifications", %{
|
conn_res = get(conn, "/api/v1/notifications?" <> query)
|
||||||
exclude_visibilities: ["unlisted", "private", "direct"]
|
|
||||||
})
|
|
||||||
|
|
||||||
assert [%{"status" => %{"id" => id}}] = json_response(conn_res, 200)
|
assert [%{"status" => %{"id" => id}}] = json_response_and_validate_schema(conn_res, 200)
|
||||||
assert id == public_activity.id
|
assert id == public_activity.id
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -237,8 +232,8 @@ test "filters notifications for Like activities" do
|
||||||
|
|
||||||
activity_ids =
|
activity_ids =
|
||||||
conn
|
conn
|
||||||
|> get("/api/v1/notifications", %{exclude_visibilities: ["direct"]})
|
|> get("/api/v1/notifications?exclude_visibilities[]=direct")
|
||||||
|> json_response(200)
|
|> json_response_and_validate_schema(200)
|
||||||
|> Enum.map(& &1["status"]["id"])
|
|> Enum.map(& &1["status"]["id"])
|
||||||
|
|
||||||
assert public_activity.id in activity_ids
|
assert public_activity.id in activity_ids
|
||||||
|
@ -248,8 +243,8 @@ test "filters notifications for Like activities" do
|
||||||
|
|
||||||
activity_ids =
|
activity_ids =
|
||||||
conn
|
conn
|
||||||
|> get("/api/v1/notifications", %{exclude_visibilities: ["unlisted"]})
|
|> get("/api/v1/notifications?exclude_visibilities[]=unlisted")
|
||||||
|> json_response(200)
|
|> json_response_and_validate_schema(200)
|
||||||
|> Enum.map(& &1["status"]["id"])
|
|> Enum.map(& &1["status"]["id"])
|
||||||
|
|
||||||
assert public_activity.id in activity_ids
|
assert public_activity.id in activity_ids
|
||||||
|
@ -259,8 +254,8 @@ test "filters notifications for Like activities" do
|
||||||
|
|
||||||
activity_ids =
|
activity_ids =
|
||||||
conn
|
conn
|
||||||
|> get("/api/v1/notifications", %{exclude_visibilities: ["private"]})
|
|> get("/api/v1/notifications?exclude_visibilities[]=private")
|
||||||
|> json_response(200)
|
|> json_response_and_validate_schema(200)
|
||||||
|> Enum.map(& &1["status"]["id"])
|
|> Enum.map(& &1["status"]["id"])
|
||||||
|
|
||||||
assert public_activity.id in activity_ids
|
assert public_activity.id in activity_ids
|
||||||
|
@ -270,8 +265,8 @@ test "filters notifications for Like activities" do
|
||||||
|
|
||||||
activity_ids =
|
activity_ids =
|
||||||
conn
|
conn
|
||||||
|> get("/api/v1/notifications", %{exclude_visibilities: ["public"]})
|
|> get("/api/v1/notifications?exclude_visibilities[]=public")
|
||||||
|> json_response(200)
|
|> json_response_and_validate_schema(200)
|
||||||
|> Enum.map(& &1["status"]["id"])
|
|> Enum.map(& &1["status"]["id"])
|
||||||
|
|
||||||
refute public_activity.id in activity_ids
|
refute public_activity.id in activity_ids
|
||||||
|
@ -295,8 +290,8 @@ test "filters notifications for Announce activities" do
|
||||||
|
|
||||||
activity_ids =
|
activity_ids =
|
||||||
conn
|
conn
|
||||||
|> get("/api/v1/notifications", %{exclude_visibilities: ["unlisted"]})
|
|> get("/api/v1/notifications?exclude_visibilities[]=unlisted")
|
||||||
|> json_response(200)
|
|> json_response_and_validate_schema(200)
|
||||||
|> Enum.map(& &1["status"]["id"])
|
|> Enum.map(& &1["status"]["id"])
|
||||||
|
|
||||||
assert public_activity.id in activity_ids
|
assert public_activity.id in activity_ids
|
||||||
|
@ -319,25 +314,27 @@ test "filters notifications using exclude_types" do
|
||||||
reblog_notification_id = get_notification_id_by_activity(reblog_activity)
|
reblog_notification_id = get_notification_id_by_activity(reblog_activity)
|
||||||
follow_notification_id = get_notification_id_by_activity(follow_activity)
|
follow_notification_id = get_notification_id_by_activity(follow_activity)
|
||||||
|
|
||||||
conn_res =
|
query = params_to_query(%{exclude_types: ["mention", "favourite", "reblog"]})
|
||||||
get(conn, "/api/v1/notifications", %{exclude_types: ["mention", "favourite", "reblog"]})
|
conn_res = get(conn, "/api/v1/notifications?" <> query)
|
||||||
|
|
||||||
assert [%{"id" => ^follow_notification_id}] = json_response(conn_res, 200)
|
assert [%{"id" => ^follow_notification_id}] = json_response_and_validate_schema(conn_res, 200)
|
||||||
|
|
||||||
conn_res =
|
query = params_to_query(%{exclude_types: ["favourite", "reblog", "follow"]})
|
||||||
get(conn, "/api/v1/notifications", %{exclude_types: ["favourite", "reblog", "follow"]})
|
conn_res = get(conn, "/api/v1/notifications?" <> query)
|
||||||
|
|
||||||
assert [%{"id" => ^mention_notification_id}] = json_response(conn_res, 200)
|
assert [%{"id" => ^mention_notification_id}] =
|
||||||
|
json_response_and_validate_schema(conn_res, 200)
|
||||||
|
|
||||||
conn_res =
|
query = params_to_query(%{exclude_types: ["reblog", "follow", "mention"]})
|
||||||
get(conn, "/api/v1/notifications", %{exclude_types: ["reblog", "follow", "mention"]})
|
conn_res = get(conn, "/api/v1/notifications?" <> query)
|
||||||
|
|
||||||
assert [%{"id" => ^favorite_notification_id}] = json_response(conn_res, 200)
|
assert [%{"id" => ^favorite_notification_id}] =
|
||||||
|
json_response_and_validate_schema(conn_res, 200)
|
||||||
|
|
||||||
conn_res =
|
query = params_to_query(%{exclude_types: ["follow", "mention", "favourite"]})
|
||||||
get(conn, "/api/v1/notifications", %{exclude_types: ["follow", "mention", "favourite"]})
|
conn_res = get(conn, "/api/v1/notifications?" <> query)
|
||||||
|
|
||||||
assert [%{"id" => ^reblog_notification_id}] = json_response(conn_res, 200)
|
assert [%{"id" => ^reblog_notification_id}] = json_response_and_validate_schema(conn_res, 200)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "filters notifications using include_types" do
|
test "filters notifications using include_types" do
|
||||||
|
@ -355,32 +352,34 @@ test "filters notifications using include_types" do
|
||||||
reblog_notification_id = get_notification_id_by_activity(reblog_activity)
|
reblog_notification_id = get_notification_id_by_activity(reblog_activity)
|
||||||
follow_notification_id = get_notification_id_by_activity(follow_activity)
|
follow_notification_id = get_notification_id_by_activity(follow_activity)
|
||||||
|
|
||||||
conn_res = get(conn, "/api/v1/notifications", %{include_types: ["follow"]})
|
conn_res = get(conn, "/api/v1/notifications?include_types[]=follow")
|
||||||
|
|
||||||
assert [%{"id" => ^follow_notification_id}] = json_response(conn_res, 200)
|
assert [%{"id" => ^follow_notification_id}] = json_response_and_validate_schema(conn_res, 200)
|
||||||
|
|
||||||
conn_res = get(conn, "/api/v1/notifications", %{include_types: ["mention"]})
|
conn_res = get(conn, "/api/v1/notifications?include_types[]=mention")
|
||||||
|
|
||||||
assert [%{"id" => ^mention_notification_id}] = json_response(conn_res, 200)
|
assert [%{"id" => ^mention_notification_id}] =
|
||||||
|
json_response_and_validate_schema(conn_res, 200)
|
||||||
|
|
||||||
conn_res = get(conn, "/api/v1/notifications", %{include_types: ["favourite"]})
|
conn_res = get(conn, "/api/v1/notifications?include_types[]=favourite")
|
||||||
|
|
||||||
assert [%{"id" => ^favorite_notification_id}] = json_response(conn_res, 200)
|
assert [%{"id" => ^favorite_notification_id}] =
|
||||||
|
json_response_and_validate_schema(conn_res, 200)
|
||||||
|
|
||||||
conn_res = get(conn, "/api/v1/notifications", %{include_types: ["reblog"]})
|
conn_res = get(conn, "/api/v1/notifications?include_types[]=reblog")
|
||||||
|
|
||||||
assert [%{"id" => ^reblog_notification_id}] = json_response(conn_res, 200)
|
assert [%{"id" => ^reblog_notification_id}] = json_response_and_validate_schema(conn_res, 200)
|
||||||
|
|
||||||
result = conn |> get("/api/v1/notifications") |> json_response(200)
|
result = conn |> get("/api/v1/notifications") |> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
assert length(result) == 4
|
assert length(result) == 4
|
||||||
|
|
||||||
|
query = params_to_query(%{include_types: ["follow", "mention", "favourite", "reblog"]})
|
||||||
|
|
||||||
result =
|
result =
|
||||||
conn
|
conn
|
||||||
|> get("/api/v1/notifications", %{
|
|> get("/api/v1/notifications?" <> query)
|
||||||
include_types: ["follow", "mention", "favourite", "reblog"]
|
|> json_response_and_validate_schema(200)
|
||||||
})
|
|
||||||
|> json_response(200)
|
|
||||||
|
|
||||||
assert length(result) == 4
|
assert length(result) == 4
|
||||||
end
|
end
|
||||||
|
@ -402,7 +401,7 @@ test "destroy multiple" do
|
||||||
result =
|
result =
|
||||||
conn
|
conn
|
||||||
|> get("/api/v1/notifications")
|
|> get("/api/v1/notifications")
|
||||||
|> json_response(:ok)
|
|> json_response_and_validate_schema(:ok)
|
||||||
|
|
||||||
assert [%{"id" => ^notification2_id}, %{"id" => ^notification1_id}] = result
|
assert [%{"id" => ^notification2_id}, %{"id" => ^notification1_id}] = result
|
||||||
|
|
||||||
|
@ -414,22 +413,19 @@ test "destroy multiple" do
|
||||||
result =
|
result =
|
||||||
conn2
|
conn2
|
||||||
|> get("/api/v1/notifications")
|
|> get("/api/v1/notifications")
|
||||||
|> json_response(:ok)
|
|> json_response_and_validate_schema(:ok)
|
||||||
|
|
||||||
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
|
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
|
||||||
|
|
||||||
conn_destroy =
|
query = params_to_query(%{ids: [notification1_id, notification2_id]})
|
||||||
conn
|
conn_destroy = delete(conn, "/api/v1/notifications/destroy_multiple?" <> query)
|
||||||
|> delete("/api/v1/notifications/destroy_multiple", %{
|
|
||||||
"ids" => [notification1_id, notification2_id]
|
|
||||||
})
|
|
||||||
|
|
||||||
assert json_response(conn_destroy, 200) == %{}
|
assert json_response_and_validate_schema(conn_destroy, 200) == %{}
|
||||||
|
|
||||||
result =
|
result =
|
||||||
conn2
|
conn2
|
||||||
|> get("/api/v1/notifications")
|
|> get("/api/v1/notifications")
|
||||||
|> json_response(:ok)
|
|> json_response_and_validate_schema(:ok)
|
||||||
|
|
||||||
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
|
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
|
||||||
end
|
end
|
||||||
|
@ -443,13 +439,13 @@ test "doesn't see notifications after muting user with notifications" do
|
||||||
|
|
||||||
ret_conn = get(conn, "/api/v1/notifications")
|
ret_conn = get(conn, "/api/v1/notifications")
|
||||||
|
|
||||||
assert length(json_response(ret_conn, 200)) == 1
|
assert length(json_response_and_validate_schema(ret_conn, 200)) == 1
|
||||||
|
|
||||||
{:ok, _user_relationships} = User.mute(user, user2)
|
{:ok, _user_relationships} = User.mute(user, user2)
|
||||||
|
|
||||||
conn = get(conn, "/api/v1/notifications")
|
conn = get(conn, "/api/v1/notifications")
|
||||||
|
|
||||||
assert json_response(conn, 200) == []
|
assert json_response_and_validate_schema(conn, 200) == []
|
||||||
end
|
end
|
||||||
|
|
||||||
test "see notifications after muting user without notifications" do
|
test "see notifications after muting user without notifications" do
|
||||||
|
@ -461,13 +457,13 @@ test "see notifications after muting user without notifications" do
|
||||||
|
|
||||||
ret_conn = get(conn, "/api/v1/notifications")
|
ret_conn = get(conn, "/api/v1/notifications")
|
||||||
|
|
||||||
assert length(json_response(ret_conn, 200)) == 1
|
assert length(json_response_and_validate_schema(ret_conn, 200)) == 1
|
||||||
|
|
||||||
{:ok, _user_relationships} = User.mute(user, user2, false)
|
{:ok, _user_relationships} = User.mute(user, user2, false)
|
||||||
|
|
||||||
conn = get(conn, "/api/v1/notifications")
|
conn = get(conn, "/api/v1/notifications")
|
||||||
|
|
||||||
assert length(json_response(conn, 200)) == 1
|
assert length(json_response_and_validate_schema(conn, 200)) == 1
|
||||||
end
|
end
|
||||||
|
|
||||||
test "see notifications after muting user with notifications and with_muted parameter" do
|
test "see notifications after muting user with notifications and with_muted parameter" do
|
||||||
|
@ -479,13 +475,13 @@ test "see notifications after muting user with notifications and with_muted para
|
||||||
|
|
||||||
ret_conn = get(conn, "/api/v1/notifications")
|
ret_conn = get(conn, "/api/v1/notifications")
|
||||||
|
|
||||||
assert length(json_response(ret_conn, 200)) == 1
|
assert length(json_response_and_validate_schema(ret_conn, 200)) == 1
|
||||||
|
|
||||||
{:ok, _user_relationships} = User.mute(user, user2)
|
{:ok, _user_relationships} = User.mute(user, user2)
|
||||||
|
|
||||||
conn = get(conn, "/api/v1/notifications", %{"with_muted" => "true"})
|
conn = get(conn, "/api/v1/notifications?with_muted=true")
|
||||||
|
|
||||||
assert length(json_response(conn, 200)) == 1
|
assert length(json_response_and_validate_schema(conn, 200)) == 1
|
||||||
end
|
end
|
||||||
|
|
||||||
@tag capture_log: true
|
@tag capture_log: true
|
||||||
|
@ -512,7 +508,7 @@ test "see move notifications" do
|
||||||
|
|
||||||
conn = get(conn, "/api/v1/notifications")
|
conn = get(conn, "/api/v1/notifications")
|
||||||
|
|
||||||
assert length(json_response(conn, 200)) == 1
|
assert length(json_response_and_validate_schema(conn, 200)) == 1
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "link headers" do
|
describe "link headers" do
|
||||||
|
@ -538,10 +534,10 @@ test "preserves parameters in link headers" do
|
||||||
conn =
|
conn =
|
||||||
conn
|
conn
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|> get("/api/v1/notifications", %{media_only: true})
|
|> get("/api/v1/notifications?limit=5")
|
||||||
|
|
||||||
assert [link_header] = get_resp_header(conn, "link")
|
assert [link_header] = get_resp_header(conn, "link")
|
||||||
assert link_header =~ ~r/media_only=true/
|
assert link_header =~ ~r/limit=5/
|
||||||
assert link_header =~ ~r/min_id=#{notification2.id}/
|
assert link_header =~ ~r/min_id=#{notification2.id}/
|
||||||
assert link_header =~ ~r/max_id=#{notification1.id}/
|
assert link_header =~ ~r/max_id=#{notification1.id}/
|
||||||
end
|
end
|
||||||
|
@ -560,14 +556,14 @@ test "account_id" do
|
||||||
assert [%{"account" => %{"id" => ^account_id}}] =
|
assert [%{"account" => %{"id" => ^account_id}}] =
|
||||||
conn
|
conn
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|> get("/api/v1/notifications", %{account_id: account_id})
|
|> get("/api/v1/notifications?account_id=#{account_id}")
|
||||||
|> json_response(200)
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
assert %{"error" => "Account is not found"} =
|
assert %{"error" => "Account is not found"} =
|
||||||
conn
|
conn
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|> get("/api/v1/notifications", %{account_id: "cofe"})
|
|> get("/api/v1/notifications?account_id=cofe")
|
||||||
|> json_response(404)
|
|> json_response_and_validate_schema(404)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -577,4 +573,11 @@ defp get_notification_id_by_activity(%{id: id}) do
|
||||||
|> Map.get(:id)
|
|> Map.get(:id)
|
||||||
|> to_string()
|
|> to_string()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp params_to_query(%{} = params) do
|
||||||
|
Enum.map_join(params, "&", fn
|
||||||
|
{k, v} when is_list(v) -> Enum.map_join(v, "&", &"#{k}[]=#{&1}")
|
||||||
|
{k, v} -> k <> "=" <> v
|
||||||
|
end)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue