2019-09-30 03:28:12 -04:00
|
|
|
# Pleroma: A lightweight social networking server
|
2020-03-02 00:08:45 -05:00
|
|
|
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
|
2019-09-30 03:28:12 -04:00
|
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
|
|
|
defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
|
|
|
|
use Pleroma.Web.ConnCase
|
|
|
|
|
|
|
|
alias Pleroma.Config
|
|
|
|
alias Pleroma.Tests.ObanHelpers
|
|
|
|
alias Pleroma.User
|
|
|
|
alias Pleroma.Web.CommonAPI
|
|
|
|
|
|
|
|
import Pleroma.Factory
|
|
|
|
import Swoosh.TestAssertions
|
|
|
|
|
|
|
|
@image "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7"
|
|
|
|
|
|
|
|
describe "POST /api/v1/pleroma/accounts/confirmation_resend" do
|
|
|
|
setup do
|
|
|
|
{:ok, user} =
|
|
|
|
insert(:user)
|
2019-10-16 14:59:21 -04:00
|
|
|
|> User.confirmation_changeset(need_confirmation: true)
|
|
|
|
|> User.update_and_set_cache()
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2019-10-16 14:59:21 -04:00
|
|
|
assert user.confirmation_pending
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
[user: user]
|
|
|
|
end
|
|
|
|
|
2020-03-20 11:33:00 -04:00
|
|
|
setup do: clear_config([:instance, :account_activation_required], true)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
test "resend account confirmation email", %{conn: conn, user: user} do
|
|
|
|
conn
|
2020-05-13 11:06:25 -04:00
|
|
|
|> put_req_header("content-type", "application/json")
|
2019-09-30 03:28:12 -04:00
|
|
|
|> post("/api/v1/pleroma/accounts/confirmation_resend?email=#{user.email}")
|
2020-05-13 11:06:25 -04:00
|
|
|
|> json_response_and_validate_schema(:no_content)
|
|
|
|
|
|
|
|
ObanHelpers.perform_all()
|
|
|
|
|
|
|
|
email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
|
|
|
|
notify_email = Config.get([:instance, :notify_email])
|
|
|
|
instance_name = Config.get([:instance, :name])
|
|
|
|
|
|
|
|
assert_email_sent(
|
|
|
|
from: {instance_name, notify_email},
|
|
|
|
to: {user.name, user.email},
|
|
|
|
html_body: email.html_body
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
test "resend account confirmation email (with nickname)", %{conn: conn, user: user} do
|
|
|
|
conn
|
|
|
|
|> put_req_header("content-type", "application/json")
|
|
|
|
|> post("/api/v1/pleroma/accounts/confirmation_resend?nickname=#{user.nickname}")
|
|
|
|
|> json_response_and_validate_schema(:no_content)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
ObanHelpers.perform_all()
|
|
|
|
|
|
|
|
email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
|
|
|
|
notify_email = Config.get([:instance, :notify_email])
|
|
|
|
instance_name = Config.get([:instance, :name])
|
|
|
|
|
|
|
|
assert_email_sent(
|
|
|
|
from: {instance_name, notify_email},
|
|
|
|
to: {user.name, user.email},
|
|
|
|
html_body: email.html_body
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "PATCH /api/v1/pleroma/accounts/update_avatar" do
|
2019-12-19 09:23:27 -05:00
|
|
|
setup do: oauth_access(["write:accounts"])
|
|
|
|
|
|
|
|
test "user avatar can be set", %{user: user, conn: conn} do
|
2019-09-30 03:28:12 -04:00
|
|
|
avatar_image = File.read!("test/fixtures/avatar_data_uri")
|
|
|
|
|
2020-05-13 11:06:25 -04:00
|
|
|
conn =
|
|
|
|
conn
|
|
|
|
|> put_req_header("content-type", "multipart/form-data")
|
|
|
|
|> patch("/api/v1/pleroma/accounts/update_avatar", %{img: avatar_image})
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
user = refresh_record(user)
|
|
|
|
|
|
|
|
assert %{
|
|
|
|
"name" => _,
|
|
|
|
"type" => _,
|
|
|
|
"url" => [
|
|
|
|
%{
|
|
|
|
"href" => _,
|
|
|
|
"mediaType" => _,
|
|
|
|
"type" => _
|
|
|
|
}
|
|
|
|
]
|
|
|
|
} = user.avatar
|
|
|
|
|
2020-05-13 11:06:25 -04:00
|
|
|
assert %{"url" => _} = json_response_and_validate_schema(conn, 200)
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
test "user avatar can be reset", %{user: user, conn: conn} do
|
2020-05-13 11:06:25 -04:00
|
|
|
conn =
|
|
|
|
conn
|
|
|
|
|> put_req_header("content-type", "multipart/form-data")
|
|
|
|
|> patch("/api/v1/pleroma/accounts/update_avatar", %{img: ""})
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
user = User.get_cached_by_id(user.id)
|
|
|
|
|
|
|
|
assert user.avatar == nil
|
|
|
|
|
2020-05-13 11:06:25 -04:00
|
|
|
assert %{"url" => nil} = json_response_and_validate_schema(conn, 200)
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "PATCH /api/v1/pleroma/accounts/update_banner" do
|
2019-12-19 09:23:27 -05:00
|
|
|
setup do: oauth_access(["write:accounts"])
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
test "can set profile banner", %{user: user, conn: conn} do
|
2020-05-13 11:06:25 -04:00
|
|
|
conn =
|
|
|
|
conn
|
|
|
|
|> put_req_header("content-type", "multipart/form-data")
|
|
|
|
|> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => @image})
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
user = refresh_record(user)
|
2019-10-16 14:59:21 -04:00
|
|
|
assert user.banner["type"] == "Image"
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2020-05-13 11:06:25 -04:00
|
|
|
assert %{"url" => _} = json_response_and_validate_schema(conn, 200)
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
test "can reset profile banner", %{user: user, conn: conn} do
|
2020-05-13 11:06:25 -04:00
|
|
|
conn =
|
|
|
|
conn
|
|
|
|
|> put_req_header("content-type", "multipart/form-data")
|
|
|
|
|> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => ""})
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
user = refresh_record(user)
|
2019-10-16 14:59:21 -04:00
|
|
|
assert user.banner == %{}
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2020-05-13 11:06:25 -04:00
|
|
|
assert %{"url" => nil} = json_response_and_validate_schema(conn, 200)
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "PATCH /api/v1/pleroma/accounts/update_background" do
|
2019-12-19 09:23:27 -05:00
|
|
|
setup do: oauth_access(["write:accounts"])
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
test "background image can be set", %{user: user, conn: conn} do
|
2020-05-13 11:06:25 -04:00
|
|
|
conn =
|
|
|
|
conn
|
|
|
|
|> put_req_header("content-type", "multipart/form-data")
|
|
|
|
|> patch("/api/v1/pleroma/accounts/update_background", %{"img" => @image})
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
user = refresh_record(user)
|
2019-10-16 14:59:21 -04:00
|
|
|
assert user.background["type"] == "Image"
|
2020-05-13 11:06:25 -04:00
|
|
|
# assert %{"url" => _} = json_response(conn, 200)
|
|
|
|
assert %{"url" => _} = json_response_and_validate_schema(conn, 200)
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
test "background image can be reset", %{user: user, conn: conn} do
|
2020-05-13 11:06:25 -04:00
|
|
|
conn =
|
|
|
|
conn
|
|
|
|
|> put_req_header("content-type", "multipart/form-data")
|
|
|
|
|> patch("/api/v1/pleroma/accounts/update_background", %{"img" => ""})
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
user = refresh_record(user)
|
2019-10-16 14:59:21 -04:00
|
|
|
assert user.background == %{}
|
2020-05-13 11:06:25 -04:00
|
|
|
assert %{"url" => nil} = json_response_and_validate_schema(conn, 200)
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "getting favorites timeline of specified user" do
|
|
|
|
setup do
|
2019-10-16 14:59:21 -04:00
|
|
|
[current_user, user] = insert_pair(:user, hide_favorites: false)
|
2019-12-19 09:23:27 -05:00
|
|
|
%{user: current_user, conn: conn} = oauth_access(["read:favourites"], user: current_user)
|
|
|
|
[current_user: current_user, user: user, conn: conn]
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
test "returns list of statuses favorited by specified user", %{
|
|
|
|
conn: conn,
|
|
|
|
user: user
|
|
|
|
} do
|
|
|
|
[activity | _] = insert_pair(:note_activity)
|
2019-10-16 10:16:39 -04:00
|
|
|
CommonAPI.favorite(user, activity.id)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
response =
|
|
|
|
conn
|
|
|
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
2020-05-13 11:06:25 -04:00
|
|
|
|> json_response_and_validate_schema(:ok)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
[like] = response
|
|
|
|
|
|
|
|
assert length(response) == 1
|
|
|
|
assert like["id"] == activity.id
|
|
|
|
end
|
|
|
|
|
2020-04-24 15:25:27 -04:00
|
|
|
test "returns favorites for specified user_id when requester is not logged in", %{
|
2019-09-30 03:28:12 -04:00
|
|
|
user: user
|
|
|
|
} do
|
|
|
|
activity = insert(:note_activity)
|
2019-10-16 10:16:39 -04:00
|
|
|
CommonAPI.favorite(user, activity.id)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2020-04-24 15:25:27 -04:00
|
|
|
response =
|
|
|
|
build_conn()
|
|
|
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
2020-05-13 11:06:25 -04:00
|
|
|
|> json_response_and_validate_schema(200)
|
2020-04-24 15:25:27 -04:00
|
|
|
|
|
|
|
assert length(response) == 1
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
test "returns favorited DM only when user is logged in and he is one of recipients", %{
|
|
|
|
current_user: current_user,
|
|
|
|
user: user
|
|
|
|
} do
|
|
|
|
{:ok, direct} =
|
|
|
|
CommonAPI.post(current_user, %{
|
2020-05-12 15:59:26 -04:00
|
|
|
status: "Hi @#{user.nickname}!",
|
|
|
|
visibility: "direct"
|
2019-09-30 03:28:12 -04:00
|
|
|
})
|
|
|
|
|
2019-10-16 10:16:39 -04:00
|
|
|
CommonAPI.favorite(user, direct.id)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
for u <- [user, current_user] do
|
|
|
|
response =
|
|
|
|
build_conn()
|
|
|
|
|> assign(:user, u)
|
|
|
|
|> assign(:token, insert(:oauth_token, user: u, scopes: ["read:favourites"]))
|
|
|
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
2020-05-13 11:06:25 -04:00
|
|
|
|> json_response_and_validate_schema(:ok)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
assert length(response) == 1
|
|
|
|
end
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2020-04-24 15:25:27 -04:00
|
|
|
response =
|
|
|
|
build_conn()
|
|
|
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
2020-05-13 11:06:25 -04:00
|
|
|
|> json_response_and_validate_schema(200)
|
2020-04-24 15:25:27 -04:00
|
|
|
|
|
|
|
assert length(response) == 0
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
test "does not return others' favorited DM when user is not one of recipients", %{
|
|
|
|
conn: conn,
|
|
|
|
user: user
|
|
|
|
} do
|
|
|
|
user_two = insert(:user)
|
|
|
|
|
|
|
|
{:ok, direct} =
|
|
|
|
CommonAPI.post(user_two, %{
|
2020-05-12 15:59:26 -04:00
|
|
|
status: "Hi @#{user.nickname}!",
|
|
|
|
visibility: "direct"
|
2019-09-30 03:28:12 -04:00
|
|
|
})
|
|
|
|
|
2019-10-16 10:16:39 -04:00
|
|
|
CommonAPI.favorite(user, direct.id)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
response =
|
|
|
|
conn
|
|
|
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
2020-05-13 11:06:25 -04:00
|
|
|
|> json_response_and_validate_schema(:ok)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
assert Enum.empty?(response)
|
|
|
|
end
|
|
|
|
|
|
|
|
test "paginates favorites using since_id and max_id", %{
|
|
|
|
conn: conn,
|
|
|
|
user: user
|
|
|
|
} do
|
|
|
|
activities = insert_list(10, :note_activity)
|
|
|
|
|
|
|
|
Enum.each(activities, fn activity ->
|
2019-10-16 10:16:39 -04:00
|
|
|
CommonAPI.favorite(user, activity.id)
|
2019-09-30 03:28:12 -04:00
|
|
|
end)
|
|
|
|
|
|
|
|
third_activity = Enum.at(activities, 2)
|
|
|
|
seventh_activity = Enum.at(activities, 6)
|
|
|
|
|
|
|
|
response =
|
|
|
|
conn
|
2020-05-13 11:06:25 -04:00
|
|
|
|> get(
|
|
|
|
"/api/v1/pleroma/accounts/#{user.id}/favourites?since_id=#{third_activity.id}&max_id=#{
|
|
|
|
seventh_activity.id
|
|
|
|
}"
|
|
|
|
)
|
|
|
|
|> json_response_and_validate_schema(:ok)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
assert length(response) == 3
|
|
|
|
refute third_activity in response
|
|
|
|
refute seventh_activity in response
|
|
|
|
end
|
|
|
|
|
|
|
|
test "limits favorites using limit parameter", %{
|
|
|
|
conn: conn,
|
|
|
|
user: user
|
|
|
|
} do
|
|
|
|
7
|
|
|
|
|> insert_list(:note_activity)
|
|
|
|
|> Enum.each(fn activity ->
|
2019-10-16 10:16:39 -04:00
|
|
|
CommonAPI.favorite(user, activity.id)
|
2019-09-30 03:28:12 -04:00
|
|
|
end)
|
|
|
|
|
|
|
|
response =
|
|
|
|
conn
|
2020-05-13 11:06:25 -04:00
|
|
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites?limit=3")
|
|
|
|
|> json_response_and_validate_schema(:ok)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
assert length(response) == 3
|
|
|
|
end
|
|
|
|
|
|
|
|
test "returns empty response when user does not have any favorited statuses", %{
|
|
|
|
conn: conn,
|
|
|
|
user: user
|
|
|
|
} do
|
|
|
|
response =
|
|
|
|
conn
|
|
|
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
2020-05-13 11:06:25 -04:00
|
|
|
|> json_response_and_validate_schema(:ok)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
|
|
|
assert Enum.empty?(response)
|
|
|
|
end
|
|
|
|
|
|
|
|
test "returns 404 error when specified user is not exist", %{conn: conn} do
|
|
|
|
conn = get(conn, "/api/v1/pleroma/accounts/test/favourites")
|
|
|
|
|
2020-05-13 11:06:25 -04:00
|
|
|
assert json_response_and_validate_schema(conn, 404) == %{"error" => "Record not found"}
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
test "returns 403 error when user has hidden own favorites", %{conn: conn} do
|
2019-10-16 14:59:21 -04:00
|
|
|
user = insert(:user, hide_favorites: true)
|
2019-09-30 03:28:12 -04:00
|
|
|
activity = insert(:note_activity)
|
2019-10-16 10:16:39 -04:00
|
|
|
CommonAPI.favorite(user, activity.id)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/favourites")
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2020-05-13 11:06:25 -04:00
|
|
|
assert json_response_and_validate_schema(conn, 403) == %{"error" => "Can't get favorites"}
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
test "hides favorites for new users by default", %{conn: conn} do
|
2019-09-30 03:28:12 -04:00
|
|
|
user = insert(:user)
|
|
|
|
activity = insert(:note_activity)
|
2019-10-16 10:16:39 -04:00
|
|
|
CommonAPI.favorite(user, activity.id)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2019-10-16 14:59:21 -04:00
|
|
|
assert user.hide_favorites
|
2019-12-19 09:23:27 -05:00
|
|
|
conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/favourites")
|
|
|
|
|
2020-05-13 11:06:25 -04:00
|
|
|
assert json_response_and_validate_schema(conn, 403) == %{"error" => "Can't get favorites"}
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "subscribing / unsubscribing" do
|
2019-12-19 09:23:27 -05:00
|
|
|
test "subscribing / unsubscribing to a user" do
|
|
|
|
%{user: user, conn: conn} = oauth_access(["follow"])
|
2019-09-30 03:28:12 -04:00
|
|
|
subscription_target = insert(:user)
|
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
ret_conn =
|
2019-09-30 03:28:12 -04:00
|
|
|
conn
|
|
|
|
|> assign(:user, user)
|
|
|
|
|> post("/api/v1/pleroma/accounts/#{subscription_target.id}/subscribe")
|
|
|
|
|
2020-05-13 11:06:25 -04:00
|
|
|
assert %{"id" => _id, "subscribing" => true} =
|
|
|
|
json_response_and_validate_schema(ret_conn, 200)
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
conn = post(conn, "/api/v1/pleroma/accounts/#{subscription_target.id}/unsubscribe")
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2020-05-13 11:06:25 -04:00
|
|
|
assert %{"id" => _id, "subscribing" => false} = json_response_and_validate_schema(conn, 200)
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "subscribing" do
|
2019-12-19 09:23:27 -05:00
|
|
|
test "returns 404 when subscription_target not found" do
|
|
|
|
%{conn: conn} = oauth_access(["write:follows"])
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
conn = post(conn, "/api/v1/pleroma/accounts/target_id/subscribe")
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2020-05-13 11:06:25 -04:00
|
|
|
assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn, 404)
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "unsubscribing" do
|
2019-12-19 09:23:27 -05:00
|
|
|
test "returns 404 when subscription_target not found" do
|
|
|
|
%{conn: conn} = oauth_access(["follow"])
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2019-12-19 09:23:27 -05:00
|
|
|
conn = post(conn, "/api/v1/pleroma/accounts/target_id/unsubscribe")
|
2019-09-30 03:28:12 -04:00
|
|
|
|
2020-05-13 11:06:25 -04:00
|
|
|
assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn, 404)
|
2019-09-30 03:28:12 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|