Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

475 lines
13KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Mix.Tasks.Pleroma.UserTest do
  5. alias Pleroma.Repo
  6. alias Pleroma.User
  7. alias Pleroma.Web.OAuth.Authorization
  8. alias Pleroma.Web.OAuth.Token
  9. use Pleroma.DataCase
  10. import Pleroma.Factory
  11. import ExUnit.CaptureIO
  12. setup_all do
  13. Mix.shell(Mix.Shell.Process)
  14. on_exit(fn ->
  15. Mix.shell(Mix.Shell.IO)
  16. end)
  17. :ok
  18. end
  19. describe "running new" do
  20. test "user is created" do
  21. # just get random data
  22. unsaved = build(:user)
  23. # prepare to answer yes
  24. send(self(), {:mix_shell_input, :yes?, true})
  25. Mix.Tasks.Pleroma.User.run([
  26. "new",
  27. unsaved.nickname,
  28. unsaved.email,
  29. "--name",
  30. unsaved.name,
  31. "--bio",
  32. unsaved.bio,
  33. "--password",
  34. "test",
  35. "--moderator",
  36. "--admin"
  37. ])
  38. assert_received {:mix_shell, :info, [message]}
  39. assert message =~ "user will be created"
  40. assert_received {:mix_shell, :yes?, [message]}
  41. assert message =~ "Continue"
  42. assert_received {:mix_shell, :info, [message]}
  43. assert message =~ "created"
  44. user = User.get_cached_by_nickname(unsaved.nickname)
  45. assert user.name == unsaved.name
  46. assert user.email == unsaved.email
  47. assert user.bio == unsaved.bio
  48. assert user.is_moderator
  49. assert user.is_admin
  50. end
  51. test "user is not created" do
  52. unsaved = build(:user)
  53. # prepare to answer no
  54. send(self(), {:mix_shell_input, :yes?, false})
  55. Mix.Tasks.Pleroma.User.run(["new", unsaved.nickname, unsaved.email])
  56. assert_received {:mix_shell, :info, [message]}
  57. assert message =~ "user will be created"
  58. assert_received {:mix_shell, :yes?, [message]}
  59. assert message =~ "Continue"
  60. assert_received {:mix_shell, :info, [message]}
  61. assert message =~ "will not be created"
  62. refute User.get_cached_by_nickname(unsaved.nickname)
  63. end
  64. end
  65. describe "running rm" do
  66. test "user is deleted" do
  67. user = insert(:user)
  68. Mix.Tasks.Pleroma.User.run(["rm", user.nickname])
  69. assert_received {:mix_shell, :info, [message]}
  70. assert message =~ " deleted"
  71. refute User.get_by_nickname(user.nickname)
  72. end
  73. test "no user to delete" do
  74. Mix.Tasks.Pleroma.User.run(["rm", "nonexistent"])
  75. assert_received {:mix_shell, :error, [message]}
  76. assert message =~ "No local user"
  77. end
  78. end
  79. describe "running toggle_activated" do
  80. test "user is deactivated" do
  81. user = insert(:user)
  82. Mix.Tasks.Pleroma.User.run(["toggle_activated", user.nickname])
  83. assert_received {:mix_shell, :info, [message]}
  84. assert message =~ " deactivated"
  85. user = User.get_cached_by_nickname(user.nickname)
  86. assert user.deactivated
  87. end
  88. test "user is activated" do
  89. user = insert(:user, deactivated: true)
  90. Mix.Tasks.Pleroma.User.run(["toggle_activated", user.nickname])
  91. assert_received {:mix_shell, :info, [message]}
  92. assert message =~ " activated"
  93. user = User.get_cached_by_nickname(user.nickname)
  94. refute user.deactivated
  95. end
  96. test "no user to toggle" do
  97. Mix.Tasks.Pleroma.User.run(["toggle_activated", "nonexistent"])
  98. assert_received {:mix_shell, :error, [message]}
  99. assert message =~ "No user"
  100. end
  101. end
  102. describe "running unsubscribe" do
  103. test "user is unsubscribed" do
  104. followed = insert(:user)
  105. user = insert(:user)
  106. User.follow(user, followed, "accept")
  107. Mix.Tasks.Pleroma.User.run(["unsubscribe", user.nickname])
  108. assert_received {:mix_shell, :info, [message]}
  109. assert message =~ "Deactivating"
  110. assert_received {:mix_shell, :info, [message]}
  111. assert message =~ "Unsubscribing"
  112. # Note that the task has delay :timer.sleep(500)
  113. assert_received {:mix_shell, :info, [message]}
  114. assert message =~ "Successfully unsubscribed"
  115. user = User.get_cached_by_nickname(user.nickname)
  116. assert Enum.empty?(User.get_friends(user))
  117. assert user.deactivated
  118. end
  119. test "no user to unsubscribe" do
  120. Mix.Tasks.Pleroma.User.run(["unsubscribe", "nonexistent"])
  121. assert_received {:mix_shell, :error, [message]}
  122. assert message =~ "No user"
  123. end
  124. end
  125. describe "running set" do
  126. test "All statuses set" do
  127. user = insert(:user)
  128. Mix.Tasks.Pleroma.User.run(["set", user.nickname, "--moderator", "--admin", "--locked"])
  129. assert_received {:mix_shell, :info, [message]}
  130. assert message =~ ~r/Moderator status .* true/
  131. assert_received {:mix_shell, :info, [message]}
  132. assert message =~ ~r/Locked status .* true/
  133. assert_received {:mix_shell, :info, [message]}
  134. assert message =~ ~r/Admin status .* true/
  135. user = User.get_cached_by_nickname(user.nickname)
  136. assert user.is_moderator
  137. assert user.locked
  138. assert user.is_admin
  139. end
  140. test "All statuses unset" do
  141. user = insert(:user, locked: true, is_moderator: true, is_admin: true)
  142. Mix.Tasks.Pleroma.User.run([
  143. "set",
  144. user.nickname,
  145. "--no-moderator",
  146. "--no-admin",
  147. "--no-locked"
  148. ])
  149. assert_received {:mix_shell, :info, [message]}
  150. assert message =~ ~r/Moderator status .* false/
  151. assert_received {:mix_shell, :info, [message]}
  152. assert message =~ ~r/Locked status .* false/
  153. assert_received {:mix_shell, :info, [message]}
  154. assert message =~ ~r/Admin status .* false/
  155. user = User.get_cached_by_nickname(user.nickname)
  156. refute user.is_moderator
  157. refute user.locked
  158. refute user.is_admin
  159. end
  160. test "no user to set status" do
  161. Mix.Tasks.Pleroma.User.run(["set", "nonexistent", "--moderator"])
  162. assert_received {:mix_shell, :error, [message]}
  163. assert message =~ "No local user"
  164. end
  165. end
  166. describe "running reset_password" do
  167. test "password reset token is generated" do
  168. user = insert(:user)
  169. assert capture_io(fn ->
  170. Mix.Tasks.Pleroma.User.run(["reset_password", user.nickname])
  171. end) =~ "URL:"
  172. assert_received {:mix_shell, :info, [message]}
  173. assert message =~ "Generated"
  174. end
  175. test "no user to reset password" do
  176. Mix.Tasks.Pleroma.User.run(["reset_password", "nonexistent"])
  177. assert_received {:mix_shell, :error, [message]}
  178. assert message =~ "No local user"
  179. end
  180. end
  181. describe "running invite" do
  182. test "invite token is generated" do
  183. assert capture_io(fn ->
  184. Mix.Tasks.Pleroma.User.run(["invite"])
  185. end) =~ "http"
  186. assert_received {:mix_shell, :info, [message]}
  187. assert message =~ "Generated user invite token one time"
  188. end
  189. test "token is generated with expires_at" do
  190. assert capture_io(fn ->
  191. Mix.Tasks.Pleroma.User.run([
  192. "invite",
  193. "--expires-at",
  194. Date.to_string(Date.utc_today())
  195. ])
  196. end)
  197. assert_received {:mix_shell, :info, [message]}
  198. assert message =~ "Generated user invite token date limited"
  199. end
  200. test "token is generated with max use" do
  201. assert capture_io(fn ->
  202. Mix.Tasks.Pleroma.User.run([
  203. "invite",
  204. "--max-use",
  205. "5"
  206. ])
  207. end)
  208. assert_received {:mix_shell, :info, [message]}
  209. assert message =~ "Generated user invite token reusable"
  210. end
  211. test "token is generated with max use and expires date" do
  212. assert capture_io(fn ->
  213. Mix.Tasks.Pleroma.User.run([
  214. "invite",
  215. "--max-use",
  216. "5",
  217. "--expires-at",
  218. Date.to_string(Date.utc_today())
  219. ])
  220. end)
  221. assert_received {:mix_shell, :info, [message]}
  222. assert message =~ "Generated user invite token reusable date limited"
  223. end
  224. end
  225. describe "running invites" do
  226. test "invites are listed" do
  227. {:ok, invite} = Pleroma.UserInviteToken.create_invite()
  228. {:ok, invite2} =
  229. Pleroma.UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 15})
  230. # assert capture_io(fn ->
  231. Mix.Tasks.Pleroma.User.run([
  232. "invites"
  233. ])
  234. # end)
  235. assert_received {:mix_shell, :info, [message]}
  236. assert_received {:mix_shell, :info, [message2]}
  237. assert_received {:mix_shell, :info, [message3]}
  238. assert message =~ "Invites list:"
  239. assert message2 =~ invite.invite_type
  240. assert message3 =~ invite2.invite_type
  241. end
  242. end
  243. describe "running revoke_invite" do
  244. test "invite is revoked" do
  245. {:ok, invite} = Pleroma.UserInviteToken.create_invite(%{expires_at: Date.utc_today()})
  246. assert capture_io(fn ->
  247. Mix.Tasks.Pleroma.User.run([
  248. "revoke_invite",
  249. invite.token
  250. ])
  251. end)
  252. assert_received {:mix_shell, :info, [message]}
  253. assert message =~ "Invite for token #{invite.token} was revoked."
  254. end
  255. test "it prints an error message when invite is not exist" do
  256. Mix.Tasks.Pleroma.User.run(["revoke_invite", "foo"])
  257. assert_received {:mix_shell, :error, [message]}
  258. assert message =~ "No invite found"
  259. end
  260. end
  261. describe "running delete_activities" do
  262. test "activities are deleted" do
  263. %{nickname: nickname} = insert(:user)
  264. assert :ok == Mix.Tasks.Pleroma.User.run(["delete_activities", nickname])
  265. assert_received {:mix_shell, :info, [message]}
  266. assert message == "User #{nickname} statuses deleted."
  267. end
  268. test "it prints an error message when user is not exist" do
  269. Mix.Tasks.Pleroma.User.run(["delete_activities", "foo"])
  270. assert_received {:mix_shell, :error, [message]}
  271. assert message =~ "No local user"
  272. end
  273. end
  274. describe "running toggle_confirmed" do
  275. test "user is confirmed" do
  276. %{id: id, nickname: nickname} = insert(:user, confirmation_pending: false)
  277. assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname])
  278. assert_received {:mix_shell, :info, [message]}
  279. assert message == "#{nickname} needs confirmation."
  280. user = Repo.get(User, id)
  281. assert user.confirmation_pending
  282. assert user.confirmation_token
  283. end
  284. test "user is not confirmed" do
  285. %{id: id, nickname: nickname} =
  286. insert(:user, confirmation_pending: true, confirmation_token: "some token")
  287. assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname])
  288. assert_received {:mix_shell, :info, [message]}
  289. assert message == "#{nickname} doesn't need confirmation."
  290. user = Repo.get(User, id)
  291. refute user.confirmation_pending
  292. refute user.confirmation_token
  293. end
  294. test "it prints an error message when user is not exist" do
  295. Mix.Tasks.Pleroma.User.run(["toggle_confirmed", "foo"])
  296. assert_received {:mix_shell, :error, [message]}
  297. assert message =~ "No local user"
  298. end
  299. end
  300. describe "search" do
  301. test "it returns users matching" do
  302. user = insert(:user)
  303. moon = insert(:user, nickname: "moon", name: "fediverse expert moon")
  304. moot = insert(:user, nickname: "moot")
  305. kawen = insert(:user, nickname: "kawen", name: "fediverse expert moon")
  306. {:ok, user} = User.follow(user, kawen)
  307. assert [moon.id, kawen.id] == User.Search.search("moon") |> Enum.map(& &1.id)
  308. res = User.search("moo") |> Enum.map(& &1.id)
  309. assert moon.id in res
  310. assert moot.id in res
  311. assert kawen.id in res
  312. assert [moon.id, kawen.id] == User.Search.search("moon fediverse") |> Enum.map(& &1.id)
  313. assert [kawen.id, moon.id] ==
  314. User.Search.search("moon fediverse", for_user: user) |> Enum.map(& &1.id)
  315. end
  316. end
  317. describe "signing out" do
  318. test "it deletes all user's tokens and authorizations" do
  319. user = insert(:user)
  320. insert(:oauth_token, user: user)
  321. insert(:oauth_authorization, user: user)
  322. assert Repo.get_by(Token, user_id: user.id)
  323. assert Repo.get_by(Authorization, user_id: user.id)
  324. :ok = Mix.Tasks.Pleroma.User.run(["sign_out", user.nickname])
  325. refute Repo.get_by(Token, user_id: user.id)
  326. refute Repo.get_by(Authorization, user_id: user.id)
  327. end
  328. test "it prints an error message when user is not exist" do
  329. Mix.Tasks.Pleroma.User.run(["sign_out", "foo"])
  330. assert_received {:mix_shell, :error, [message]}
  331. assert message =~ "No local user"
  332. end
  333. end
  334. describe "tagging" do
  335. test "it add tags to a user" do
  336. user = insert(:user)
  337. :ok = Mix.Tasks.Pleroma.User.run(["tag", user.nickname, "pleroma"])
  338. user = User.get_cached_by_nickname(user.nickname)
  339. assert "pleroma" in user.tags
  340. end
  341. test "it prints an error message when user is not exist" do
  342. Mix.Tasks.Pleroma.User.run(["tag", "foo"])
  343. assert_received {:mix_shell, :error, [message]}
  344. assert message =~ "Could not change user tags"
  345. end
  346. end
  347. describe "untagging" do
  348. test "it deletes tags from a user" do
  349. user = insert(:user, tags: ["pleroma"])
  350. assert "pleroma" in user.tags
  351. :ok = Mix.Tasks.Pleroma.User.run(["untag", user.nickname, "pleroma"])
  352. user = User.get_cached_by_nickname(user.nickname)
  353. assert Enum.empty?(user.tags)
  354. end
  355. test "it prints an error message when user is not exist" do
  356. Mix.Tasks.Pleroma.User.run(["untag", "foo"])
  357. assert_received {:mix_shell, :error, [message]}
  358. assert message =~ "Could not change user tags"
  359. end
  360. end
  361. end