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"})
55 assert %{"content" => "cofe", "id" => id} = 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)
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 == 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 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 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 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 == 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 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)
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 == 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)
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 = 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 other_user = json_response(conn, 200)
293 test "unimplemented block/mute endpoints" do
295 other_user = insert(:user)
297 ["block", "unblock", "mute", "unmute"]
298 |> Enum.each(fn(endpoint) ->
300 |> assign(:user, user)
301 |> post("/api/v1/accounts/#{other_user.id}/#{endpoint}")
303 assert %{"id" => id} = json_response(conn, 200)
304 assert id == other_user.id
308 test "unimplemented mutes, follow_requests, blocks, domain blocks" do
311 ["blocks", "domain_blocks", "mutes", "follow_requests"]
312 |> Enum.each(fn(endpoint) ->
314 |> assign(:user, user)
315 |> get("/api/v1/#{endpoint}")
317 assert [] = json_response(conn, 200)
321 test "search", %{conn: conn} do
323 user_two = insert(:user, %{nickname: "shp@shitposter.club"})
324 user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
326 {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu"})
327 {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"})
330 |> get("/api/v1/search", %{"q" => "2hu"})
332 assert results = json_response(conn, 200)
334 [account] = results["accounts"]
335 assert account["id"] == user_three.id
337 assert results["hashtags"] == []
339 [status] = results["statuses"]
340 assert status["id"] == activity.id
343 test "search fetches remote accounts", %{conn: conn} do
345 |> get("/api/v1/search", %{"q" => "shp@social.heldscal.la", "resolve" => "true"})
347 assert results = json_response(conn, 200)
348 [account] = results["accounts"]
349 assert account["acct"] == "shp@social.heldscal.la"
352 test "returns the favorites of a user", %{conn: conn} do
354 other_user = insert(:user)
356 {:ok, _} = CommonAPI.post(other_user, %{"status" => "bla"})
357 {:ok, activity} = CommonAPI.post(other_user, %{"status" => "traps are happy"})
359 {:ok, _, _} = CommonAPI.favorite(activity.id, user)
362 |> assign(:user, user)
363 |> get("/api/v1/favourites")
365 assert [status] = json_response(conn, 200)
366 assert status["id"] == activity.id