logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

twitter_api_test.exs (12089B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
  5. use Pleroma.DataCase
  6. import Pleroma.Factory
  7. alias Pleroma.Repo
  8. alias Pleroma.Tests.ObanHelpers
  9. alias Pleroma.User
  10. alias Pleroma.UserInviteToken
  11. alias Pleroma.Web.TwitterAPI.TwitterAPI
  12. setup_all do
  13. Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
  14. :ok
  15. end
  16. test "it registers a new user and returns the user." do
  17. data = %{
  18. :username => "lain",
  19. :email => "lain@wired.jp",
  20. :fullname => "lain iwakura",
  21. :password => "bear",
  22. :confirm => "bear"
  23. }
  24. {:ok, user} = TwitterAPI.register_user(data)
  25. assert user == User.get_cached_by_nickname("lain")
  26. end
  27. test "it registers a new user with empty string in bio and returns the user" do
  28. data = %{
  29. :username => "lain",
  30. :email => "lain@wired.jp",
  31. :fullname => "lain iwakura",
  32. :bio => "",
  33. :password => "bear",
  34. :confirm => "bear"
  35. }
  36. {:ok, user} = TwitterAPI.register_user(data)
  37. assert user == User.get_cached_by_nickname("lain")
  38. end
  39. test "it sends confirmation email if :account_activation_required is specified in instance config" do
  40. clear_config([:instance, :account_activation_required], true)
  41. data = %{
  42. :username => "lain",
  43. :email => "lain@wired.jp",
  44. :fullname => "lain iwakura",
  45. :bio => "",
  46. :password => "bear",
  47. :confirm => "bear"
  48. }
  49. {:ok, user} = TwitterAPI.register_user(data)
  50. ObanHelpers.perform_all()
  51. refute user.is_confirmed
  52. email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
  53. notify_email = Pleroma.Config.get([:instance, :notify_email])
  54. instance_name = Pleroma.Config.get([:instance, :name])
  55. Swoosh.TestAssertions.assert_email_sent(
  56. from: {instance_name, notify_email},
  57. to: {user.name, user.email},
  58. html_body: email.html_body
  59. )
  60. end
  61. test "it sends an admin email if :account_approval_required is specified in instance config" do
  62. clear_config([:instance, :account_approval_required], true)
  63. admin = insert(:user, is_admin: true)
  64. data = %{
  65. :username => "lain",
  66. :email => "lain@wired.jp",
  67. :fullname => "lain iwakura",
  68. :bio => "",
  69. :password => "bear",
  70. :confirm => "bear",
  71. :reason => "I love anime"
  72. }
  73. {:ok, user} = TwitterAPI.register_user(data)
  74. ObanHelpers.perform_all()
  75. refute user.is_approved
  76. user_email = Pleroma.Emails.UserEmail.approval_pending_email(user)
  77. admin_email = Pleroma.Emails.AdminEmail.new_unapproved_registration(admin, user)
  78. notify_email = Pleroma.Config.get([:instance, :notify_email])
  79. instance_name = Pleroma.Config.get([:instance, :name])
  80. # User approval email
  81. Swoosh.TestAssertions.assert_email_sent(
  82. from: {instance_name, notify_email},
  83. to: {user.name, user.email},
  84. html_body: user_email.html_body
  85. )
  86. # Admin email
  87. Swoosh.TestAssertions.assert_email_sent(
  88. from: {instance_name, notify_email},
  89. to: {admin.name, admin.email},
  90. html_body: admin_email.html_body
  91. )
  92. end
  93. test "it registers a new user and parses mentions in the bio" do
  94. data1 = %{
  95. :username => "john",
  96. :email => "john@gmail.com",
  97. :fullname => "John Doe",
  98. :bio => "test",
  99. :password => "bear",
  100. :confirm => "bear"
  101. }
  102. {:ok, user1} = TwitterAPI.register_user(data1)
  103. data2 = %{
  104. :username => "lain",
  105. :email => "lain@wired.jp",
  106. :fullname => "lain iwakura",
  107. :bio => "@john test",
  108. :password => "bear",
  109. :confirm => "bear"
  110. }
  111. {:ok, user2} = TwitterAPI.register_user(data2)
  112. expected_text =
  113. ~s(<span class="h-card"><a class="u-url mention" data-user="#{user1.id}" href="#{user1.ap_id}" rel="ugc">@<span>john</span></a></span> test)
  114. assert user2.bio == expected_text
  115. end
  116. describe "register with one time token" do
  117. setup do: clear_config([:instance, :registrations_open], false)
  118. test "returns user on success" do
  119. {:ok, invite} = UserInviteToken.create_invite()
  120. data = %{
  121. :username => "vinny",
  122. :email => "pasta@pizza.vs",
  123. :fullname => "Vinny Vinesauce",
  124. :bio => "streamer",
  125. :password => "hiptofbees",
  126. :confirm => "hiptofbees",
  127. :token => invite.token
  128. }
  129. {:ok, user} = TwitterAPI.register_user(data)
  130. assert user == User.get_cached_by_nickname("vinny")
  131. invite = Repo.get_by(UserInviteToken, token: invite.token)
  132. assert invite.used == true
  133. end
  134. test "returns error on invalid token" do
  135. data = %{
  136. :username => "GrimReaper",
  137. :email => "death@reapers.afterlife",
  138. :fullname => "Reaper Grim",
  139. :bio => "Your time has come",
  140. :password => "scythe",
  141. :confirm => "scythe",
  142. :token => "DudeLetMeInImAFairy"
  143. }
  144. {:error, msg} = TwitterAPI.register_user(data)
  145. assert msg == "Invalid token"
  146. refute User.get_cached_by_nickname("GrimReaper")
  147. end
  148. test "returns error on expired token" do
  149. {:ok, invite} = UserInviteToken.create_invite()
  150. UserInviteToken.update_invite!(invite, used: true)
  151. data = %{
  152. :username => "GrimReaper",
  153. :email => "death@reapers.afterlife",
  154. :fullname => "Reaper Grim",
  155. :bio => "Your time has come",
  156. :password => "scythe",
  157. :confirm => "scythe",
  158. :token => invite.token
  159. }
  160. {:error, msg} = TwitterAPI.register_user(data)
  161. assert msg == "Expired token"
  162. refute User.get_cached_by_nickname("GrimReaper")
  163. end
  164. end
  165. describe "registers with date limited token" do
  166. setup do: clear_config([:instance, :registrations_open], false)
  167. setup do
  168. data = %{
  169. :username => "vinny",
  170. :email => "pasta@pizza.vs",
  171. :fullname => "Vinny Vinesauce",
  172. :bio => "streamer",
  173. :password => "hiptofbees",
  174. :confirm => "hiptofbees"
  175. }
  176. check_fn = fn invite ->
  177. data = Map.put(data, :token, invite.token)
  178. {:ok, user} = TwitterAPI.register_user(data)
  179. assert user == User.get_cached_by_nickname("vinny")
  180. end
  181. {:ok, data: data, check_fn: check_fn}
  182. end
  183. test "returns user on success", %{check_fn: check_fn} do
  184. {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today()})
  185. check_fn.(invite)
  186. invite = Repo.get_by(UserInviteToken, token: invite.token)
  187. refute invite.used
  188. end
  189. test "returns user on token which expired tomorrow", %{check_fn: check_fn} do
  190. {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), 1)})
  191. check_fn.(invite)
  192. invite = Repo.get_by(UserInviteToken, token: invite.token)
  193. refute invite.used
  194. end
  195. test "returns an error on overdue date", %{data: data} do
  196. {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), -1)})
  197. data = Map.put(data, "token", invite.token)
  198. {:error, msg} = TwitterAPI.register_user(data)
  199. assert msg == "Expired token"
  200. refute User.get_cached_by_nickname("vinny")
  201. invite = Repo.get_by(UserInviteToken, token: invite.token)
  202. refute invite.used
  203. end
  204. end
  205. describe "registers with reusable token" do
  206. setup do: clear_config([:instance, :registrations_open], false)
  207. test "returns user on success, after him registration fails" do
  208. {:ok, invite} = UserInviteToken.create_invite(%{max_use: 100})
  209. UserInviteToken.update_invite!(invite, uses: 99)
  210. data = %{
  211. :username => "vinny",
  212. :email => "pasta@pizza.vs",
  213. :fullname => "Vinny Vinesauce",
  214. :bio => "streamer",
  215. :password => "hiptofbees",
  216. :confirm => "hiptofbees",
  217. :token => invite.token
  218. }
  219. {:ok, user} = TwitterAPI.register_user(data)
  220. assert user == User.get_cached_by_nickname("vinny")
  221. invite = Repo.get_by(UserInviteToken, token: invite.token)
  222. assert invite.used == true
  223. data = %{
  224. :username => "GrimReaper",
  225. :email => "death@reapers.afterlife",
  226. :fullname => "Reaper Grim",
  227. :bio => "Your time has come",
  228. :password => "scythe",
  229. :confirm => "scythe",
  230. :token => invite.token
  231. }
  232. {:error, msg} = TwitterAPI.register_user(data)
  233. assert msg == "Expired token"
  234. refute User.get_cached_by_nickname("GrimReaper")
  235. end
  236. end
  237. describe "registers with reusable date limited token" do
  238. setup do: clear_config([:instance, :registrations_open], false)
  239. test "returns user on success" do
  240. {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 100})
  241. data = %{
  242. :username => "vinny",
  243. :email => "pasta@pizza.vs",
  244. :fullname => "Vinny Vinesauce",
  245. :bio => "streamer",
  246. :password => "hiptofbees",
  247. :confirm => "hiptofbees",
  248. :token => invite.token
  249. }
  250. {:ok, user} = TwitterAPI.register_user(data)
  251. assert user == User.get_cached_by_nickname("vinny")
  252. invite = Repo.get_by(UserInviteToken, token: invite.token)
  253. refute invite.used
  254. end
  255. test "error after max uses" do
  256. {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 100})
  257. UserInviteToken.update_invite!(invite, uses: 99)
  258. data = %{
  259. :username => "vinny",
  260. :email => "pasta@pizza.vs",
  261. :fullname => "Vinny Vinesauce",
  262. :bio => "streamer",
  263. :password => "hiptofbees",
  264. :confirm => "hiptofbees",
  265. :token => invite.token
  266. }
  267. {:ok, user} = TwitterAPI.register_user(data)
  268. assert user == User.get_cached_by_nickname("vinny")
  269. invite = Repo.get_by(UserInviteToken, token: invite.token)
  270. assert invite.used == true
  271. data = %{
  272. :username => "GrimReaper",
  273. :email => "death@reapers.afterlife",
  274. :fullname => "Reaper Grim",
  275. :bio => "Your time has come",
  276. :password => "scythe",
  277. :confirm => "scythe",
  278. :token => invite.token
  279. }
  280. {:error, msg} = TwitterAPI.register_user(data)
  281. assert msg == "Expired token"
  282. refute User.get_cached_by_nickname("GrimReaper")
  283. end
  284. test "returns error on overdue date" do
  285. {:ok, invite} =
  286. UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), -1), max_use: 100})
  287. data = %{
  288. :username => "GrimReaper",
  289. :email => "death@reapers.afterlife",
  290. :fullname => "Reaper Grim",
  291. :bio => "Your time has come",
  292. :password => "scythe",
  293. :confirm => "scythe",
  294. :token => invite.token
  295. }
  296. {:error, msg} = TwitterAPI.register_user(data)
  297. assert msg == "Expired token"
  298. refute User.get_cached_by_nickname("GrimReaper")
  299. end
  300. test "returns error on with overdue date and after max" do
  301. {:ok, invite} =
  302. UserInviteToken.create_invite(%{expires_at: Date.add(Date.utc_today(), -1), max_use: 100})
  303. UserInviteToken.update_invite!(invite, uses: 100)
  304. data = %{
  305. :username => "GrimReaper",
  306. :email => "death@reapers.afterlife",
  307. :fullname => "Reaper Grim",
  308. :bio => "Your time has come",
  309. :password => "scythe",
  310. :confirm => "scythe",
  311. :token => invite.token
  312. }
  313. {:error, msg} = TwitterAPI.register_user(data)
  314. assert msg == "Expired token"
  315. refute User.get_cached_by_nickname("GrimReaper")
  316. end
  317. end
  318. test "it returns the error on registration problems" do
  319. data = %{
  320. :username => "lain",
  321. :email => "lain@wired.jp",
  322. :fullname => "lain iwakura",
  323. :bio => "close the world."
  324. }
  325. {:error, error} = TwitterAPI.register_user(data)
  326. assert is_binary(error)
  327. refute User.get_cached_by_nickname("lain")
  328. end
  329. end