logo

pleroma

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

invite_controller_test.exs (10671B)


  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.AdminAPI.InviteControllerTest do
  5. use Pleroma.Web.ConnCase, async: false
  6. import Pleroma.Factory
  7. alias Pleroma.Repo
  8. alias Pleroma.UserInviteToken
  9. setup do
  10. admin = insert(:user, is_admin: true)
  11. token = insert(:oauth_admin_token, user: admin)
  12. conn =
  13. build_conn()
  14. |> assign(:user, admin)
  15. |> assign(:token, token)
  16. {:ok, %{admin: admin, token: token, conn: conn}}
  17. end
  18. describe "POST /api/pleroma/admin/users/email_invite, with valid config" do
  19. setup do
  20. clear_config([:instance, :registrations_open], false)
  21. clear_config([:instance, :invites_enabled], true)
  22. clear_config([:instance, :admin_privileges], [:users_manage_invites])
  23. end
  24. test "returns 403 if not privileged with :users_manage_invites", %{conn: conn} do
  25. clear_config([:instance, :admin_privileges], [])
  26. conn =
  27. conn
  28. |> put_req_header("content-type", "application/json;charset=utf-8")
  29. |> post("/api/pleroma/admin/users/email_invite", %{
  30. email: "foo@bar.com",
  31. name: "J. D."
  32. })
  33. assert json_response(conn, :forbidden)
  34. end
  35. test "sends invitation and returns 204", %{admin: admin, conn: conn} do
  36. recipient_email = "foo@bar.com"
  37. recipient_name = "J. D."
  38. conn =
  39. conn
  40. |> put_req_header("content-type", "application/json;charset=utf-8")
  41. |> post("/api/pleroma/admin/users/email_invite", %{
  42. email: recipient_email,
  43. name: recipient_name
  44. })
  45. assert json_response_and_validate_schema(conn, :no_content)
  46. token_record = List.last(Repo.all(Pleroma.UserInviteToken))
  47. assert token_record
  48. refute token_record.used
  49. notify_email = Config.get([:instance, :notify_email])
  50. instance_name = Config.get([:instance, :name])
  51. email =
  52. Pleroma.Emails.UserEmail.user_invitation_email(
  53. admin,
  54. token_record,
  55. recipient_email,
  56. recipient_name
  57. )
  58. Swoosh.TestAssertions.assert_email_sent(
  59. from: {instance_name, notify_email},
  60. to: {recipient_name, recipient_email},
  61. html_body: email.html_body
  62. )
  63. end
  64. test "it returns 403 if requested by a non-admin" do
  65. non_admin_user = insert(:user)
  66. token = insert(:oauth_token, user: non_admin_user)
  67. conn =
  68. build_conn()
  69. |> assign(:user, non_admin_user)
  70. |> assign(:token, token)
  71. |> put_req_header("content-type", "application/json;charset=utf-8")
  72. |> post("/api/pleroma/admin/users/email_invite", %{
  73. email: "foo@bar.com",
  74. name: "JD"
  75. })
  76. assert json_response(conn, :forbidden)
  77. end
  78. test "email with +", %{conn: conn, admin: admin} do
  79. recipient_email = "foo+bar@baz.com"
  80. conn
  81. |> put_req_header("content-type", "application/json;charset=utf-8")
  82. |> post("/api/pleroma/admin/users/email_invite", %{email: recipient_email})
  83. |> json_response_and_validate_schema(:no_content)
  84. token_record =
  85. Pleroma.UserInviteToken
  86. |> Repo.all()
  87. |> List.last()
  88. assert token_record
  89. refute token_record.used
  90. notify_email = Config.get([:instance, :notify_email])
  91. instance_name = Config.get([:instance, :name])
  92. email =
  93. Pleroma.Emails.UserEmail.user_invitation_email(
  94. admin,
  95. token_record,
  96. recipient_email
  97. )
  98. Swoosh.TestAssertions.assert_email_sent(
  99. from: {instance_name, notify_email},
  100. to: recipient_email,
  101. html_body: email.html_body
  102. )
  103. end
  104. end
  105. describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do
  106. setup do
  107. clear_config([:instance, :registrations_open])
  108. clear_config([:instance, :invites_enabled])
  109. clear_config([:instance, :admin_privileges], [:users_manage_invites])
  110. end
  111. test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn} do
  112. clear_config([:instance, :registrations_open], false)
  113. clear_config([:instance, :invites_enabled], false)
  114. conn =
  115. conn
  116. |> put_req_header("content-type", "application/json")
  117. |> post("/api/pleroma/admin/users/email_invite", %{
  118. email: "foo@bar.com",
  119. name: "JD"
  120. })
  121. assert json_response_and_validate_schema(conn, :bad_request) ==
  122. %{
  123. "error" =>
  124. "To send invites you need to set the `invites_enabled` option to true."
  125. }
  126. end
  127. test "it returns 500 if `registrations_open` is enabled", %{conn: conn} do
  128. clear_config([:instance, :registrations_open], true)
  129. clear_config([:instance, :invites_enabled], true)
  130. conn =
  131. conn
  132. |> put_req_header("content-type", "application/json")
  133. |> post("/api/pleroma/admin/users/email_invite", %{
  134. email: "foo@bar.com",
  135. name: "JD"
  136. })
  137. assert json_response_and_validate_schema(conn, :bad_request) ==
  138. %{
  139. "error" =>
  140. "To send invites you need to set the `registrations_open` option to false."
  141. }
  142. end
  143. end
  144. describe "POST /api/pleroma/admin/users/invite_token" do
  145. setup do
  146. clear_config([:instance, :admin_privileges], [:users_manage_invites])
  147. end
  148. test "returns 403 if not privileged with :users_manage_invites", %{conn: conn} do
  149. clear_config([:instance, :admin_privileges], [])
  150. conn =
  151. conn
  152. |> put_req_header("content-type", "application/json")
  153. |> post("/api/pleroma/admin/users/invite_token")
  154. assert json_response(conn, :forbidden)
  155. end
  156. test "without options", %{conn: conn} do
  157. conn =
  158. conn
  159. |> put_req_header("content-type", "application/json")
  160. |> post("/api/pleroma/admin/users/invite_token")
  161. invite_json = json_response_and_validate_schema(conn, 200)
  162. invite = UserInviteToken.find_by_token!(invite_json["token"])
  163. refute invite.used
  164. refute invite.expires_at
  165. refute invite.max_use
  166. assert invite.invite_type == "one_time"
  167. end
  168. test "with expires_at", %{conn: conn} do
  169. conn =
  170. conn
  171. |> put_req_header("content-type", "application/json")
  172. |> post("/api/pleroma/admin/users/invite_token", %{
  173. "expires_at" => Date.to_string(Date.utc_today())
  174. })
  175. invite_json = json_response_and_validate_schema(conn, 200)
  176. invite = UserInviteToken.find_by_token!(invite_json["token"])
  177. refute invite.used
  178. assert invite.expires_at == Date.utc_today()
  179. refute invite.max_use
  180. assert invite.invite_type == "date_limited"
  181. end
  182. test "with max_use", %{conn: conn} do
  183. conn =
  184. conn
  185. |> put_req_header("content-type", "application/json")
  186. |> post("/api/pleroma/admin/users/invite_token", %{"max_use" => 150})
  187. invite_json = json_response_and_validate_schema(conn, 200)
  188. invite = UserInviteToken.find_by_token!(invite_json["token"])
  189. refute invite.used
  190. refute invite.expires_at
  191. assert invite.max_use == 150
  192. assert invite.invite_type == "reusable"
  193. end
  194. test "with max use and expires_at", %{conn: conn} do
  195. conn =
  196. conn
  197. |> put_req_header("content-type", "application/json")
  198. |> post("/api/pleroma/admin/users/invite_token", %{
  199. "max_use" => 150,
  200. "expires_at" => Date.to_string(Date.utc_today())
  201. })
  202. invite_json = json_response_and_validate_schema(conn, 200)
  203. invite = UserInviteToken.find_by_token!(invite_json["token"])
  204. refute invite.used
  205. assert invite.expires_at == Date.utc_today()
  206. assert invite.max_use == 150
  207. assert invite.invite_type == "reusable_date_limited"
  208. end
  209. end
  210. describe "GET /api/pleroma/admin/users/invites" do
  211. setup do
  212. clear_config([:instance, :admin_privileges], [:users_manage_invites])
  213. end
  214. test "returns 403 if not privileged with :users_manage_invites", %{conn: conn} do
  215. clear_config([:instance, :admin_privileges], [])
  216. conn = get(conn, "/api/pleroma/admin/users/invites")
  217. assert json_response(conn, :forbidden)
  218. end
  219. test "no invites", %{conn: conn} do
  220. conn = get(conn, "/api/pleroma/admin/users/invites")
  221. assert json_response_and_validate_schema(conn, 200) == %{"invites" => []}
  222. end
  223. test "with invite", %{conn: conn} do
  224. {:ok, invite} = UserInviteToken.create_invite()
  225. conn = get(conn, "/api/pleroma/admin/users/invites")
  226. assert json_response_and_validate_schema(conn, 200) == %{
  227. "invites" => [
  228. %{
  229. "expires_at" => nil,
  230. "id" => invite.id,
  231. "invite_type" => "one_time",
  232. "max_use" => nil,
  233. "token" => invite.token,
  234. "used" => false,
  235. "uses" => 0
  236. }
  237. ]
  238. }
  239. end
  240. end
  241. describe "POST /api/pleroma/admin/users/revoke_invite" do
  242. setup do
  243. clear_config([:instance, :admin_privileges], [:users_manage_invites])
  244. end
  245. test "returns 403 if not privileged with :users_manage_invites", %{conn: conn} do
  246. clear_config([:instance, :admin_privileges], [])
  247. conn =
  248. conn
  249. |> put_req_header("content-type", "application/json")
  250. |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"})
  251. assert json_response(conn, :forbidden)
  252. end
  253. test "with token", %{conn: conn} do
  254. {:ok, invite} = UserInviteToken.create_invite()
  255. conn =
  256. conn
  257. |> put_req_header("content-type", "application/json")
  258. |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => invite.token})
  259. assert json_response_and_validate_schema(conn, 200) == %{
  260. "expires_at" => nil,
  261. "id" => invite.id,
  262. "invite_type" => "one_time",
  263. "max_use" => nil,
  264. "token" => invite.token,
  265. "used" => true,
  266. "uses" => 0
  267. }
  268. end
  269. test "with invalid token", %{conn: conn} do
  270. conn =
  271. conn
  272. |> put_req_header("content-type", "application/json")
  273. |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"})
  274. assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"}
  275. end
  276. end
  277. end