1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
9 alias Pleroma.Tests.ObanHelpers
11 alias Pleroma.UserInviteToken
12 alias Pleroma.Web.MastodonAPI.AccountView
13 alias Pleroma.Web.TwitterAPI.TwitterAPI
16 Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
20 test "it registers a new user and returns the user." do
23 :email => "lain@wired.jp",
24 :fullname => "lain iwakura",
29 {:ok, user} = TwitterAPI.register_user(data)
31 fetched_user = User.get_cached_by_nickname("lain")
33 assert AccountView.render("show.json", %{user: user}) ==
34 AccountView.render("show.json", %{user: fetched_user})
37 test "it registers a new user with empty string in bio and returns the user." do
40 :email => "lain@wired.jp",
41 :fullname => "lain iwakura",
47 {:ok, user} = TwitterAPI.register_user(data)
49 fetched_user = User.get_cached_by_nickname("lain")
51 assert AccountView.render("show.json", %{user: user}) ==
52 AccountView.render("show.json", %{user: fetched_user})
55 test "it sends confirmation email if :account_activation_required is specified in instance config" do
56 setting = Pleroma.Config.get([:instance, :account_activation_required])
59 Pleroma.Config.put([:instance, :account_activation_required], true)
60 on_exit(fn -> Pleroma.Config.put([:instance, :account_activation_required], setting) end)
65 :email => "lain@wired.jp",
66 :fullname => "lain iwakura",
72 {:ok, user} = TwitterAPI.register_user(data)
73 ObanHelpers.perform_all()
75 assert user.confirmation_pending
77 email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
79 notify_email = Pleroma.Config.get([:instance, :notify_email])
80 instance_name = Pleroma.Config.get([:instance, :name])
82 Swoosh.TestAssertions.assert_email_sent(
83 from: {instance_name, notify_email},
84 to: {user.name, user.email},
85 html_body: email.html_body
89 test "it sends an admin email if :account_approval_required is specified in instance config" do
90 admin = insert(:user, is_admin: true)
91 setting = Pleroma.Config.get([:instance, :account_approval_required])
94 Pleroma.Config.put([:instance, :account_approval_required], true)
95 on_exit(fn -> Pleroma.Config.put([:instance, :account_approval_required], setting) end)
100 :email => "lain@wired.jp",
101 :fullname => "lain iwakura",
105 :reason => "I love anime"
108 {:ok, user} = TwitterAPI.register_user(data)
109 ObanHelpers.perform_all()
111 assert user.approval_pending
113 email = Pleroma.Emails.AdminEmail.new_unapproved_registration(admin, user)
115 notify_email = Pleroma.Config.get([:instance, :notify_email])
116 instance_name = Pleroma.Config.get([:instance, :name])
118 Swoosh.TestAssertions.assert_email_sent(
119 from: {instance_name, notify_email},
120 to: {admin.name, admin.email},
121 html_body: email.html_body
125 test "it registers a new user and parses mentions in the bio" do
128 :email => "john@gmail.com",
129 :fullname => "John Doe",
135 {:ok, user1} = TwitterAPI.register_user(data1)
139 :email => "lain@wired.jp",
140 :fullname => "lain iwakura",
141 :bio => "@john test",
146 {:ok, user2} = TwitterAPI.register_user(data2)
149 ~s(<span class="h-card"><a class="u-url mention" data-user="#{user1.id}" href="#{
151 }" rel="ugc">@<span>john</span></a></span> test)
153 assert user2.bio == expected_text
156 describe "register with one time token" do
157 setup do: clear_config([:instance, :registrations_open], false)
159 test "returns user on success" do
160 {:ok, invite} = UserInviteToken.create_invite()
163 :username => "vinny",
164 :email => "pasta@pizza.vs",
165 :fullname => "Vinny Vinesauce",
167 :password => "hiptofbees",
168 :confirm => "hiptofbees",
169 :token => invite.token
172 {:ok, user} = TwitterAPI.register_user(data)
174 fetched_user = User.get_cached_by_nickname("vinny")
175 invite = Repo.get_by(UserInviteToken, token: invite.token)
177 assert invite.used == true
179 assert AccountView.render("show.json", %{user: user}) ==
180 AccountView.render("show.json", %{user: fetched_user})
183 test "returns error on invalid token" do
185 :username => "GrimReaper",
186 :email => "death@reapers.afterlife",
187 :fullname => "Reaper Grim",
188 :bio => "Your time has come",
189 :password => "scythe",
190 :confirm => "scythe",
191 :token => "DudeLetMeInImAFairy"
194 {:error, msg} = TwitterAPI.register_user(data)
196 assert msg == "Invalid token"
197 refute User.get_cached_by_nickname("GrimReaper")
200 test "returns error on expired token" do
201 {:ok, invite} = UserInviteToken.create_invite()
202 UserInviteToken.update_invite!(invite, used: true)
205 :username => "GrimReaper",
206 :email => "death@reapers.afterlife",
207 :fullname => "Reaper Grim",
208 :bio => "Your time has come",
209 :password => "scythe",
210 :confirm => "scythe",
211 :token => invite.token
214 {:error, msg} = TwitterAPI.register_user(data)
216 assert msg == "Expired token"
217 refute User.get_cached_by_nickname("GrimReaper")
221 describe "registers with date limited token" do
222 setup do: clear_config([:instance, :registrations_open], false)
226 :username => "vinny",
227 :email => "pasta@pizza.vs",
228 :fullname => "Vinny Vinesauce",
230 :password => "hiptofbees",
231 :confirm => "hiptofbees"
234 check_fn = fn invite ->
235 data = Map.put(data, :token, invite.token)
236 {:ok, user} = TwitterAPI.register_user(data)
237 fetched_user = User.get_cached_by_nickname("vinny")
239 assert AccountView.render("show.json", %{user: user}) ==
240 AccountView.render("show.json", %{user: fetched_user})
243 {:ok, data: data, check_fn: check_fn}
246 test "returns user on success", %{check_fn: check_fn} do
247 {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today()})
251 invite = Repo.get_by(UserInviteToken, token: invite.token)
256 test "returns user on token which expired tomorrow", %{check_fn: check_fn} do
257 {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), 1)})
261 invite = Repo.get_by(UserInviteToken, token: invite.token)
266 test "returns an error on overdue date", %{data: data} do
267 {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), -1)})
269 data = Map.put(data, "token", invite.token)
271 {:error, msg} = TwitterAPI.register_user(data)
273 assert msg == "Expired token"
274 refute User.get_cached_by_nickname("vinny")
275 invite = Repo.get_by(UserInviteToken, token: invite.token)
281 describe "registers with reusable token" do
282 setup do: clear_config([:instance, :registrations_open], false)
284 test "returns user on success, after him registration fails" do
285 {:ok, invite} = UserInviteToken.create_invite(%{max_use: 100})
287 UserInviteToken.update_invite!(invite, uses: 99)
290 :username => "vinny",
291 :email => "pasta@pizza.vs",
292 :fullname => "Vinny Vinesauce",
294 :password => "hiptofbees",
295 :confirm => "hiptofbees",
296 :token => invite.token
299 {:ok, user} = TwitterAPI.register_user(data)
300 fetched_user = User.get_cached_by_nickname("vinny")
301 invite = Repo.get_by(UserInviteToken, token: invite.token)
303 assert invite.used == true
305 assert AccountView.render("show.json", %{user: user}) ==
306 AccountView.render("show.json", %{user: fetched_user})
309 :username => "GrimReaper",
310 :email => "death@reapers.afterlife",
311 :fullname => "Reaper Grim",
312 :bio => "Your time has come",
313 :password => "scythe",
314 :confirm => "scythe",
315 :token => invite.token
318 {:error, msg} = TwitterAPI.register_user(data)
320 assert msg == "Expired token"
321 refute User.get_cached_by_nickname("GrimReaper")
325 describe "registers with reusable date limited token" do
326 setup do: clear_config([:instance, :registrations_open], false)
328 test "returns user on success" do
329 {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 100})
332 :username => "vinny",
333 :email => "pasta@pizza.vs",
334 :fullname => "Vinny Vinesauce",
336 :password => "hiptofbees",
337 :confirm => "hiptofbees",
338 :token => invite.token
341 {:ok, user} = TwitterAPI.register_user(data)
342 fetched_user = User.get_cached_by_nickname("vinny")
343 invite = Repo.get_by(UserInviteToken, token: invite.token)
347 assert AccountView.render("show.json", %{user: user}) ==
348 AccountView.render("show.json", %{user: fetched_user})
351 test "error after max uses" do
352 {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 100})
354 UserInviteToken.update_invite!(invite, uses: 99)
357 :username => "vinny",
358 :email => "pasta@pizza.vs",
359 :fullname => "Vinny Vinesauce",
361 :password => "hiptofbees",
362 :confirm => "hiptofbees",
363 :token => invite.token
366 {:ok, user} = TwitterAPI.register_user(data)
367 fetched_user = User.get_cached_by_nickname("vinny")
368 invite = Repo.get_by(UserInviteToken, token: invite.token)
369 assert invite.used == true
371 assert AccountView.render("show.json", %{user: user}) ==
372 AccountView.render("show.json", %{user: fetched_user})
375 :username => "GrimReaper",
376 :email => "death@reapers.afterlife",
377 :fullname => "Reaper Grim",
378 :bio => "Your time has come",
379 :password => "scythe",
380 :confirm => "scythe",
381 :token => invite.token
384 {:error, msg} = TwitterAPI.register_user(data)
386 assert msg == "Expired token"
387 refute User.get_cached_by_nickname("GrimReaper")
390 test "returns error on overdue date" do
392 UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), -1), max_use: 100})
395 :username => "GrimReaper",
396 :email => "death@reapers.afterlife",
397 :fullname => "Reaper Grim",
398 :bio => "Your time has come",
399 :password => "scythe",
400 :confirm => "scythe",
401 :token => invite.token
404 {:error, msg} = TwitterAPI.register_user(data)
406 assert msg == "Expired token"
407 refute User.get_cached_by_nickname("GrimReaper")
410 test "returns error on with overdue date and after max" do
412 UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), -1), max_use: 100})
414 UserInviteToken.update_invite!(invite, uses: 100)
417 :username => "GrimReaper",
418 :email => "death@reapers.afterlife",
419 :fullname => "Reaper Grim",
420 :bio => "Your time has come",
421 :password => "scythe",
422 :confirm => "scythe",
423 :token => invite.token
426 {:error, msg} = TwitterAPI.register_user(data)
428 assert msg == "Expired token"
429 refute User.get_cached_by_nickname("GrimReaper")
433 test "it returns the error on registration problems" do
436 :email => "lain@wired.jp",
437 :fullname => "lain iwakura",
438 :bio => "close the world."
441 {:error, error} = TwitterAPI.register_user(data)
443 assert is_binary(error)
444 refute User.get_cached_by_nickname("lain")
448 Supervisor.terminate_child(Pleroma.Supervisor, Cachex)
449 Supervisor.restart_child(Pleroma.Supervisor, Cachex)