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
10 alias Pleroma.Notification
13 alias Pleroma.Web.CommonAPI
15 import Pleroma.Factory
19 mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
23 clear_config([:instance, :public])
24 clear_config([:rich_media, :enabled])
26 test "getting a list of mutes", %{conn: conn} do
28 other_user = insert(:user)
30 {:ok, user} = User.mute(user, other_user)
34 |> assign(:user, user)
35 |> get("/api/v1/mutes")
37 other_user_id = to_string(other_user.id)
38 assert [%{"id" => ^other_user_id}] = json_response(conn, 200)
41 test "getting a list of blocks", %{conn: conn} do
43 other_user = insert(:user)
45 {:ok, user} = User.block(user, other_user)
49 |> assign(:user, user)
50 |> get("/api/v1/blocks")
52 other_user_id = to_string(other_user.id)
53 assert [%{"id" => ^other_user_id}] = json_response(conn, 200)
56 test "unimplemented follow_requests, blocks, domain blocks" do
59 ["blocks", "domain_blocks", "follow_requests"]
60 |> Enum.each(fn endpoint ->
63 |> assign(:user, user)
64 |> get("/api/v1/#{endpoint}")
66 assert [] = json_response(conn, 200)
70 test "returns the favorites of a user", %{conn: conn} do
72 other_user = insert(:user)
74 {:ok, _} = CommonAPI.post(other_user, %{"status" => "bla"})
75 {:ok, activity} = CommonAPI.post(other_user, %{"status" => "traps are happy"})
77 {:ok, _, _} = CommonAPI.favorite(activity.id, user)
81 |> assign(:user, user)
82 |> get("/api/v1/favourites")
84 assert [status] = json_response(first_conn, 200)
85 assert status["id"] == to_string(activity.id)
87 assert [{"link", _link_header}] =
88 Enum.filter(first_conn.resp_headers, fn element -> match?({"link", _}, element) end)
90 # Honours query params
91 {:ok, second_activity} =
92 CommonAPI.post(other_user, %{
94 "Trees Are Never Sad Look At Them Every Once In Awhile They're Quite Beautiful."
97 {:ok, _, _} = CommonAPI.favorite(second_activity.id, user)
99 last_like = status["id"]
103 |> assign(:user, user)
104 |> get("/api/v1/favourites?since_id=#{last_like}")
106 assert [second_status] = json_response(second_conn, 200)
107 assert second_status["id"] == to_string(second_activity.id)
111 |> assign(:user, user)
112 |> get("/api/v1/favourites?limit=0")
114 assert [] = json_response(third_conn, 200)
117 test "get instance information", %{conn: conn} do
118 conn = get(conn, "/api/v1/instance")
119 assert result = json_response(conn, 200)
121 email = Config.get([:instance, :email])
122 # Note: not checking for "max_toot_chars" since it's optional
128 "email" => from_config_email,
135 "registrations" => _,
139 assert email == from_config_email
142 test "get instance stats", %{conn: conn} do
143 user = insert(:user, %{local: true})
145 user2 = insert(:user, %{local: true})
146 {:ok, _user2} = User.deactivate(user2, !user2.info.deactivated)
148 insert(:user, %{local: false, nickname: "u@peer1.com"})
149 insert(:user, %{local: false, nickname: "u@peer2.com"})
151 {:ok, _} = CommonAPI.post(user, %{"status" => "cofe"})
153 # Stats should count users with missing or nil `info.deactivated` value
157 |> User.get_cached_by_id()
158 |> User.update_info(&Changeset.change(&1, %{deactivated: nil}))
160 Pleroma.Stats.force_update()
162 conn = get(conn, "/api/v1/instance")
164 assert result = json_response(conn, 200)
166 stats = result["stats"]
169 assert stats["user_count"] == 1
170 assert stats["status_count"] == 1
171 assert stats["domain_count"] == 2
174 test "get peers", %{conn: conn} do
175 insert(:user, %{local: false, nickname: "u@peer1.com"})
176 insert(:user, %{local: false, nickname: "u@peer2.com"})
178 Pleroma.Stats.force_update()
180 conn = get(conn, "/api/v1/instance/peers")
182 assert result = json_response(conn, 200)
184 assert ["peer1.com", "peer2.com"] == Enum.sort(result)
187 test "put settings", %{conn: conn} do
192 |> assign(:user, user)
193 |> put("/api/web/settings", %{"data" => %{"programming" => "socks"}})
195 assert _result = json_response(conn, 200)
197 user = User.get_cached_by_ap_id(user.ap_id)
198 assert user.info.settings == %{"programming" => "socks"}
201 describe "link headers" do
202 test "preserves parameters in link headers", %{conn: conn} do
204 other_user = insert(:user)
207 CommonAPI.post(other_user, %{
208 "status" => "hi @#{user.nickname}",
209 "visibility" => "public"
213 CommonAPI.post(other_user, %{
214 "status" => "hi @#{user.nickname}",
215 "visibility" => "public"
218 notification1 = Repo.get_by(Notification, activity_id: activity1.id)
219 notification2 = Repo.get_by(Notification, activity_id: activity2.id)
223 |> assign(:user, user)
224 |> get("/api/v1/notifications", %{media_only: true})
226 assert [link_header] = get_resp_header(conn, "link")
227 assert link_header =~ ~r/media_only=true/
228 assert link_header =~ ~r/min_id=#{notification2.id}/
229 assert link_header =~ ~r/max_id=#{notification1.id}/
233 describe "custom emoji" do
234 test "with tags", %{conn: conn} do
237 |> get("/api/v1/custom_emojis")
238 |> json_response(200)
240 assert Map.has_key?(emoji, "shortcode")
241 assert Map.has_key?(emoji, "static_url")
242 assert Map.has_key?(emoji, "tags")
243 assert is_list(emoji["tags"])
244 assert Map.has_key?(emoji, "category")
245 assert Map.has_key?(emoji, "url")
246 assert Map.has_key?(emoji, "visible_in_picker")
250 describe "index/2 redirections" do
251 setup %{conn: conn} do
255 signing_salt: "cooldude"
260 |> Plug.Session.call(Plug.Session.init(session_opts))
263 test_path = "/web/statuses/test"
264 %{conn: conn, path: test_path}
267 test "redirects not logged-in users to the login page", %{conn: conn, path: path} do
268 conn = get(conn, path)
270 assert conn.status == 302
271 assert redirected_to(conn) == "/web/login"
274 test "redirects not logged-in users to the login page on private instances", %{
278 Config.put([:instance, :public], false)
280 conn = get(conn, path)
282 assert conn.status == 302
283 assert redirected_to(conn) == "/web/login"
286 test "does not redirect logged in users to the login page", %{conn: conn, path: path} do
287 token = insert(:oauth_token)
291 |> assign(:user, token.user)
292 |> put_session(:oauth_token, token.token)
295 assert conn.status == 200
298 test "saves referer path to session", %{conn: conn, path: path} do
299 conn = get(conn, path)
300 return_to = Plug.Conn.get_session(conn, :return_to)
302 assert return_to == path
306 describe "empty_array, stubs for mastodon api" do
307 test "GET /api/v1/accounts/:id/identity_proofs", %{conn: conn} do
312 |> assign(:user, user)
313 |> get("/api/v1/accounts/#{user.id}/identity_proofs")
314 |> json_response(200)
319 test "GET /api/v1/endorsements", %{conn: conn} do
324 |> assign(:user, user)
325 |> get("/api/v1/endorsements")
326 |> json_response(200)
331 test "GET /api/v1/trends", %{conn: conn} do
336 |> assign(:user, user)
337 |> get("/api/v1/trends")
338 |> json_response(200)