Merge branch 'bugfix/deny-empty-posts' of ssh.gitgud.io:dtluna/pleroma into bugfix...
[akkoma] / test / web / twitter_api / twitter_api_controller_test.exs
1 defmodule Pleroma.Web.TwitterAPI.ControllerTest do
2 use Pleroma.Web.ConnCase
3 alias Pleroma.Web.TwitterAPI.Representers.{UserRepresenter, ActivityRepresenter}
4 alias Pleroma.Builders.{ActivityBuilder, UserBuilder}
5 alias Pleroma.{Repo, Activity, User, Object}
6 alias Pleroma.Web.ActivityPub.ActivityPub
7
8 import Pleroma.Factory
9
10 describe "POST /api/account/verify_credentials" do
11 setup [:valid_user]
12 test "without valid credentials", %{conn: conn} do
13 conn = post conn, "/api/account/verify_credentials.json"
14 assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
15 end
16
17 test "with credentials", %{conn: conn, user: user} do
18 conn = conn
19 |> with_credentials(user.nickname, "test")
20 |> post("/api/account/verify_credentials.json")
21
22 assert json_response(conn, 200) == UserRepresenter.to_map(user)
23 end
24 end
25
26 describe "POST /statuses/update.json" do
27 setup [:valid_user]
28 test "without valid credentials", %{conn: conn} do
29 conn = post conn, "/api/statuses/update.json"
30 assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
31 end
32
33 test "with credentials", %{conn: conn, user: user} do
34 conn_with_creds = conn |> with_credentials(user.nickname, "test")
35 request_path = "/api/statuses/update.json"
36
37 error_response = %{"request" => request_path,
38 "error" => "Client must provide a 'status' parameter with a value."}
39 conn = conn_with_creds |> post(request_path)
40 assert json_response(conn, 400) == error_response
41
42 conn = conn_with_creds |> post(request_path, %{ status: "" })
43 assert json_response(conn, 400) == error_response
44
45 conn = conn_with_creds |> post(request_path, %{ status: "Nice meme." })
46 assert json_response(conn, 200) == ActivityRepresenter.to_map(Repo.one(Activity), %{user: user})
47 end
48 end
49
50 describe "GET /statuses/public_timeline.json" do
51 test "returns statuses", %{conn: conn} do
52 {:ok, user} = UserBuilder.insert
53 activities = ActivityBuilder.insert_list(30, %{}, %{user: user})
54 ActivityBuilder.insert_list(10, %{}, %{user: user})
55 since_id = List.last(activities).id
56
57 conn = conn
58 |> get("/api/statuses/public_timeline.json", %{since_id: since_id})
59
60 response = json_response(conn, 200)
61
62 assert length(response) == 10
63 end
64 end
65
66 describe "GET /statuses/show/:id.json" do
67 test "returns one status", %{conn: conn} do
68 {:ok, user} = UserBuilder.insert
69 {:ok, activity} = ActivityBuilder.insert(%{}, %{user: user})
70 actor = Repo.get_by!(User, ap_id: activity.data["actor"])
71
72 conn = conn
73 |> get("/api/statuses/show/#{activity.id}.json")
74
75 response = json_response(conn, 200)
76
77 assert response == ActivityRepresenter.to_map(activity, %{user: actor})
78 end
79 end
80
81 describe "GET /statusnet/conversation/:id.json" do
82 test "returns the statuses in the conversation", %{conn: conn} do
83 {:ok, _user} = UserBuilder.insert
84 {:ok, _activity} = ActivityBuilder.insert(%{"statusnetConversationId" => 1, "context" => "2hu"})
85 {:ok, _activity_two} = ActivityBuilder.insert(%{"statusnetConversationId" => 1,"context" => "2hu"})
86 {:ok, _activity_three} = ActivityBuilder.insert(%{"context" => "3hu"})
87
88 conn = conn
89 |> get("/api/statusnet/conversation/1.json")
90
91 response = json_response(conn, 200)
92
93 assert length(response) == 2
94 end
95 end
96
97 describe "GET /statuses/friends_timeline.json" do
98 setup [:valid_user]
99 test "without valid credentials", %{conn: conn} do
100 conn = get conn, "/api/statuses/friends_timeline.json"
101 assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
102 end
103
104 test "with credentials", %{conn: conn, user: current_user} do
105 user = insert(:user)
106 activities = ActivityBuilder.insert_list(30, %{"to" => [User.ap_followers(user)]}, %{user: user})
107 returned_activities = ActivityBuilder.insert_list(10, %{"to" => [User.ap_followers(user)]}, %{user: user})
108 other_user = insert(:user)
109 ActivityBuilder.insert_list(10, %{}, %{user: other_user})
110 since_id = List.last(activities).id
111
112 current_user = Ecto.Changeset.change(current_user, following: [User.ap_followers(user)]) |> Repo.update!
113
114 conn = conn
115 |> with_credentials(current_user.nickname, "test")
116 |> get("/api/statuses/friends_timeline.json", %{since_id: since_id})
117
118 response = json_response(conn, 200)
119
120 assert length(response) == 10
121 assert response == Enum.map(returned_activities, fn (activity) -> ActivityRepresenter.to_map(activity, %{user: User.get_cached_by_ap_id(activity.data["actor"]), for: current_user}) end)
122 end
123 end
124
125 describe "GET /statuses/mentions.json" do
126 setup [:valid_user]
127 test "without valid credentials", %{conn: conn} do
128 conn = get conn, "/api/statuses/mentions.json"
129 assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
130 end
131
132 test "with credentials", %{conn: conn, user: current_user} do
133 {:ok, activity} = ActivityBuilder.insert(%{"to" => [current_user.ap_id]}, %{user: current_user})
134
135 conn = conn
136 |> with_credentials(current_user.nickname, "test")
137 |> get("/api/statuses/mentions.json")
138
139 response = json_response(conn, 200)
140
141 assert length(response) == 1
142 assert Enum.at(response, 0) == ActivityRepresenter.to_map(activity, %{user: current_user, mentioned: [current_user]})
143 end
144 end
145
146 describe "GET /statuses/user_timeline.json" do
147 setup [:valid_user]
148 test "without any params", %{conn: conn} do
149 conn = get(conn, "/api/statuses/user_timeline.json")
150 assert json_response(conn, 400) == %{"error" => "You need to specify screen_name or user_id", "request" => "/api/statuses/user_timeline.json"}
151 end
152
153 test "with user_id", %{conn: conn} do
154 user = insert(:user)
155 {:ok, activity} = ActivityBuilder.insert(%{"id" => 1}, %{user: user})
156
157 conn = get(conn, "/api/statuses/user_timeline.json", %{"user_id" => user.id})
158 response = json_response(conn, 200)
159 assert length(response) == 1
160 assert Enum.at(response, 0) == ActivityRepresenter.to_map(activity, %{user: user})
161 end
162
163 test "with screen_name", %{conn: conn} do
164 user = insert(:user)
165 {:ok, activity} = ActivityBuilder.insert(%{"id" => 1}, %{user: user})
166
167 conn = get(conn, "/api/statuses/user_timeline.json", %{"screen_name" => user.nickname})
168 response = json_response(conn, 200)
169 assert length(response) == 1
170 assert Enum.at(response, 0) == ActivityRepresenter.to_map(activity, %{user: user})
171 end
172
173 test "with credentials", %{conn: conn, user: current_user} do
174 {:ok, activity} = ActivityBuilder.insert(%{"id" => 1}, %{user: current_user})
175 conn = conn
176 |> with_credentials(current_user.nickname, "test")
177 |> get("/api/statuses/user_timeline.json")
178
179 response = json_response(conn, 200)
180
181 assert length(response) == 1
182 assert Enum.at(response, 0) == ActivityRepresenter.to_map(activity, %{user: current_user})
183 end
184
185 test "with credentials with user_id", %{conn: conn, user: current_user} do
186 user = insert(:user)
187 {:ok, activity} = ActivityBuilder.insert(%{"id" => 1}, %{user: user})
188 conn = conn
189 |> with_credentials(current_user.nickname, "test")
190 |> get("/api/statuses/user_timeline.json", %{"user_id" => user.id})
191
192 response = json_response(conn, 200)
193
194 assert length(response) == 1
195 assert Enum.at(response, 0) == ActivityRepresenter.to_map(activity, %{user: user})
196 end
197
198 test "with credentials screen_name", %{conn: conn, user: current_user} do
199 user = insert(:user)
200 {:ok, activity} = ActivityBuilder.insert(%{"id" => 1}, %{user: user})
201 conn = conn
202 |> with_credentials(current_user.nickname, "test")
203 |> get("/api/statuses/user_timeline.json", %{"screen_name" => user.nickname})
204
205 response = json_response(conn, 200)
206
207 assert length(response) == 1
208 assert Enum.at(response, 0) == ActivityRepresenter.to_map(activity, %{user: user})
209 end
210 end
211
212 describe "POST /friendships/create.json" do
213 setup [:valid_user]
214 test "without valid credentials", %{conn: conn} do
215 conn = post conn, "/api/friendships/create.json"
216 assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
217 end
218
219 test "with credentials", %{conn: conn, user: current_user} do
220 followed = insert(:user)
221
222 conn = conn
223 |> with_credentials(current_user.nickname, "test")
224 |> post("/api/friendships/create.json", %{user_id: followed.id})
225
226 current_user = Repo.get(User, current_user.id)
227 assert current_user.following == [User.ap_followers(followed)]
228 assert json_response(conn, 200) == UserRepresenter.to_map(followed, %{for: current_user})
229 end
230 end
231
232 describe "POST /friendships/destroy.json" do
233 setup [:valid_user]
234 test "without valid credentials", %{conn: conn} do
235 conn = post conn, "/api/friendships/destroy.json"
236 assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
237 end
238
239 test "with credentials", %{conn: conn, user: current_user} do
240 followed = insert(:user)
241
242 {:ok, current_user} = User.follow(current_user, followed)
243 assert current_user.following == [User.ap_followers(followed)]
244
245 conn = conn
246 |> with_credentials(current_user.nickname, "test")
247 |> post("/api/friendships/destroy.json", %{user_id: followed.id})
248
249 current_user = Repo.get(User, current_user.id)
250 assert current_user.following == []
251 assert json_response(conn, 200) == UserRepresenter.to_map(followed, %{for: current_user})
252 end
253 end
254
255 describe "GET /help/test.json" do
256 test "returns \"ok\"", %{conn: conn} do
257 conn = get conn, "/api/help/test.json"
258 assert json_response(conn, 200) == "ok"
259 end
260 end
261
262 describe "POST /api/qvitter/update_avatar.json" do
263 setup [:valid_user]
264 test "without valid credentials", %{conn: conn} do
265 conn = post conn, "/api/qvitter/update_avatar.json"
266 assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
267 end
268
269 test "with credentials", %{conn: conn, user: current_user} do
270 conn = conn
271 |> with_credentials(current_user.nickname, "test")
272 |> post("/api/qvitter/update_avatar.json", %{img: Pleroma.Web.ActivityPub.ActivityPubTest.data_uri})
273
274 current_user = Repo.get(User, current_user.id)
275 assert is_map(current_user.avatar)
276 assert json_response(conn, 200) == UserRepresenter.to_map(current_user, %{for: current_user})
277 end
278 end
279
280 describe "POST /api/favorites/create/:id" do
281 setup [:valid_user]
282 test "without valid credentials", %{conn: conn} do
283 note_activity = insert(:note_activity)
284 conn = post conn, "/api/favorites/create/#{note_activity.id}.json"
285 assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
286 end
287
288 test "with credentials", %{conn: conn, user: current_user} do
289 note_activity = insert(:note_activity)
290
291 conn = conn
292 |> with_credentials(current_user.nickname, "test")
293 |> post("/api/favorites/create/#{note_activity.id}.json")
294
295 assert json_response(conn, 200)
296 end
297 end
298
299 describe "POST /api/favorites/destroy/:id" do
300 setup [:valid_user]
301 test "without valid credentials", %{conn: conn} do
302 note_activity = insert(:note_activity)
303 conn = post conn, "/api/favorites/destroy/#{note_activity.id}.json"
304 assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
305 end
306
307 test "with credentials", %{conn: conn, user: current_user} do
308 note_activity = insert(:note_activity)
309 object = Object.get_by_ap_id(note_activity.data["object"]["id"])
310 ActivityPub.like(current_user, object)
311
312 conn = conn
313 |> with_credentials(current_user.nickname, "test")
314 |> post("/api/favorites/destroy/#{note_activity.id}.json")
315
316 assert json_response(conn, 200)
317 end
318 end
319
320 describe "POST /api/statuses/retweet/:id" do
321 setup [:valid_user]
322 test "without valid credentials", %{conn: conn} do
323 note_activity = insert(:note_activity)
324 conn = post conn, "/api/statuses/retweet/#{note_activity.id}.json"
325 assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
326 end
327
328 test "with credentials", %{conn: conn, user: current_user} do
329 note_activity = insert(:note_activity)
330
331 conn = conn
332 |> with_credentials(current_user.nickname, "test")
333 |> post("/api/statuses/retweet/#{note_activity.id}.json")
334
335 assert json_response(conn, 200)
336 end
337 end
338
339 describe "POST /api/account/register" do
340 test "it creates a new user", %{conn: conn} do
341 data = %{
342 "nickname" => "lain",
343 "email" => "lain@wired.jp",
344 "fullname" => "lain iwakura",
345 "bio" => "close the world.",
346 "password" => "bear",
347 "confirm" => "bear"
348 }
349
350 conn = conn
351 |> post("/api/account/register", data)
352
353 user = json_response(conn, 200)
354
355 fetched_user = Repo.get_by(User, nickname: "lain")
356 assert user == UserRepresenter.to_map(fetched_user)
357 end
358
359 test "it returns errors on a problem", %{conn: conn} do
360 data = %{
361 "email" => "lain@wired.jp",
362 "fullname" => "lain iwakura",
363 "bio" => "close the world.",
364 "password" => "bear",
365 "confirm" => "bear"
366 }
367
368 conn = conn
369 |> post("/api/account/register", data)
370
371 errors = json_response(conn, 400)
372
373 assert is_binary(errors["error"])
374 end
375 end
376
377 defp valid_user(_context) do
378 user = insert(:user)
379 [user: user]
380 end
381
382 defp with_credentials(conn, username, password) do
383 header_content = "Basic " <> Base.encode64("#{username}:#{password}")
384 put_req_header(conn, "authorization", header_content)
385 end
386
387 setup do
388 Supervisor.terminate_child(Pleroma.Supervisor, ConCache)
389 Supervisor.restart_child(Pleroma.Supervisor, ConCache)
390 :ok
391 end
392 end