Add spec for AccountController.follow

This commit is contained in:
Egor Kislitsyn 2020-04-09 15:25:24 +04:00
parent 1b680a98ae
commit 854780c72b
No known key found for this signature in database
GPG key ID: 1B49CB15B71E7805
6 changed files with 51 additions and 28 deletions
lib/pleroma/web
test/web/mastodon_api/controllers

View file

@ -39,7 +39,7 @@ def spec do
password: %OpenApiSpex.OAuthFlow{
authorizationUrl: "/oauth/authorize",
tokenUrl: "/oauth/token",
scopes: %{"read" => "read", "write" => "write"}
scopes: %{"read" => "read", "write" => "write", "follow" => "follow"}
}
}
}

View file

@ -10,6 +10,7 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do
alias Pleroma.Web.ApiSpec.Schemas.Account
alias Pleroma.Web.ApiSpec.Schemas.AccountCreateRequest
alias Pleroma.Web.ApiSpec.Schemas.AccountCreateResponse
alias Pleroma.Web.ApiSpec.Schemas.AccountRelationship
alias Pleroma.Web.ApiSpec.Schemas.AccountRelationshipsResponse
alias Pleroma.Web.ApiSpec.Schemas.AccountsResponse
alias Pleroma.Web.ApiSpec.Schemas.AccountUpdateCredentialsRequest
@ -186,9 +187,7 @@ def following_operation do
"Limit"
)
],
responses: %{
200 => Operation.response("Accounts", "application/json", AccountsResponse)
}
responses: %{200 => Operation.response("Accounts", "application/json", AccountsResponse)}
}
end
@ -199,16 +198,33 @@ def lists_operation do
operationId: "AccountController.lists",
security: [%{"oAuth" => ["read:lists"]}],
description: "User lists that you have added this account to.",
parameters: [%Reference{"$ref": "#/components/parameters/accountIdOrNickname"}],
responses: %{200 => Operation.response("Lists", "application/json", ListsResponse)}
}
end
def follow_operation do
%Operation{
tags: ["accounts"],
summary: "Follow",
operationId: "AccountController.follow",
security: [%{"oAuth" => ["follow", "write:follows"]}],
description: "Follow the given account",
parameters: [
%Reference{"$ref": "#/components/parameters/accountIdOrNickname"}
%Reference{"$ref": "#/components/parameters/accountIdOrNickname"},
Operation.parameter(
:reblogs,
:query,
BooleanLike,
"Receive this account's reblogs in home timeline? Defaults to true."
)
],
responses: %{
200 => Operation.response("Lists", "application/json", ListsResponse)
200 => Operation.response("Relationship", "application/json", AccountRelationship)
}
}
end
def follow_operation, do: :ok
def unfollow_operation, do: :ok
def mute_operation, do: :ok
def unmute_operation, do: :ok

View file

@ -2,41 +2,43 @@
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ApiSpec.Schemas.AccountRelationshipResponse do
defmodule Pleroma.Web.ApiSpec.Schemas.AccountRelationship do
alias OpenApiSpex.Schema
require OpenApiSpex
OpenApiSpex.schema(%{
title: "AccountRelationshipResponse",
description: "Response schema for an account relationship",
title: "AccountRelationship",
description: "Response schema for relationship",
type: :object,
properties: %{
id: %Schema{type: :string},
following: %Schema{type: :boolean},
showing_reblogs: %Schema{type: :boolean},
followed_by: %Schema{type: :boolean},
blocking: %Schema{type: :boolean},
blocked_by: %Schema{type: :boolean},
blocking: %Schema{type: :boolean},
domain_blocking: %Schema{type: :boolean},
endorsed: %Schema{type: :boolean},
followed_by: %Schema{type: :boolean},
following: %Schema{type: :boolean},
id: %Schema{type: :string},
muting: %Schema{type: :boolean},
muting_notifications: %Schema{type: :boolean},
requested: %Schema{type: :boolean},
domain_blocking: %Schema{type: :boolean},
endorsed: %Schema{type: :boolean}
showing_reblogs: %Schema{type: :boolean},
subscribing: %Schema{type: :boolean}
},
example: %{
"JSON" => %{
"id" => "1",
"following" => true,
"showing_reblogs" => true,
"followed_by" => true,
"blocking" => false,
"blocked_by" => false,
"blocking" => false,
"domain_blocking" => false,
"endorsed" => false,
"followed_by" => false,
"following" => false,
"id" => "9tKi3esbG7OQgZ2920",
"muting" => false,
"muting_notifications" => false,
"requested" => false,
"domain_blocking" => false,
"endorsed" => false
"showing_reblogs" => true,
"subscribing" => false
}
}
})

View file

@ -9,7 +9,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.AccountRelationshipsResponse do
title: "AccountRelationshipsResponse",
description: "Response schema for account relationships",
type: :array,
items: Pleroma.Web.ApiSpec.Schemas.AccountRelationshipResponse,
items: Pleroma.Web.ApiSpec.Schemas.AccountRelationship,
example: [
%{
"id" => "1",
@ -22,6 +22,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.AccountRelationshipsResponse do
"muting_notifications" => false,
"requested" => false,
"domain_blocking" => false,
"subscribing" => false,
"endorsed" => true
},
%{
@ -35,6 +36,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.AccountRelationshipsResponse do
"muting_notifications" => false,
"requested" => true,
"domain_blocking" => false,
"subscribing" => false,
"endorsed" => false
},
%{
@ -48,6 +50,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.AccountRelationshipsResponse do
"muting_notifications" => false,
"requested" => false,
"domain_blocking" => true,
"subscribing" => true,
"endorsed" => false
}
]

View file

@ -92,7 +92,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do
:statuses,
:followers,
:following,
:lists
:lists,
:follow
]
)
@ -337,8 +338,8 @@ def follow(%{assigns: %{user: %{id: id}, account: %{id: id}}}, _params) do
{:error, :not_found}
end
def follow(%{assigns: %{user: follower, account: followed}} = conn, _params) do
with {:ok, follower} <- MastodonAPI.follow(follower, followed, conn.params) do
def follow(%{assigns: %{user: follower, account: followed}} = conn, params) do
with {:ok, follower} <- MastodonAPI.follow(follower, followed, params) do
render(conn, "relationship.json", user: follower, target: followed)
else
{:error, message} -> json_response(conn, :forbidden, %{error: message})

View file

@ -669,6 +669,7 @@ test "following / unfollowing a user", %{conn: conn} do
assert %{"id" => id} = json_response(conn, 200)
assert id == to_string(other_user.id)
assert_schema(json_response(conn, 200), "AccountRelationship", ApiSpec.spec())
end
test "cancelling follow request", %{conn: conn} do