2018-12-23 12:11:29 -08:00
|
|
|
# Pleroma: A lightweight social networking server
|
2019-01-09 04:54:37 -08:00
|
|
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
2018-12-23 12:11:29 -08:00
|
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
2017-09-09 04:15:01 -07:00
|
|
|
defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
|
|
|
use Pleroma.Web.ConnCase
|
|
|
|
|
2019-03-04 18:52:23 -08:00
|
|
|
alias Ecto.Changeset
|
2019-08-13 14:12:37 -07:00
|
|
|
alias Pleroma.Config
|
2019-02-10 13:57:38 -08:00
|
|
|
alias Pleroma.Notification
|
2019-03-04 18:52:23 -08:00
|
|
|
alias Pleroma.Repo
|
|
|
|
alias Pleroma.User
|
|
|
|
alias Pleroma.Web.CommonAPI
|
2019-09-25 20:53:42 -07:00
|
|
|
|
|
|
|
import Pleroma.Factory
|
|
|
|
import Tesla.Mock
|
2018-12-03 10:37:55 -08:00
|
|
|
|
|
|
|
setup do
|
|
|
|
mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
|
|
|
:ok
|
|
|
|
end
|
2017-09-09 04:15:01 -07:00
|
|
|
|
2019-08-19 08:34:29 -07:00
|
|
|
clear_config([:instance, :public])
|
|
|
|
clear_config([:rich_media, :enabled])
|
|
|
|
|
2018-09-01 14:34:15 -07:00
|
|
|
test "getting a list of mutes", %{conn: conn} do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
|
|
|
|
{:ok, user} = User.mute(user, other_user)
|
|
|
|
|
|
|
|
conn =
|
|
|
|
conn
|
|
|
|
|> assign(:user, user)
|
|
|
|
|> get("/api/v1/mutes")
|
|
|
|
|
|
|
|
other_user_id = to_string(other_user.id)
|
|
|
|
assert [%{"id" => ^other_user_id}] = json_response(conn, 200)
|
|
|
|
end
|
|
|
|
|
2017-11-03 00:51:17 -07:00
|
|
|
test "getting a list of blocks", %{conn: conn} do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
|
|
|
|
{:ok, user} = User.block(user, other_user)
|
|
|
|
|
2018-03-30 06:01:53 -07:00
|
|
|
conn =
|
|
|
|
conn
|
|
|
|
|> assign(:user, user)
|
|
|
|
|> get("/api/v1/blocks")
|
2017-11-03 00:51:17 -07:00
|
|
|
|
2017-11-10 08:18:19 -08:00
|
|
|
other_user_id = to_string(other_user.id)
|
2017-11-03 00:51:17 -07:00
|
|
|
assert [%{"id" => ^other_user_id}] = json_response(conn, 200)
|
|
|
|
end
|
|
|
|
|
2018-09-01 14:34:15 -07:00
|
|
|
test "unimplemented follow_requests, blocks, domain blocks" do
|
2017-09-14 09:30:05 -07:00
|
|
|
user = insert(:user)
|
|
|
|
|
2018-09-01 14:34:15 -07:00
|
|
|
["blocks", "domain_blocks", "follow_requests"]
|
2018-03-30 06:01:53 -07:00
|
|
|
|> Enum.each(fn endpoint ->
|
|
|
|
conn =
|
|
|
|
build_conn()
|
|
|
|
|> assign(:user, user)
|
|
|
|
|> get("/api/v1/#{endpoint}")
|
2017-09-14 09:30:05 -07:00
|
|
|
|
|
|
|
assert [] = json_response(conn, 200)
|
|
|
|
end)
|
|
|
|
end
|
2017-09-16 01:42:24 -07:00
|
|
|
|
2017-09-17 04:09:49 -07:00
|
|
|
test "returns the favorites of a user", %{conn: conn} do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
|
|
|
|
{:ok, _} = CommonAPI.post(other_user, %{"status" => "bla"})
|
|
|
|
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "traps are happy"})
|
|
|
|
|
|
|
|
{:ok, _, _} = CommonAPI.favorite(activity.id, user)
|
|
|
|
|
2019-01-13 07:17:47 -08:00
|
|
|
first_conn =
|
2018-03-30 06:01:53 -07:00
|
|
|
conn
|
|
|
|
|> assign(:user, user)
|
|
|
|
|> get("/api/v1/favourites")
|
2017-09-17 04:09:49 -07:00
|
|
|
|
2019-01-13 07:17:47 -08:00
|
|
|
assert [status] = json_response(first_conn, 200)
|
2017-10-31 09:57:26 -07:00
|
|
|
assert status["id"] == to_string(activity.id)
|
2019-01-13 07:17:47 -08:00
|
|
|
|
2019-01-15 20:09:01 -08:00
|
|
|
assert [{"link", _link_header}] =
|
2019-01-13 07:17:47 -08:00
|
|
|
Enum.filter(first_conn.resp_headers, fn element -> match?({"link", _}, element) end)
|
|
|
|
|
|
|
|
# Honours query params
|
|
|
|
{:ok, second_activity} =
|
|
|
|
CommonAPI.post(other_user, %{
|
|
|
|
"status" =>
|
|
|
|
"Trees Are Never Sad Look At Them Every Once In Awhile They're Quite Beautiful."
|
|
|
|
})
|
|
|
|
|
|
|
|
{:ok, _, _} = CommonAPI.favorite(second_activity.id, user)
|
|
|
|
|
|
|
|
last_like = status["id"]
|
|
|
|
|
|
|
|
second_conn =
|
|
|
|
conn
|
|
|
|
|> assign(:user, user)
|
|
|
|
|> get("/api/v1/favourites?since_id=#{last_like}")
|
|
|
|
|
|
|
|
assert [second_status] = json_response(second_conn, 200)
|
|
|
|
assert second_status["id"] == to_string(second_activity.id)
|
|
|
|
|
|
|
|
third_conn =
|
|
|
|
conn
|
|
|
|
|> assign(:user, user)
|
|
|
|
|> get("/api/v1/favourites?limit=0")
|
|
|
|
|
|
|
|
assert [] = json_response(third_conn, 200)
|
2017-09-17 04:09:49 -07:00
|
|
|
end
|
2017-11-11 14:27:09 -08:00
|
|
|
|
2018-02-12 00:33:01 -08:00
|
|
|
test "get instance information", %{conn: conn} do
|
2019-03-26 08:13:24 -07:00
|
|
|
conn = get(conn, "/api/v1/instance")
|
|
|
|
assert result = json_response(conn, 200)
|
|
|
|
|
2019-08-13 14:12:37 -07:00
|
|
|
email = Config.get([:instance, :email])
|
2019-03-26 08:13:24 -07:00
|
|
|
# Note: not checking for "max_toot_chars" since it's optional
|
|
|
|
assert %{
|
2019-03-26 08:18:36 -07:00
|
|
|
"uri" => _,
|
|
|
|
"title" => _,
|
|
|
|
"description" => _,
|
|
|
|
"version" => _,
|
2019-04-10 03:57:41 -07:00
|
|
|
"email" => from_config_email,
|
2019-03-26 08:18:36 -07:00
|
|
|
"urls" => %{
|
|
|
|
"streaming_api" => _
|
|
|
|
},
|
|
|
|
"stats" => _,
|
|
|
|
"thumbnail" => _,
|
|
|
|
"languages" => _,
|
2019-05-20 23:13:10 -07:00
|
|
|
"registrations" => _,
|
2019-10-01 15:16:29 -07:00
|
|
|
"poll_limits" => _,
|
|
|
|
"upload_limit" => _,
|
|
|
|
"avatar_upload_limit" => _,
|
|
|
|
"background_upload_limit" => _,
|
|
|
|
"banner_upload_limit" => _
|
2019-03-26 08:18:36 -07:00
|
|
|
} = result
|
2019-04-10 03:57:41 -07:00
|
|
|
|
|
|
|
assert email == from_config_email
|
2019-03-26 08:13:24 -07:00
|
|
|
end
|
|
|
|
|
|
|
|
test "get instance stats", %{conn: conn} do
|
2017-11-30 05:59:44 -08:00
|
|
|
user = insert(:user, %{local: true})
|
2019-01-17 08:16:02 -08:00
|
|
|
|
|
|
|
user2 = insert(:user, %{local: true})
|
|
|
|
{:ok, _user2} = User.deactivate(user2, !user2.info.deactivated)
|
|
|
|
|
2019-01-16 00:07:46 -08:00
|
|
|
insert(:user, %{local: false, nickname: "u@peer1.com"})
|
|
|
|
insert(:user, %{local: false, nickname: "u@peer2.com"})
|
2017-11-30 05:59:44 -08:00
|
|
|
|
2019-07-15 12:47:23 -07:00
|
|
|
{:ok, _} = CommonAPI.post(user, %{"status" => "cofe"})
|
2017-11-30 05:59:44 -08:00
|
|
|
|
2019-01-22 06:12:53 -08:00
|
|
|
# Stats should count users with missing or nil `info.deactivated` value
|
|
|
|
|
|
|
|
{:ok, _user} =
|
2019-09-24 05:50:07 -07:00
|
|
|
user.id
|
|
|
|
|> User.get_cached_by_id()
|
|
|
|
|> User.update_info(&Changeset.change(&1, %{deactivated: nil}))
|
2019-01-22 06:12:53 -08:00
|
|
|
|
2019-08-14 08:59:33 -07:00
|
|
|
Pleroma.Stats.force_update()
|
2018-01-13 22:28:35 -08:00
|
|
|
|
2019-01-16 00:07:46 -08:00
|
|
|
conn = get(conn, "/api/v1/instance")
|
|
|
|
|
|
|
|
assert result = json_response(conn, 200)
|
|
|
|
|
|
|
|
stats = result["stats"]
|
|
|
|
|
|
|
|
assert stats
|
2019-01-17 08:16:02 -08:00
|
|
|
assert stats["user_count"] == 1
|
2019-01-16 00:07:46 -08:00
|
|
|
assert stats["status_count"] == 1
|
|
|
|
assert stats["domain_count"] == 2
|
|
|
|
end
|
|
|
|
|
|
|
|
test "get peers", %{conn: conn} do
|
|
|
|
insert(:user, %{local: false, nickname: "u@peer1.com"})
|
|
|
|
insert(:user, %{local: false, nickname: "u@peer2.com"})
|
|
|
|
|
2019-08-14 08:59:33 -07:00
|
|
|
Pleroma.Stats.force_update()
|
2019-01-16 00:07:46 -08:00
|
|
|
|
|
|
|
conn = get(conn, "/api/v1/instance/peers")
|
2017-11-30 05:59:44 -08:00
|
|
|
|
|
|
|
assert result = json_response(conn, 200)
|
|
|
|
|
2019-01-16 00:07:46 -08:00
|
|
|
assert ["peer1.com", "peer2.com"] == Enum.sort(result)
|
2017-11-30 05:59:44 -08:00
|
|
|
end
|
2018-12-16 03:15:34 -08:00
|
|
|
|
|
|
|
test "put settings", %{conn: conn} do
|
|
|
|
user = insert(:user)
|
|
|
|
|
|
|
|
conn =
|
|
|
|
conn
|
|
|
|
|> assign(:user, user)
|
|
|
|
|> put("/api/web/settings", %{"data" => %{"programming" => "socks"}})
|
|
|
|
|
2019-01-15 20:09:01 -08:00
|
|
|
assert _result = json_response(conn, 200)
|
2018-12-16 03:15:34 -08:00
|
|
|
|
|
|
|
user = User.get_cached_by_ap_id(user.ap_id)
|
|
|
|
assert user.info.settings == %{"programming" => "socks"}
|
|
|
|
end
|
2019-01-07 05:45:33 -08:00
|
|
|
|
2019-03-06 18:29:42 -08:00
|
|
|
describe "link headers" do
|
|
|
|
test "preserves parameters in link headers", %{conn: conn} do
|
|
|
|
user = insert(:user)
|
|
|
|
other_user = insert(:user)
|
|
|
|
|
|
|
|
{:ok, activity1} =
|
|
|
|
CommonAPI.post(other_user, %{
|
|
|
|
"status" => "hi @#{user.nickname}",
|
|
|
|
"visibility" => "public"
|
|
|
|
})
|
2019-03-28 02:39:10 -07:00
|
|
|
|
2019-03-06 18:29:42 -08:00
|
|
|
{:ok, activity2} =
|
|
|
|
CommonAPI.post(other_user, %{
|
|
|
|
"status" => "hi @#{user.nickname}",
|
|
|
|
"visibility" => "public"
|
|
|
|
})
|
2019-03-28 02:39:10 -07:00
|
|
|
|
2019-03-06 18:29:42 -08:00
|
|
|
notification1 = Repo.get_by(Notification, activity_id: activity1.id)
|
|
|
|
notification2 = Repo.get_by(Notification, activity_id: activity2.id)
|
2019-03-28 02:39:10 -07:00
|
|
|
|
2019-03-06 18:29:42 -08:00
|
|
|
conn =
|
2019-03-28 02:39:10 -07:00
|
|
|
conn
|
|
|
|
|> assign(:user, user)
|
2019-03-06 18:29:42 -08:00
|
|
|
|> get("/api/v1/notifications", %{media_only: true})
|
2019-03-28 02:39:10 -07:00
|
|
|
|
2019-03-06 18:29:42 -08:00
|
|
|
assert [link_header] = get_resp_header(conn, "link")
|
|
|
|
assert link_header =~ ~r/media_only=true/
|
2019-03-25 14:19:57 -07:00
|
|
|
assert link_header =~ ~r/min_id=#{notification2.id}/
|
2019-03-06 18:29:42 -08:00
|
|
|
assert link_header =~ ~r/max_id=#{notification1.id}/
|
2019-03-28 02:39:10 -07:00
|
|
|
end
|
2019-03-06 18:29:42 -08:00
|
|
|
end
|
2019-03-28 02:39:10 -07:00
|
|
|
|
2019-04-01 03:17:57 -07:00
|
|
|
describe "custom emoji" do
|
|
|
|
test "with tags", %{conn: conn} do
|
|
|
|
[emoji | _body] =
|
2019-03-28 02:39:10 -07:00
|
|
|
conn
|
2019-04-01 03:17:57 -07:00
|
|
|
|> get("/api/v1/custom_emojis")
|
|
|
|
|> json_response(200)
|
2019-03-28 02:39:10 -07:00
|
|
|
|
2019-04-01 03:17:57 -07:00
|
|
|
assert Map.has_key?(emoji, "shortcode")
|
|
|
|
assert Map.has_key?(emoji, "static_url")
|
|
|
|
assert Map.has_key?(emoji, "tags")
|
|
|
|
assert is_list(emoji["tags"])
|
2019-06-29 16:05:28 -07:00
|
|
|
assert Map.has_key?(emoji, "category")
|
2019-04-01 03:17:57 -07:00
|
|
|
assert Map.has_key?(emoji, "url")
|
|
|
|
assert Map.has_key?(emoji, "visible_in_picker")
|
2019-03-28 02:39:10 -07:00
|
|
|
end
|
2019-04-01 03:17:57 -07:00
|
|
|
end
|
2019-03-28 02:39:10 -07:00
|
|
|
|
2019-04-05 16:36:42 -07:00
|
|
|
describe "index/2 redirections" do
|
|
|
|
setup %{conn: conn} do
|
|
|
|
session_opts = [
|
|
|
|
store: :cookie,
|
|
|
|
key: "_test",
|
|
|
|
signing_salt: "cooldude"
|
|
|
|
]
|
2019-03-28 02:39:10 -07:00
|
|
|
|
2019-04-05 16:36:42 -07:00
|
|
|
conn =
|
2019-03-28 02:39:10 -07:00
|
|
|
conn
|
2019-04-05 16:36:42 -07:00
|
|
|
|> Plug.Session.call(Plug.Session.init(session_opts))
|
|
|
|
|> fetch_session()
|
2019-03-28 02:39:10 -07:00
|
|
|
|
2019-04-05 16:36:42 -07:00
|
|
|
test_path = "/web/statuses/test"
|
|
|
|
%{conn: conn, path: test_path}
|
|
|
|
end
|
2019-03-28 02:39:10 -07:00
|
|
|
|
2019-04-05 16:36:42 -07:00
|
|
|
test "redirects not logged-in users to the login page", %{conn: conn, path: path} do
|
|
|
|
conn = get(conn, path)
|
2019-03-28 02:39:10 -07:00
|
|
|
|
2019-04-05 16:36:42 -07:00
|
|
|
assert conn.status == 302
|
|
|
|
assert redirected_to(conn) == "/web/login"
|
2019-03-28 02:39:10 -07:00
|
|
|
end
|
2019-04-11 19:21:32 -07:00
|
|
|
|
2019-07-29 09:17:22 -07:00
|
|
|
test "redirects not logged-in users to the login page on private instances", %{
|
|
|
|
conn: conn,
|
|
|
|
path: path
|
|
|
|
} do
|
2019-08-13 14:12:37 -07:00
|
|
|
Config.put([:instance, :public], false)
|
2019-07-29 09:17:22 -07:00
|
|
|
|
|
|
|
conn = get(conn, path)
|
2019-04-11 19:21:32 -07:00
|
|
|
|
2019-07-29 09:17:22 -07:00
|
|
|
assert conn.status == 302
|
|
|
|
assert redirected_to(conn) == "/web/login"
|
|
|
|
end
|
2019-04-11 19:21:32 -07:00
|
|
|
|
2019-04-05 16:36:42 -07:00
|
|
|
test "does not redirect logged in users to the login page", %{conn: conn, path: path} do
|
|
|
|
token = insert(:oauth_token)
|
2019-04-11 19:21:32 -07:00
|
|
|
|
2019-04-05 16:36:42 -07:00
|
|
|
conn =
|
|
|
|
conn
|
|
|
|
|> assign(:user, token.user)
|
|
|
|
|> put_session(:oauth_token, token.token)
|
|
|
|
|> get(path)
|
2019-04-11 19:21:32 -07:00
|
|
|
|
2019-04-05 16:36:42 -07:00
|
|
|
assert conn.status == 200
|
|
|
|
end
|
2019-04-11 19:21:32 -07:00
|
|
|
|
2019-04-05 16:36:42 -07:00
|
|
|
test "saves referer path to session", %{conn: conn, path: path} do
|
|
|
|
conn = get(conn, path)
|
|
|
|
return_to = Plug.Conn.get_session(conn, :return_to)
|
2019-04-11 19:21:32 -07:00
|
|
|
|
2019-04-05 16:36:42 -07:00
|
|
|
assert return_to == path
|
|
|
|
end
|
2019-09-06 11:50:00 -07:00
|
|
|
end
|
|
|
|
|
|
|
|
describe "empty_array, stubs for mastodon api" do
|
|
|
|
test "GET /api/v1/accounts/:id/identity_proofs", %{conn: conn} do
|
|
|
|
user = insert(:user)
|
|
|
|
|
|
|
|
res =
|
|
|
|
conn
|
|
|
|
|> assign(:user, user)
|
|
|
|
|> get("/api/v1/accounts/#{user.id}/identity_proofs")
|
|
|
|
|> json_response(200)
|
|
|
|
|
|
|
|
assert res == []
|
|
|
|
end
|
|
|
|
|
|
|
|
test "GET /api/v1/endorsements", %{conn: conn} do
|
|
|
|
user = insert(:user)
|
|
|
|
|
|
|
|
res =
|
|
|
|
conn
|
|
|
|
|> assign(:user, user)
|
|
|
|
|> get("/api/v1/endorsements")
|
|
|
|
|> json_response(200)
|
|
|
|
|
|
|
|
assert res == []
|
|
|
|
end
|
|
|
|
|
|
|
|
test "GET /api/v1/trends", %{conn: conn} do
|
|
|
|
user = insert(:user)
|
|
|
|
|
|
|
|
res =
|
|
|
|
conn
|
|
|
|
|> assign(:user, user)
|
|
|
|
|> get("/api/v1/trends")
|
|
|
|
|> json_response(200)
|
|
|
|
|
|
|
|
assert res == []
|
|
|
|
end
|
|
|
|
end
|
2017-09-09 04:15:01 -07:00
|
|
|
end
|