Typo.
[akkoma] / test / web / mastodon_api / mastodon_api_controller_test.exs
1 defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
2 use Pleroma.Web.ConnCase
3
4 alias Pleroma.Web.TwitterAPI.TwitterAPI
5 alias Pleroma.{Repo, User, Activity}
6 alias Pleroma.Web.{OStatus, CommonAPI}
7
8 import Pleroma.Factory
9
10 test "the home timeline", %{conn: conn} do
11 user = insert(:user)
12 following = insert(:user)
13
14 {:ok, _activity} = TwitterAPI.create_status(following, %{"status" => "test"})
15
16 conn = conn
17 |> assign(:user, user)
18 |> get("/api/v1/timelines/home")
19
20 assert length(json_response(conn, 200)) == 0
21
22 {:ok, user} = User.follow(user, following)
23
24 conn = build_conn()
25 |> assign(:user, user)
26 |> get("/api/v1/timelines/home")
27
28 assert [%{"content" => "test"}] = json_response(conn, 200)
29 end
30
31 test "the public timeline", %{conn: conn} do
32 following = insert(:user)
33
34 {:ok, _activity} = TwitterAPI.create_status(following, %{"status" => "test"})
35 {:ok, [_activity]} = OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873")
36
37 conn = conn
38 |> get("/api/v1/timelines/public")
39
40 assert length(json_response(conn, 200)) == 2
41
42 conn = build_conn()
43 |> get("/api/v1/timelines/public", %{"local" => "True"})
44
45 assert [%{"content" => "test"}] = json_response(conn, 200)
46 end
47
48 test "posting a status", %{conn: conn} do
49 user = insert(:user)
50
51 conn = conn
52 |> assign(:user, user)
53 |> post("/api/v1/statuses", %{"status" => "cofe"})
54
55 assert %{"content" => "cofe", "id" => id} = json_response(conn, 200)
56 assert Repo.get(Activity, id)
57 end
58
59 test "replying to a status", %{conn: conn} do
60 user = insert(:user)
61
62 {:ok, replied_to} = TwitterAPI.create_status(user, %{"status" => "cofe"})
63
64 conn = conn
65 |> assign(:user, user)
66 |> post("/api/v1/statuses", %{"status" => "xD", "in_reply_to_id" => replied_to.id})
67
68 assert %{"content" => "xD", "id" => id} = json_response(conn, 200)
69
70 activity = Repo.get(Activity, id)
71
72 assert activity.data["context"] == replied_to.data["context"]
73 assert activity.data["object"]["inReplyToStatusId"] == replied_to.id
74 end
75
76 test "verify_credentials", %{conn: conn} do
77 user = insert(:user)
78
79 conn = conn
80 |> assign(:user, user)
81 |> get("/api/v1/accounts/verify_credentials")
82
83 assert %{"id" => id} = json_response(conn, 200)
84 assert id == user.id
85 end
86
87 test "get a status", %{conn: conn} do
88 activity = insert(:note_activity)
89
90 conn = conn
91 |> get("/api/v1/statuses/#{activity.id}")
92
93 assert %{"id" => id} = json_response(conn, 200)
94 assert id == activity.id
95 end
96
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"])
101
102 conn = conn
103 |> assign(:user, author)
104 |> delete("/api/v1/statuses/#{activity.id}")
105
106 assert %{} = json_response(conn, 200)
107
108 assert Repo.get(Activity, activity.id) == nil
109 end
110
111 test "when you didn't create it", %{conn: conn} do
112 activity = insert(:note_activity)
113 user = insert(:user)
114
115 conn = conn
116 |> assign(:user, user)
117 |> delete("/api/v1/statuses/#{activity.id}")
118
119 assert %{"error" => _} = json_response(conn, 403)
120
121 assert Repo.get(Activity, activity.id) == activity
122 end
123 end
124
125 describe "reblogging" do
126 test "reblogs and returns the reblogged status", %{conn: conn} do
127 activity = insert(:note_activity)
128 user = insert(:user)
129
130 conn = conn
131 |> assign(:user, user)
132 |> post("/api/v1/statuses/#{activity.id}/reblog")
133
134 assert %{"id" => id, "reblogged" => true, "reblogs_count" => 1} = json_response(conn, 200)
135 assert activity.id == id
136 end
137 end
138
139 describe "favoriting" do
140 test "favs a status and returns it", %{conn: conn} do
141 activity = insert(:note_activity)
142 user = insert(:user)
143
144 conn = conn
145 |> assign(:user, user)
146 |> post("/api/v1/statuses/#{activity.id}/favourite")
147
148 assert %{"id" => id, "favourites_count" => 1, "favourited" => true} = json_response(conn, 200)
149 assert activity.id == id
150 end
151 end
152
153 describe "unfavoriting" do
154 test "unfavorites a status and returns it", %{conn: conn} do
155 activity = insert(:note_activity)
156 user = insert(:user)
157
158 {:ok, _, _} = CommonAPI.favorite(activity.id, user)
159
160 conn = conn
161 |> assign(:user, user)
162 |> post("/api/v1/statuses/#{activity.id}/unfavourite")
163
164 assert %{"id" => id, "favourites_count" => 0, "favourited" => false} = json_response(conn, 200)
165 assert activity.id == id
166 end
167 end
168
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)
173
174 user = User.get_by_ap_id(note_two.data["actor"])
175
176 conn = conn
177 |> get("/api/v1/accounts/#{user.id}/statuses")
178
179 assert [%{"id" => id}] = json_response(conn, 200)
180
181 assert id == note_two.id
182 end
183 end
184
185 describe "user relationships" do
186 test "returns the relationships for the current user", %{conn: conn} do
187 user = insert(:user)
188 other_user = insert(:user)
189 {:ok, user} = User.follow(user, other_user)
190
191 conn = conn
192 |> assign(:user, user)
193 |> get("/api/v1/accounts/relationships", %{"id" => [other_user.id]})
194
195 assert [relationship] = json_response(conn, 200)
196
197 assert other_user.id == relationship["id"]
198 end
199 end
200
201 test "account fetching", %{conn: conn} do
202 user = insert(:user)
203
204 conn = conn
205 |> get("/api/v1/accounts/#{user.id}")
206
207 assert %{"id" => id} = json_response(conn, 200)
208 assert id == user.id
209
210 conn = build_conn()
211 |> get("/api/v1/accounts/-1")
212
213 assert %{"error" => "Can't find user"} = json_response(conn, 404)
214 end
215
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"}
218
219 user = insert(:user)
220
221 conn = conn
222 |> assign(:user, user)
223 |> post("/api/v1/media", %{"file" => file})
224
225 assert media = json_response(conn, 200)
226
227 assert media["type"] == "image"
228 end
229
230 test "hashtag timeline", %{conn: conn} do
231 following = insert(:user)
232
233 {:ok, activity} = TwitterAPI.create_status(following, %{"status" => "test #2hu"})
234 {:ok, [_activity]} = OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873")
235
236 conn = conn
237 |> get("/api/v1/timelines/tag/2hu")
238
239 assert [%{"id" => id}] = json_response(conn, 200)
240
241 assert id == activity.id
242 end
243
244 test "getting followers", %{conn: conn} do
245 user = insert(:user)
246 other_user = insert(:user)
247 {:ok, user} = User.follow(user, other_user)
248
249 conn = conn
250 |> get("/api/v1/accounts/#{other_user.id}/followers")
251
252 assert [%{"id" => id}] = json_response(conn, 200)
253 assert id = user.id
254 end
255
256 test "getting following", %{conn: conn} do
257 user = insert(:user)
258 other_user = insert(:user)
259 {:ok, user} = User.follow(user, other_user)
260
261 conn = conn
262 |> get("/api/v1/accounts/#{user.id}/following")
263
264 assert [%{"id" => id}] = json_response(conn, 200)
265 assert id = other_user.id
266 end
267
268 test "following / unfollowing a user", %{conn: conn} do
269 user = insert(:user)
270 other_user = insert(:user)
271
272 conn = conn
273 |> assign(:user, user)
274 |> post("/api/v1/accounts/#{other_user.id}/follow")
275
276 assert %{"id" => id, "following" => true} = json_response(conn, 200)
277
278 user = Repo.get(User, user.id)
279 conn = build_conn()
280 |> assign(:user, user)
281 |> post("/api/v1/accounts/#{other_user.id}/unfollow")
282
283 assert %{"id" => id, "following" => false} = json_response(conn, 200)
284
285 user = Repo.get(User, user.id)
286 conn = build_conn()
287 |> assign(:user, user)
288 |> post("/api/v1/follows", %{"uri" => other_user.nickname})
289
290 assert %{"id" => id} = json_response(conn, 200)
291 assert id == other_user.id
292 end
293
294 test "unimplemented block/mute endpoints" do
295 user = insert(:user)
296 other_user = insert(:user)
297
298 ["block", "unblock", "mute", "unmute"]
299 |> Enum.each(fn(endpoint) ->
300 conn = build_conn()
301 |> assign(:user, user)
302 |> post("/api/v1/accounts/#{other_user.id}/#{endpoint}")
303
304 assert %{"id" => id} = json_response(conn, 200)
305 assert id == other_user.id
306 end)
307 end
308
309 test "unimplemented mutes, follow_requests, blocks, domain blocks" do
310 user = insert(:user)
311
312 ["blocks", "domain_blocks", "mutes", "follow_requests"]
313 |> Enum.each(fn(endpoint) ->
314 conn = build_conn()
315 |> assign(:user, user)
316 |> get("/api/v1/#{endpoint}")
317
318 assert [] = json_response(conn, 200)
319 end)
320 end
321
322 test "account search", %{conn: conn} do
323 user = insert(:user)
324 user_two = insert(:user, %{nickname: "shp@shitposter.club"})
325 user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
326
327 conn = conn
328 |> assign(:user, user)
329 |> get("/api/v1/accounts/search", %{"q" => "2hu"})
330
331 assert [account] = json_response(conn, 200)
332 assert account["id"] == user_three.id
333 end
334
335 test "search", %{conn: conn} do
336 user = insert(:user)
337 user_two = insert(:user, %{nickname: "shp@shitposter.club"})
338 user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
339
340 {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu"})
341 {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"})
342
343 conn = conn
344 |> get("/api/v1/search", %{"q" => "2hu"})
345
346 assert results = json_response(conn, 200)
347
348 [account] = results["accounts"]
349 assert account["id"] == user_three.id
350
351 assert results["hashtags"] == []
352
353 [status] = results["statuses"]
354 assert status["id"] == activity.id
355 end
356
357 test "search fetches remote accounts", %{conn: conn} do
358 conn = conn
359 |> get("/api/v1/search", %{"q" => "shp@social.heldscal.la", "resolve" => "true"})
360
361 assert results = json_response(conn, 200)
362 [account] = results["accounts"]
363 assert account["acct"] == "shp@social.heldscal.la"
364 end
365
366 test "returns the favorites of a user", %{conn: conn} do
367 user = insert(:user)
368 other_user = insert(:user)
369
370 {:ok, _} = CommonAPI.post(other_user, %{"status" => "bla"})
371 {:ok, activity} = CommonAPI.post(other_user, %{"status" => "traps are happy"})
372
373 {:ok, _, _} = CommonAPI.favorite(activity.id, user)
374
375 conn = conn
376 |> assign(:user, user)
377 |> get("/api/v1/favourites")
378
379 assert [status] = json_response(conn, 200)
380 assert status["id"] == activity.id
381 end
382 end