1 defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
2 use Pleroma.Web.ConnCase
4 alias Pleroma.Web.TwitterAPI.TwitterAPI
5 alias Pleroma.{Repo, User, Activity}
6 alias Pleroma.Web.{OStatus, CommonAPI}
10 test "the home timeline", %{conn: conn} do
12 following = insert(:user)
14 {:ok, _activity} = TwitterAPI.create_status(following, %{"status" => "test"})
17 |> assign(:user, user)
18 |> get("/api/v1/timelines/home")
20 assert length(json_response(conn, 200)) == 0
22 {:ok, user} = User.follow(user, following)
25 |> assign(:user, user)
26 |> get("/api/v1/timelines/home")
28 assert [%{"content" => "test"}] = json_response(conn, 200)
31 test "the public timeline", %{conn: conn} do
32 following = insert(:user)
34 {:ok, _activity} = TwitterAPI.create_status(following, %{"status" => "test"})
35 {:ok, [_activity]} = OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873")
38 |> get("/api/v1/timelines/public")
40 assert length(json_response(conn, 200)) == 2
43 |> get("/api/v1/timelines/public", %{"local" => "True"})
45 assert [%{"content" => "test"}] = json_response(conn, 200)
48 test "posting a status", %{conn: conn} do
52 |> assign(:user, user)
53 |> post("/api/v1/statuses", %{"status" => "cofe", "spoiler_text" => "2hu"})
55 assert %{"content" => "cofe", "id" => id, "spoiler_text" => "2hu"} = json_response(conn, 200)
56 assert Repo.get(Activity, id)
59 test "replying to a status", %{conn: conn} do
62 {:ok, replied_to} = TwitterAPI.create_status(user, %{"status" => "cofe"})
65 |> assign(:user, user)
66 |> post("/api/v1/statuses", %{"status" => "xD", "in_reply_to_id" => replied_to.id})
68 assert %{"content" => "xD", "id" => id} = json_response(conn, 200)
70 activity = Repo.get(Activity, id)
72 assert activity.data["context"] == replied_to.data["context"]
73 assert activity.data["object"]["inReplyToStatusId"] == replied_to.id
76 test "verify_credentials", %{conn: conn} do
80 |> assign(:user, user)
81 |> get("/api/v1/accounts/verify_credentials")
83 assert %{"id" => id} = json_response(conn, 200)
84 assert id == to_string(user.id)
87 test "get a status", %{conn: conn} do
88 activity = insert(:note_activity)
91 |> get("/api/v1/statuses/#{activity.id}")
93 assert %{"id" => id} = json_response(conn, 200)
94 assert id == to_string(activity.id)
97 describe "deleting a status" do
98 test "when you created it", %{conn: conn} do
99 activity = insert(:note_activity)
100 author = User.get_by_ap_id(activity.data["actor"])
103 |> assign(:user, author)
104 |> delete("/api/v1/statuses/#{activity.id}")
106 assert %{} = json_response(conn, 200)
108 assert Repo.get(Activity, activity.id) == nil
111 test "when you didn't create it", %{conn: conn} do
112 activity = insert(:note_activity)
116 |> assign(:user, user)
117 |> delete("/api/v1/statuses/#{activity.id}")
119 assert %{"error" => _} = json_response(conn, 403)
121 assert Repo.get(Activity, activity.id) == activity
125 describe "reblogging" do
126 test "reblogs and returns the reblogged status", %{conn: conn} do
127 activity = insert(:note_activity)
131 |> assign(:user, user)
132 |> post("/api/v1/statuses/#{activity.id}/reblog")
134 assert %{"id" => id, "reblogged" => true, "reblogs_count" => 1} = json_response(conn, 200)
135 assert to_string(activity.id) == id
139 describe "favoriting" do
140 test "favs a status and returns it", %{conn: conn} do
141 activity = insert(:note_activity)
145 |> assign(:user, user)
146 |> post("/api/v1/statuses/#{activity.id}/favourite")
148 assert %{"id" => id, "favourites_count" => 1, "favourited" => true} = json_response(conn, 200)
149 assert to_string(activity.id) == id
153 describe "unfavoriting" do
154 test "unfavorites a status and returns it", %{conn: conn} do
155 activity = insert(:note_activity)
158 {:ok, _, _} = CommonAPI.favorite(activity.id, user)
161 |> assign(:user, user)
162 |> post("/api/v1/statuses/#{activity.id}/unfavourite")
164 assert %{"id" => id, "favourites_count" => 0, "favourited" => false} = json_response(conn, 200)
165 assert to_string(activity.id) == id
169 describe "user timelines" do
170 test "gets a users statuses", %{conn: conn} do
171 _note = insert(:note_activity)
172 note_two = insert(:note_activity)
174 user = User.get_by_ap_id(note_two.data["actor"])
177 |> get("/api/v1/accounts/#{user.id}/statuses")
179 assert [%{"id" => id}] = json_response(conn, 200)
181 assert id == to_string(note_two.id)
185 describe "user relationships" do
186 test "returns the relationships for the current user", %{conn: conn} do
188 other_user = insert(:user)
189 {:ok, user} = User.follow(user, other_user)
192 |> assign(:user, user)
193 |> get("/api/v1/accounts/relationships", %{"id" => [other_user.id]})
195 assert [relationship] = json_response(conn, 200)
197 assert to_string(other_user.id) == relationship["id"]
201 test "account fetching", %{conn: conn} do
205 |> get("/api/v1/accounts/#{user.id}")
207 assert %{"id" => id} = json_response(conn, 200)
208 assert id == to_string(user.id)
211 |> get("/api/v1/accounts/-1")
213 assert %{"error" => "Can't find user"} = json_response(conn, 404)
216 test "media upload", %{conn: conn} do
217 file = %Plug.Upload{content_type: "image/jpg", path: Path.absname("test/fixtures/image.jpg"), filename: "an_image.jpg"}
222 |> assign(:user, user)
223 |> post("/api/v1/media", %{"file" => file})
225 assert media = json_response(conn, 200)
227 assert media["type"] == "image"
230 test "hashtag timeline", %{conn: conn} do
231 following = insert(:user)
233 {:ok, activity} = TwitterAPI.create_status(following, %{"status" => "test #2hu"})
234 {:ok, [_activity]} = OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873")
237 |> get("/api/v1/timelines/tag/2hu")
239 assert [%{"id" => id}] = json_response(conn, 200)
241 assert id == to_string(activity.id)
244 test "getting followers", %{conn: conn} do
246 other_user = insert(:user)
247 {:ok, user} = User.follow(user, other_user)
250 |> get("/api/v1/accounts/#{other_user.id}/followers")
252 assert [%{"id" => id}] = json_response(conn, 200)
253 assert id == to_string(user.id)
256 test "getting following", %{conn: conn} do
258 other_user = insert(:user)
259 {:ok, user} = User.follow(user, other_user)
262 |> get("/api/v1/accounts/#{user.id}/following")
264 assert [%{"id" => id}] = json_response(conn, 200)
265 assert id == to_string(other_user.id)
268 test "following / unfollowing a user", %{conn: conn} do
270 other_user = insert(:user)
273 |> assign(:user, user)
274 |> post("/api/v1/accounts/#{other_user.id}/follow")
276 assert %{"id" => id, "following" => true} = json_response(conn, 200)
278 user = Repo.get(User, user.id)
280 |> assign(:user, user)
281 |> post("/api/v1/accounts/#{other_user.id}/unfollow")
283 assert %{"id" => id, "following" => false} = json_response(conn, 200)
285 user = Repo.get(User, user.id)
287 |> assign(:user, user)
288 |> post("/api/v1/follows", %{"uri" => other_user.nickname})
290 assert %{"id" => id} = json_response(conn, 200)
291 assert id == to_string(other_user.id)
294 test "blocking / unblocking a user", %{conn: conn} do
296 other_user = insert(:user)
299 |> assign(:user, user)
300 |> post("/api/v1/accounts/#{other_user.id}/block")
302 assert %{"id" => id, "blocking" => true} = json_response(conn, 200)
304 user = Repo.get(User, user.id)
306 |> assign(:user, user)
307 |> post("/api/v1/accounts/#{other_user.id}/unblock")
309 assert %{"id" => id, "blocking" => false} = json_response(conn, 200)
312 test "getting a list of blocks", %{conn: conn} do
314 other_user = insert(:user)
316 {:ok, user} = User.block(user, other_user)
319 |> assign(:user, user)
320 |> get("/api/v1/blocks")
322 other_user_id = to_string(other_user.id)
323 assert [%{"id" => ^other_user_id}] = json_response(conn, 200)
326 test "unimplemented mute endpoints" do
328 other_user = insert(:user)
331 |> Enum.each(fn(endpoint) ->
333 |> assign(:user, user)
334 |> post("/api/v1/accounts/#{other_user.id}/#{endpoint}")
336 assert %{"id" => id} = json_response(conn, 200)
337 assert id == to_string(other_user.id)
341 test "unimplemented mutes, follow_requests, blocks, domain blocks" do
344 ["blocks", "domain_blocks", "mutes", "follow_requests"]
345 |> Enum.each(fn(endpoint) ->
347 |> assign(:user, user)
348 |> get("/api/v1/#{endpoint}")
350 assert [] = json_response(conn, 200)
354 test "account search", %{conn: conn} do
356 user_two = insert(:user, %{nickname: "shp@shitposter.club"})
357 user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
360 |> assign(:user, user)
361 |> get("/api/v1/accounts/search", %{"q" => "2hu"})
363 assert [account] = json_response(conn, 200)
364 assert account["id"] == to_string(user_three.id)
367 test "search", %{conn: conn} do
369 user_two = insert(:user, %{nickname: "shp@shitposter.club"})
370 user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
372 {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu"})
373 {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"})
376 |> get("/api/v1/search", %{"q" => "2hu"})
378 assert results = json_response(conn, 200)
380 [account] = results["accounts"]
381 assert account["id"] == to_string(user_three.id)
383 assert results["hashtags"] == []
385 [status] = results["statuses"]
386 assert status["id"] == to_string(activity.id)
389 test "search fetches remote statuses", %{conn: conn} do
391 |> get("/api/v1/search", %{"q" => "https://shitposter.club/notice/2827873"})
392 assert results = json_response(conn, 200)
394 [status] = results["statuses"]
395 assert status["uri"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
398 test "search fetches remote accounts", %{conn: conn} do
400 |> get("/api/v1/search", %{"q" => "shp@social.heldscal.la", "resolve" => "true"})
402 assert results = json_response(conn, 200)
403 [account] = results["accounts"]
404 assert account["acct"] == "shp@social.heldscal.la"
407 test "returns the favorites of a user", %{conn: conn} do
409 other_user = insert(:user)
411 {:ok, _} = CommonAPI.post(other_user, %{"status" => "bla"})
412 {:ok, activity} = CommonAPI.post(other_user, %{"status" => "traps are happy"})
414 {:ok, _, _} = CommonAPI.favorite(activity.id, user)
417 |> assign(:user, user)
418 |> get("/api/v1/favourites")
420 assert [status] = json_response(conn, 200)
421 assert status["id"] == to_string(activity.id)
424 describe "updating credentials" do
425 test "updates the user's bio" do
429 |> assign(:user, user)
430 |> patch("/api/v1/accounts/update_credentials", %{"note" => "I drink #cofe"})
432 assert user = json_response(conn, 200)
433 assert user["note"] == "I drink #cofe"
436 test "updates the user's name" do
440 |> assign(:user, user)
441 |> patch("/api/v1/accounts/update_credentials", %{"display_name" => "markorepairs"})
443 assert user = json_response(conn, 200)
444 assert user["display_name"] == "markorepairs"
447 test "updates the user's avatar" do
450 new_avatar = %Plug.Upload{content_type: "image/jpg", path: Path.absname("test/fixtures/image.jpg"), filename: "an_image.jpg"}
453 |> assign(:user, user)
454 |> patch("/api/v1/accounts/update_credentials", %{"avatar" => new_avatar})
456 assert user = json_response(conn, 200)
457 assert user["avatar"] != "https://placehold.it/48x48"
460 test "updates the user's banner" do
463 new_header = %Plug.Upload{content_type: "image/jpg", path: Path.absname("test/fixtures/image.jpg"), filename: "an_image.jpg"}
466 |> assign(:user, user)
467 |> patch("/api/v1/accounts/update_credentials", %{"header" => new_header})
469 assert user = json_response(conn, 200)
470 assert user["header"] != "https://placehold.it/700x335"