1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
6 use Pleroma.Web.ConnCase
9 alias Pleroma.Notification
12 alias Pleroma.Web.CommonAPI
14 import Pleroma.Factory
18 mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
22 clear_config([:instance, :public])
23 clear_config([:rich_media, :enabled])
25 test "getting a list of mutes", %{conn: conn} do
27 other_user = insert(:user)
29 {:ok, user} = User.mute(user, other_user)
33 |> assign(:user, user)
34 |> get("/api/v1/mutes")
36 other_user_id = to_string(other_user.id)
37 assert [%{"id" => ^other_user_id}] = json_response(conn, 200)
40 test "getting a list of blocks", %{conn: conn} do
42 other_user = insert(:user)
44 {:ok, user} = User.block(user, other_user)
48 |> assign(:user, user)
49 |> get("/api/v1/blocks")
51 other_user_id = to_string(other_user.id)
52 assert [%{"id" => ^other_user_id}] = json_response(conn, 200)
55 test "unimplemented follow_requests, blocks, domain blocks" do
58 ["blocks", "domain_blocks", "follow_requests"]
59 |> Enum.each(fn endpoint ->
62 |> assign(:user, user)
63 |> get("/api/v1/#{endpoint}")
65 assert [] = json_response(conn, 200)
69 test "returns the favorites of a user", %{conn: conn} do
71 other_user = insert(:user)
73 {:ok, _} = CommonAPI.post(other_user, %{"status" => "bla"})
74 {:ok, activity} = CommonAPI.post(other_user, %{"status" => "traps are happy"})
76 {:ok, _, _} = CommonAPI.favorite(activity.id, user)
80 |> assign(:user, user)
81 |> get("/api/v1/favourites")
83 assert [status] = json_response(first_conn, 200)
84 assert status["id"] == to_string(activity.id)
86 assert [{"link", _link_header}] =
87 Enum.filter(first_conn.resp_headers, fn element -> match?({"link", _}, element) end)
89 # Honours query params
90 {:ok, second_activity} =
91 CommonAPI.post(other_user, %{
93 "Trees Are Never Sad Look At Them Every Once In Awhile They're Quite Beautiful."
96 {:ok, _, _} = CommonAPI.favorite(second_activity.id, user)
98 last_like = status["id"]
102 |> assign(:user, user)
103 |> get("/api/v1/favourites?since_id=#{last_like}")
105 assert [second_status] = json_response(second_conn, 200)
106 assert second_status["id"] == to_string(second_activity.id)
110 |> assign(:user, user)
111 |> get("/api/v1/favourites?limit=0")
113 assert [] = json_response(third_conn, 200)
116 test "put settings", %{conn: conn} do
121 |> assign(:user, user)
122 |> put("/api/web/settings", %{"data" => %{"programming" => "socks"}})
124 assert _result = json_response(conn, 200)
126 user = User.get_cached_by_ap_id(user.ap_id)
127 assert user.info.settings == %{"programming" => "socks"}
130 describe "link headers" do
131 test "preserves parameters in link headers", %{conn: conn} do
133 other_user = insert(:user)
136 CommonAPI.post(other_user, %{
137 "status" => "hi @#{user.nickname}",
138 "visibility" => "public"
142 CommonAPI.post(other_user, %{
143 "status" => "hi @#{user.nickname}",
144 "visibility" => "public"
147 notification1 = Repo.get_by(Notification, activity_id: activity1.id)
148 notification2 = Repo.get_by(Notification, activity_id: activity2.id)
152 |> assign(:user, user)
153 |> get("/api/v1/notifications", %{media_only: true})
155 assert [link_header] = get_resp_header(conn, "link")
156 assert link_header =~ ~r/media_only=true/
157 assert link_header =~ ~r/min_id=#{notification2.id}/
158 assert link_header =~ ~r/max_id=#{notification1.id}/
162 describe "custom emoji" do
163 test "with tags", %{conn: conn} do
166 |> get("/api/v1/custom_emojis")
167 |> json_response(200)
169 assert Map.has_key?(emoji, "shortcode")
170 assert Map.has_key?(emoji, "static_url")
171 assert Map.has_key?(emoji, "tags")
172 assert is_list(emoji["tags"])
173 assert Map.has_key?(emoji, "category")
174 assert Map.has_key?(emoji, "url")
175 assert Map.has_key?(emoji, "visible_in_picker")
179 describe "index/2 redirections" do
180 setup %{conn: conn} do
184 signing_salt: "cooldude"
189 |> Plug.Session.call(Plug.Session.init(session_opts))
192 test_path = "/web/statuses/test"
193 %{conn: conn, path: test_path}
196 test "redirects not logged-in users to the login page", %{conn: conn, path: path} do
197 conn = get(conn, path)
199 assert conn.status == 302
200 assert redirected_to(conn) == "/web/login"
203 test "redirects not logged-in users to the login page on private instances", %{
207 Config.put([:instance, :public], false)
209 conn = get(conn, path)
211 assert conn.status == 302
212 assert redirected_to(conn) == "/web/login"
215 test "does not redirect logged in users to the login page", %{conn: conn, path: path} do
216 token = insert(:oauth_token)
220 |> assign(:user, token.user)
221 |> put_session(:oauth_token, token.token)
224 assert conn.status == 200
227 test "saves referer path to session", %{conn: conn, path: path} do
228 conn = get(conn, path)
229 return_to = Plug.Conn.get_session(conn, :return_to)
231 assert return_to == path
235 describe "empty_array, stubs for mastodon api" do
236 test "GET /api/v1/accounts/:id/identity_proofs", %{conn: conn} do
241 |> assign(:user, user)
242 |> get("/api/v1/accounts/#{user.id}/identity_proofs")
243 |> json_response(200)
248 test "GET /api/v1/endorsements", %{conn: conn} do
253 |> assign(:user, user)
254 |> get("/api/v1/endorsements")
255 |> json_response(200)
260 test "GET /api/v1/trends", %{conn: conn} do
265 |> assign(:user, user)
266 |> get("/api/v1/trends")
267 |> json_response(200)