forked from AkkomaGang/akkoma
Merge branch 'chat-federation-information' into 'develop'
Add an `accepts_chat_messages` to user, expose in api and federation See merge request pleroma/pleroma!2716
This commit is contained in:
commit
fba1ee7d7b
19 changed files with 150 additions and 38 deletions
|
@ -39,6 +39,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
|
- Chats: Added `accepts_chat_messages` field to user, exposed in APIs and federation.
|
||||||
- Chats: Added support for federated chats. For details, see the docs.
|
- Chats: Added support for federated chats. For details, see the docs.
|
||||||
- ActivityPub: Added support for existing AP ids for instances migrated from Mastodon.
|
- ActivityPub: Added support for existing AP ids for instances migrated from Mastodon.
|
||||||
- Instance: Add `background_image` to configuration and `/api/v1/instance`
|
- Instance: Add `background_image` to configuration and `/api/v1/instance`
|
||||||
|
|
|
@ -71,6 +71,7 @@ Has these additional fields under the `pleroma` object:
|
||||||
- `unread_conversation_count`: The count of unread conversations. Only returned to the account owner.
|
- `unread_conversation_count`: The count of unread conversations. Only returned to the account owner.
|
||||||
- `unread_notifications_count`: The count of unread notifications. Only returned to the account owner.
|
- `unread_notifications_count`: The count of unread notifications. Only returned to the account owner.
|
||||||
- `notification_settings`: object, can be absent. See `/api/pleroma/notification_settings` for the parameters/keys returned.
|
- `notification_settings`: object, can be absent. See `/api/pleroma/notification_settings` for the parameters/keys returned.
|
||||||
|
- `accepts_chat_messages`: boolean, but can be null if we don't have that information about a user
|
||||||
- `favicon`: nullable URL string, Favicon image of the user's instance
|
- `favicon`: nullable URL string, Favicon image of the user's instance
|
||||||
|
|
||||||
### Source
|
### Source
|
||||||
|
@ -186,6 +187,7 @@ Additional parameters can be added to the JSON body/Form data:
|
||||||
- `pleroma_background_image` - sets the background image of the user. Can be set to "" (an empty string) to reset.
|
- `pleroma_background_image` - sets the background image of the user. Can be set to "" (an empty string) to reset.
|
||||||
- `discoverable` - if true, discovery of this account in search results and other services is allowed.
|
- `discoverable` - if true, discovery of this account in search results and other services is allowed.
|
||||||
- `actor_type` - the type of this account.
|
- `actor_type` - the type of this account.
|
||||||
|
- `accepts_chat_messages` - if false, this account will reject all chat messages.
|
||||||
|
|
||||||
All images (avatar, banner and background) can be reset to the default by sending an empty string ("") instead of a file.
|
All images (avatar, banner and background) can be reset to the default by sending an empty string ("") instead of a file.
|
||||||
|
|
||||||
|
|
|
@ -138,6 +138,7 @@ defmodule Pleroma.User do
|
||||||
field(:also_known_as, {:array, :string}, default: [])
|
field(:also_known_as, {:array, :string}, default: [])
|
||||||
field(:inbox, :string)
|
field(:inbox, :string)
|
||||||
field(:shared_inbox, :string)
|
field(:shared_inbox, :string)
|
||||||
|
field(:accepts_chat_messages, :boolean, default: nil)
|
||||||
|
|
||||||
embeds_one(
|
embeds_one(
|
||||||
:notification_settings,
|
:notification_settings,
|
||||||
|
@ -436,7 +437,8 @@ def remote_user_changeset(struct \\ %User{local: false}, params) do
|
||||||
:discoverable,
|
:discoverable,
|
||||||
:invisible,
|
:invisible,
|
||||||
:actor_type,
|
:actor_type,
|
||||||
:also_known_as
|
:also_known_as,
|
||||||
|
:accepts_chat_messages
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|> validate_required([:name, :ap_id])
|
|> validate_required([:name, :ap_id])
|
||||||
|
@ -481,7 +483,8 @@ def update_changeset(struct, params \\ %{}) do
|
||||||
:pleroma_settings_store,
|
:pleroma_settings_store,
|
||||||
:discoverable,
|
:discoverable,
|
||||||
:actor_type,
|
:actor_type,
|
||||||
:also_known_as
|
:also_known_as,
|
||||||
|
:accepts_chat_messages
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|> unique_constraint(:nickname)
|
|> unique_constraint(:nickname)
|
||||||
|
@ -620,6 +623,7 @@ def force_password_reset(user), do: update_password_reset_pending(user, true)
|
||||||
def register_changeset(struct, params \\ %{}, opts \\ []) do
|
def register_changeset(struct, params \\ %{}, opts \\ []) do
|
||||||
bio_limit = Config.get([:instance, :user_bio_length], 5000)
|
bio_limit = Config.get([:instance, :user_bio_length], 5000)
|
||||||
name_limit = Config.get([:instance, :user_name_length], 100)
|
name_limit = Config.get([:instance, :user_name_length], 100)
|
||||||
|
params = Map.put_new(params, :accepts_chat_messages, true)
|
||||||
|
|
||||||
need_confirmation? =
|
need_confirmation? =
|
||||||
if is_nil(opts[:need_confirmation]) do
|
if is_nil(opts[:need_confirmation]) do
|
||||||
|
@ -638,7 +642,8 @@ def register_changeset(struct, params \\ %{}, opts \\ []) do
|
||||||
:nickname,
|
:nickname,
|
||||||
:password,
|
:password,
|
||||||
:password_confirmation,
|
:password_confirmation,
|
||||||
:emoji
|
:emoji,
|
||||||
|
:accepts_chat_messages
|
||||||
])
|
])
|
||||||
|> validate_required([:name, :nickname, :password, :password_confirmation])
|
|> validate_required([:name, :nickname, :password, :password_confirmation])
|
||||||
|> validate_confirmation(:password)
|
|> validate_confirmation(:password)
|
||||||
|
|
|
@ -1226,6 +1226,8 @@ defp object_to_user_data(data) do
|
||||||
end)
|
end)
|
||||||
|
|
||||||
locked = data["manuallyApprovesFollowers"] || false
|
locked = data["manuallyApprovesFollowers"] || false
|
||||||
|
capabilities = data["capabilities"] || %{}
|
||||||
|
accepts_chat_messages = capabilities["acceptsChatMessages"]
|
||||||
data = Transmogrifier.maybe_fix_user_object(data)
|
data = Transmogrifier.maybe_fix_user_object(data)
|
||||||
discoverable = data["discoverable"] || false
|
discoverable = data["discoverable"] || false
|
||||||
invisible = data["invisible"] || false
|
invisible = data["invisible"] || false
|
||||||
|
@ -1264,7 +1266,8 @@ defp object_to_user_data(data) do
|
||||||
also_known_as: Map.get(data, "alsoKnownAs", []),
|
also_known_as: Map.get(data, "alsoKnownAs", []),
|
||||||
public_key: public_key,
|
public_key: public_key,
|
||||||
inbox: data["inbox"],
|
inbox: data["inbox"],
|
||||||
shared_inbox: shared_inbox
|
shared_inbox: shared_inbox,
|
||||||
|
accepts_chat_messages: accepts_chat_messages
|
||||||
}
|
}
|
||||||
|
|
||||||
# nickname can be nil because of virtual actors
|
# nickname can be nil because of virtual actors
|
||||||
|
|
|
@ -93,12 +93,14 @@ def validate_content_or_attachment(cng) do
|
||||||
- If both users are in our system
|
- If both users are in our system
|
||||||
- If at least one of the users in this ChatMessage is a local user
|
- If at least one of the users in this ChatMessage is a local user
|
||||||
- If the recipient is not blocking the actor
|
- If the recipient is not blocking the actor
|
||||||
|
- If the recipient is explicitly not accepting chat messages
|
||||||
"""
|
"""
|
||||||
def validate_local_concern(cng) do
|
def validate_local_concern(cng) do
|
||||||
with actor_ap <- get_field(cng, :actor),
|
with actor_ap <- get_field(cng, :actor),
|
||||||
{_, %User{} = actor} <- {:find_actor, User.get_cached_by_ap_id(actor_ap)},
|
{_, %User{} = actor} <- {:find_actor, User.get_cached_by_ap_id(actor_ap)},
|
||||||
{_, %User{} = recipient} <-
|
{_, %User{} = recipient} <-
|
||||||
{:find_recipient, User.get_cached_by_ap_id(get_field(cng, :to) |> hd())},
|
{:find_recipient, User.get_cached_by_ap_id(get_field(cng, :to) |> hd())},
|
||||||
|
{_, false} <- {:not_accepting_chats?, recipient.accepts_chat_messages == false},
|
||||||
{_, false} <- {:blocking_actor?, User.blocks?(recipient, actor)},
|
{_, false} <- {:blocking_actor?, User.blocks?(recipient, actor)},
|
||||||
{_, true} <- {:local?, Enum.any?([actor, recipient], & &1.local)} do
|
{_, true} <- {:local?, Enum.any?([actor, recipient], & &1.local)} do
|
||||||
cng
|
cng
|
||||||
|
@ -107,6 +109,10 @@ def validate_local_concern(cng) do
|
||||||
cng
|
cng
|
||||||
|> add_error(:actor, "actor is blocked by recipient")
|
|> add_error(:actor, "actor is blocked by recipient")
|
||||||
|
|
||||||
|
{:not_accepting_chats?, true} ->
|
||||||
|
cng
|
||||||
|
|> add_error(:to, "recipient does not accept chat messages")
|
||||||
|
|
||||||
{:local?, false} ->
|
{:local?, false} ->
|
||||||
cng
|
cng
|
||||||
|> add_error(:actor, "actor and recipient are both remote")
|
|> add_error(:actor, "actor and recipient are both remote")
|
||||||
|
|
|
@ -81,6 +81,15 @@ def render("user.json", %{user: user}) do
|
||||||
|
|
||||||
fields = Enum.map(user.fields, &Map.put(&1, "type", "PropertyValue"))
|
fields = Enum.map(user.fields, &Map.put(&1, "type", "PropertyValue"))
|
||||||
|
|
||||||
|
capabilities =
|
||||||
|
if is_boolean(user.accepts_chat_messages) do
|
||||||
|
%{
|
||||||
|
"acceptsChatMessages" => user.accepts_chat_messages
|
||||||
|
}
|
||||||
|
else
|
||||||
|
%{}
|
||||||
|
end
|
||||||
|
|
||||||
%{
|
%{
|
||||||
"id" => user.ap_id,
|
"id" => user.ap_id,
|
||||||
"type" => user.actor_type,
|
"type" => user.actor_type,
|
||||||
|
@ -101,7 +110,8 @@ def render("user.json", %{user: user}) do
|
||||||
"endpoints" => endpoints,
|
"endpoints" => endpoints,
|
||||||
"attachment" => fields,
|
"attachment" => fields,
|
||||||
"tag" => emoji_tags,
|
"tag" => emoji_tags,
|
||||||
"discoverable" => user.discoverable
|
"discoverable" => user.discoverable,
|
||||||
|
"capabilities" => capabilities
|
||||||
}
|
}
|
||||||
|> Map.merge(maybe_make_image(&User.avatar_url/2, "icon", user))
|
|> Map.merge(maybe_make_image(&User.avatar_url/2, "icon", user))
|
||||||
|> Map.merge(maybe_make_image(&User.banner_url/2, "image", user))
|
|> Map.merge(maybe_make_image(&User.banner_url/2, "image", user))
|
||||||
|
|
|
@ -61,7 +61,7 @@ def update_credentials_operation do
|
||||||
description: "Update the user's display and preferences.",
|
description: "Update the user's display and preferences.",
|
||||||
operationId: "AccountController.update_credentials",
|
operationId: "AccountController.update_credentials",
|
||||||
security: [%{"oAuth" => ["write:accounts"]}],
|
security: [%{"oAuth" => ["write:accounts"]}],
|
||||||
requestBody: request_body("Parameters", update_creadentials_request(), required: true),
|
requestBody: request_body("Parameters", update_credentials_request(), required: true),
|
||||||
responses: %{
|
responses: %{
|
||||||
200 => Operation.response("Account", "application/json", Account),
|
200 => Operation.response("Account", "application/json", Account),
|
||||||
403 => Operation.response("Error", "application/json", ApiError)
|
403 => Operation.response("Error", "application/json", ApiError)
|
||||||
|
@ -474,7 +474,7 @@ defp create_response do
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp update_creadentials_request do
|
defp update_credentials_request do
|
||||||
%Schema{
|
%Schema{
|
||||||
title: "AccountUpdateCredentialsRequest",
|
title: "AccountUpdateCredentialsRequest",
|
||||||
description: "POST body for creating an account",
|
description: "POST body for creating an account",
|
||||||
|
@ -508,6 +508,11 @@ defp update_creadentials_request do
|
||||||
nullable: true,
|
nullable: true,
|
||||||
description: "Whether manual approval of follow requests is required."
|
description: "Whether manual approval of follow requests is required."
|
||||||
},
|
},
|
||||||
|
accepts_chat_messages: %Schema{
|
||||||
|
allOf: [BooleanLike],
|
||||||
|
nullable: true,
|
||||||
|
description: "Whether the user accepts receiving chat messages."
|
||||||
|
},
|
||||||
fields_attributes: %Schema{
|
fields_attributes: %Schema{
|
||||||
nullable: true,
|
nullable: true,
|
||||||
oneOf: [
|
oneOf: [
|
||||||
|
|
|
@ -103,6 +103,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do
|
||||||
description:
|
description:
|
||||||
"A generic map of settings for frontends. Opaque to the backend. Only returned in `verify_credentials` and `update_credentials`"
|
"A generic map of settings for frontends. Opaque to the backend. Only returned in `verify_credentials` and `update_credentials`"
|
||||||
},
|
},
|
||||||
|
accepts_chat_messages: %Schema{type: :boolean, nullable: true},
|
||||||
favicon: %Schema{
|
favicon: %Schema{
|
||||||
type: :string,
|
type: :string,
|
||||||
format: :uri,
|
format: :uri,
|
||||||
|
@ -175,6 +176,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do
|
||||||
"is_admin" => false,
|
"is_admin" => false,
|
||||||
"is_moderator" => false,
|
"is_moderator" => false,
|
||||||
"skip_thread_containment" => false,
|
"skip_thread_containment" => false,
|
||||||
|
"accepts_chat_messages" => true,
|
||||||
"chat_token" =>
|
"chat_token" =>
|
||||||
"SFMyNTY.g3QAAAACZAAEZGF0YW0AAAASOXRLaTNlc2JHN09RZ1oyOTIwZAAGc2lnbmVkbgYARNplS3EB.Mb_Iaqew2bN1I1o79B_iP7encmVCpTKC4OtHZRxdjKc",
|
"SFMyNTY.g3QAAAACZAAEZGF0YW0AAAASOXRLaTNlc2JHN09RZ1oyOTIwZAAGc2lnbmVkbgYARNplS3EB.Mb_Iaqew2bN1I1o79B_iP7encmVCpTKC4OtHZRxdjKc",
|
||||||
"unread_conversation_count" => 0,
|
"unread_conversation_count" => 0,
|
||||||
|
|
|
@ -163,7 +163,8 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p
|
||||||
:show_role,
|
:show_role,
|
||||||
:skip_thread_containment,
|
:skip_thread_containment,
|
||||||
:allow_following_move,
|
:allow_following_move,
|
||||||
:discoverable
|
:discoverable,
|
||||||
|
:accepts_chat_messages
|
||||||
]
|
]
|
||||||
|> Enum.reduce(%{}, fn key, acc ->
|
|> Enum.reduce(%{}, fn key, acc ->
|
||||||
Maps.put_if_present(acc, key, params[key], &{:ok, truthy_param?(&1)})
|
Maps.put_if_present(acc, key, params[key], &{:ok, truthy_param?(&1)})
|
||||||
|
|
|
@ -258,6 +258,7 @@ defp do_render("show.json", %{user: user} = opts) do
|
||||||
relationship: relationship,
|
relationship: relationship,
|
||||||
skip_thread_containment: user.skip_thread_containment,
|
skip_thread_containment: user.skip_thread_containment,
|
||||||
background_image: image_url(user.background) |> MediaProxy.url(),
|
background_image: image_url(user.background) |> MediaProxy.url(),
|
||||||
|
accepts_chat_messages: user.accepts_chat_messages,
|
||||||
favicon: favicon
|
favicon: favicon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.AddChatAcceptanceToUsers do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def up do
|
||||||
|
alter table(:users) do
|
||||||
|
add(:accepts_chat_messages, :boolean, nullable: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
execute("update users set accepts_chat_messages = true where local = true")
|
||||||
|
end
|
||||||
|
|
||||||
|
def down do
|
||||||
|
alter table(:users) do
|
||||||
|
remove(:accepts_chat_messages)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -13,6 +13,7 @@
|
||||||
},
|
},
|
||||||
"discoverable": "toot:discoverable",
|
"discoverable": "toot:discoverable",
|
||||||
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
||||||
|
"capabilities": "litepub:capabilities",
|
||||||
"ostatus": "http://ostatus.org#",
|
"ostatus": "http://ostatus.org#",
|
||||||
"schema": "http://schema.org#",
|
"schema": "http://schema.org#",
|
||||||
"toot": "http://joinmastodon.org/ns#",
|
"toot": "http://joinmastodon.org/ns#",
|
||||||
|
|
|
@ -26,6 +26,9 @@
|
||||||
"summary": "\u003cp\u003e\u003c/p\u003e",
|
"summary": "\u003cp\u003e\u003c/p\u003e",
|
||||||
"url": "http://mastodon.example.org/@admin",
|
"url": "http://mastodon.example.org/@admin",
|
||||||
"manuallyApprovesFollowers": false,
|
"manuallyApprovesFollowers": false,
|
||||||
|
"capabilities": {
|
||||||
|
"acceptsChatMessages": true
|
||||||
|
},
|
||||||
"publicKey": {
|
"publicKey": {
|
||||||
"id": "http://mastodon.example.org/users/admin#main-key",
|
"id": "http://mastodon.example.org/users/admin#main-key",
|
||||||
"owner": "http://mastodon.example.org/users/admin",
|
"owner": "http://mastodon.example.org/users/admin",
|
||||||
|
|
|
@ -486,6 +486,15 @@ test "it sets the password_hash and ap_id" do
|
||||||
}
|
}
|
||||||
setup do: clear_config([:instance, :account_activation_required], true)
|
setup do: clear_config([:instance, :account_activation_required], true)
|
||||||
|
|
||||||
|
test "it sets the 'accepts_chat_messages' set to true" do
|
||||||
|
changeset = User.register_changeset(%User{}, @full_user_data)
|
||||||
|
assert changeset.valid?
|
||||||
|
|
||||||
|
{:ok, user} = Repo.insert(changeset)
|
||||||
|
|
||||||
|
assert user.accepts_chat_messages
|
||||||
|
end
|
||||||
|
|
||||||
test "it creates unconfirmed user" do
|
test "it creates unconfirmed user" do
|
||||||
changeset = User.register_changeset(%User{}, @full_user_data)
|
changeset = User.register_changeset(%User{}, @full_user_data)
|
||||||
assert changeset.valid?
|
assert changeset.valid?
|
||||||
|
|
|
@ -184,38 +184,45 @@ test "it returns a user that is invisible" do
|
||||||
assert User.invisible?(user)
|
assert User.invisible?(user)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it fetches the appropriate tag-restricted posts" do
|
test "it returns a user that accepts chat messages" do
|
||||||
user = insert(:user)
|
user_id = "http://mastodon.example.org/users/admin"
|
||||||
|
{:ok, user} = ActivityPub.make_user_from_ap_id(user_id)
|
||||||
|
|
||||||
{:ok, status_one} = CommonAPI.post(user, %{status: ". #test"})
|
assert user.accepts_chat_messages
|
||||||
{:ok, status_two} = CommonAPI.post(user, %{status: ". #essais"})
|
|
||||||
{:ok, status_three} = CommonAPI.post(user, %{status: ". #test #reject"})
|
|
||||||
|
|
||||||
fetch_one = ActivityPub.fetch_activities([], %{type: "Create", tag: "test"})
|
|
||||||
|
|
||||||
fetch_two = ActivityPub.fetch_activities([], %{type: "Create", tag: ["test", "essais"]})
|
|
||||||
|
|
||||||
fetch_three =
|
|
||||||
ActivityPub.fetch_activities([], %{
|
|
||||||
type: "Create",
|
|
||||||
tag: ["test", "essais"],
|
|
||||||
tag_reject: ["reject"]
|
|
||||||
})
|
|
||||||
|
|
||||||
fetch_four =
|
|
||||||
ActivityPub.fetch_activities([], %{
|
|
||||||
type: "Create",
|
|
||||||
tag: ["test"],
|
|
||||||
tag_all: ["test", "reject"]
|
|
||||||
})
|
|
||||||
|
|
||||||
assert fetch_one == [status_one, status_three]
|
|
||||||
assert fetch_two == [status_one, status_two, status_three]
|
|
||||||
assert fetch_three == [status_one, status_two]
|
|
||||||
assert fetch_four == [status_three]
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it fetches the appropriate tag-restricted posts" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, status_one} = CommonAPI.post(user, %{status: ". #test"})
|
||||||
|
{:ok, status_two} = CommonAPI.post(user, %{status: ". #essais"})
|
||||||
|
{:ok, status_three} = CommonAPI.post(user, %{status: ". #test #reject"})
|
||||||
|
|
||||||
|
fetch_one = ActivityPub.fetch_activities([], %{type: "Create", tag: "test"})
|
||||||
|
|
||||||
|
fetch_two = ActivityPub.fetch_activities([], %{type: "Create", tag: ["test", "essais"]})
|
||||||
|
|
||||||
|
fetch_three =
|
||||||
|
ActivityPub.fetch_activities([], %{
|
||||||
|
type: "Create",
|
||||||
|
tag: ["test", "essais"],
|
||||||
|
tag_reject: ["reject"]
|
||||||
|
})
|
||||||
|
|
||||||
|
fetch_four =
|
||||||
|
ActivityPub.fetch_activities([], %{
|
||||||
|
type: "Create",
|
||||||
|
tag: ["test"],
|
||||||
|
tag_all: ["test", "reject"]
|
||||||
|
})
|
||||||
|
|
||||||
|
assert fetch_one == [status_one, status_three]
|
||||||
|
assert fetch_two == [status_one, status_two, status_three]
|
||||||
|
assert fetch_three == [status_one, status_two]
|
||||||
|
assert fetch_four == [status_three]
|
||||||
|
end
|
||||||
|
|
||||||
describe "insertion" do
|
describe "insertion" do
|
||||||
test "drops activities beyond a certain limit" do
|
test "drops activities beyond a certain limit" do
|
||||||
limit = Config.get([:instance, :remote_limit])
|
limit = Config.get([:instance, :remote_limit])
|
||||||
|
|
|
@ -161,6 +161,17 @@ test "does not validate if the recipient is blocking the actor", %{
|
||||||
refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
|
refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "does not validate if the recipient is not accepting chat messages", %{
|
||||||
|
valid_chat_message: valid_chat_message,
|
||||||
|
recipient: recipient
|
||||||
|
} do
|
||||||
|
recipient
|
||||||
|
|> Ecto.Changeset.change(%{accepts_chat_messages: false})
|
||||||
|
|> Pleroma.Repo.update!()
|
||||||
|
|
||||||
|
refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
|
||||||
|
end
|
||||||
|
|
||||||
test "does not validate if the actor or the recipient is not in our system", %{
|
test "does not validate if the actor or the recipient is not in our system", %{
|
||||||
valid_chat_message: valid_chat_message
|
valid_chat_message: valid_chat_message
|
||||||
} do
|
} do
|
||||||
|
|
|
@ -158,4 +158,23 @@ test "sets correct totalItems when follows are hidden but the follow counter is
|
||||||
assert %{"totalItems" => 1} = UserView.render("following.json", %{user: user})
|
assert %{"totalItems" => 1} = UserView.render("following.json", %{user: user})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "acceptsChatMessages" do
|
||||||
|
test "it returns this value if it is set" do
|
||||||
|
true_user = insert(:user, accepts_chat_messages: true)
|
||||||
|
false_user = insert(:user, accepts_chat_messages: false)
|
||||||
|
nil_user = insert(:user, accepts_chat_messages: nil)
|
||||||
|
|
||||||
|
assert %{"capabilities" => %{"acceptsChatMessages" => true}} =
|
||||||
|
UserView.render("user.json", user: true_user)
|
||||||
|
|
||||||
|
assert %{"capabilities" => %{"acceptsChatMessages" => false}} =
|
||||||
|
UserView.render("user.json", user: false_user)
|
||||||
|
|
||||||
|
refute Map.has_key?(
|
||||||
|
UserView.render("user.json", user: nil_user)["capabilities"],
|
||||||
|
"acceptsChatMessages"
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -108,6 +108,13 @@ test "updates the user's locking status", %{conn: conn} do
|
||||||
assert user_data["locked"] == true
|
assert user_data["locked"] == true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "updates the user's chat acceptance status", %{conn: conn} do
|
||||||
|
conn = patch(conn, "/api/v1/accounts/update_credentials", %{accepts_chat_messages: "false"})
|
||||||
|
|
||||||
|
assert user_data = json_response_and_validate_schema(conn, 200)
|
||||||
|
assert user_data["pleroma"]["accepts_chat_messages"] == false
|
||||||
|
end
|
||||||
|
|
||||||
test "updates the user's allow_following_move", %{user: user, conn: conn} do
|
test "updates the user's allow_following_move", %{user: user, conn: conn} do
|
||||||
assert user.allow_following_move == true
|
assert user.allow_following_move == true
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,8 @@ test "Represent a user account" do
|
||||||
hide_followers_count: false,
|
hide_followers_count: false,
|
||||||
hide_follows_count: false,
|
hide_follows_count: false,
|
||||||
relationship: %{},
|
relationship: %{},
|
||||||
skip_thread_containment: false
|
skip_thread_containment: false,
|
||||||
|
accepts_chat_messages: nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,7 +187,8 @@ test "Represent a Service(bot) account" do
|
||||||
hide_followers_count: false,
|
hide_followers_count: false,
|
||||||
hide_follows_count: false,
|
hide_follows_count: false,
|
||||||
relationship: %{},
|
relationship: %{},
|
||||||
skip_thread_containment: false
|
skip_thread_containment: false,
|
||||||
|
accepts_chat_messages: nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue