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.

474 lines
14KB

  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.info.is_moderator
  49. assert user.info.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.info.deactivated
  87. end
  88. test "user is activated" do
  89. user = insert(:user, info: %{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.info.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, %{following: [User.ap_followers(followed)]})
  106. Mix.Tasks.Pleroma.User.run(["unsubscribe", user.nickname])
  107. assert_received {:mix_shell, :info, [message]}
  108. assert message =~ "Deactivating"
  109. assert_received {:mix_shell, :info, [message]}
  110. assert message =~ "Unsubscribing"
  111. # Note that the task has delay :timer.sleep(500)
  112. assert_received {:mix_shell, :info, [message]}
  113. assert message =~ "Successfully unsubscribed"
  114. user = User.get_cached_by_nickname(user.nickname)
  115. assert Enum.empty?(user.following)
  116. assert user.info.deactivated
  117. end
  118. test "no user to unsubscribe" do
  119. Mix.Tasks.Pleroma.User.run(["unsubscribe", "nonexistent"])
  120. assert_received {:mix_shell, :error, [message]}
  121. assert message =~ "No user"
  122. end
  123. end
  124. describe "running set" do
  125. test "All statuses set" do
  126. user = insert(:user)
  127. Mix.Tasks.Pleroma.User.run(["set", user.nickname, "--moderator", "--admin", "--locked"])
  128. assert_received {:mix_shell, :info, [message]}
  129. assert message =~ ~r/Moderator status .* true/
  130. assert_received {:mix_shell, :info, [message]}
  131. assert message =~ ~r/Locked status .* true/
  132. assert_received {:mix_shell, :info, [message]}
  133. assert message =~ ~r/Admin status .* true/
  134. user = User.get_cached_by_nickname(user.nickname)
  135. assert user.info.is_moderator
  136. assert user.info.locked
  137. assert user.info.is_admin
  138. end
  139. test "All statuses unset" do
  140. user = insert(:user, info: %{is_moderator: true, locked: true, is_admin: true})
  141. Mix.Tasks.Pleroma.User.run([
  142. "set",
  143. user.nickname,
  144. "--no-moderator",
  145. "--no-admin",
  146. "--no-locked"
  147. ])
  148. assert_received {:mix_shell, :info, [message]}
  149. assert message =~ ~r/Moderator status .* false/
  150. assert_received {:mix_shell, :info, [message]}
  151. assert message =~ ~r/Locked status .* false/
  152. assert_received {:mix_shell, :info, [message]}
  153. assert message =~ ~r/Admin status .* false/
  154. user = User.get_cached_by_nickname(user.nickname)
  155. refute user.info.is_moderator
  156. refute user.info.locked
  157. refute user.info.is_admin
  158. end
  159. test "no user to set status" do
  160. Mix.Tasks.Pleroma.User.run(["set", "nonexistent", "--moderator"])
  161. assert_received {:mix_shell, :error, [message]}
  162. assert message =~ "No local user"
  163. end
  164. end
  165. describe "running reset_password" do
  166. test "password reset token is generated" do
  167. user = insert(:user)
  168. assert capture_io(fn ->
  169. Mix.Tasks.Pleroma.User.run(["reset_password", user.nickname])
  170. end) =~ "URL:"
  171. assert_received {:mix_shell, :info, [message]}
  172. assert message =~ "Generated"
  173. end
  174. test "no user to reset password" do
  175. Mix.Tasks.Pleroma.User.run(["reset_password", "nonexistent"])
  176. assert_received {:mix_shell, :error, [message]}
  177. assert message =~ "No local user"
  178. end
  179. end
  180. describe "running invite" do
  181. test "invite token is generated" do
  182. assert capture_io(fn ->
  183. Mix.Tasks.Pleroma.User.run(["invite"])
  184. end) =~ "http"
  185. assert_received {:mix_shell, :info, [message]}
  186. assert message =~ "Generated user invite token one time"
  187. end
  188. test "token is generated with expires_at" do
  189. assert capture_io(fn ->
  190. Mix.Tasks.Pleroma.User.run([
  191. "invite",
  192. "--expires-at",
  193. Date.to_string(Date.utc_today())
  194. ])
  195. end)
  196. assert_received {:mix_shell, :info, [message]}
  197. assert message =~ "Generated user invite token date limited"
  198. end
  199. test "token is generated with max use" do
  200. assert capture_io(fn ->
  201. Mix.Tasks.Pleroma.User.run([
  202. "invite",
  203. "--max-use",
  204. "5"
  205. ])
  206. end)
  207. assert_received {:mix_shell, :info, [message]}
  208. assert message =~ "Generated user invite token reusable"
  209. end
  210. test "token is generated with max use and expires date" do
  211. assert capture_io(fn ->
  212. Mix.Tasks.Pleroma.User.run([
  213. "invite",
  214. "--max-use",
  215. "5",
  216. "--expires-at",
  217. Date.to_string(Date.utc_today())
  218. ])
  219. end)
  220. assert_received {:mix_shell, :info, [message]}
  221. assert message =~ "Generated user invite token reusable date limited"
  222. end
  223. end
  224. describe "running invites" do
  225. test "invites are listed" do
  226. {:ok, invite} = Pleroma.UserInviteToken.create_invite()
  227. {:ok, invite2} =
  228. Pleroma.UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 15})
  229. # assert capture_io(fn ->
  230. Mix.Tasks.Pleroma.User.run([
  231. "invites"
  232. ])
  233. # end)
  234. assert_received {:mix_shell, :info, [message]}
  235. assert_received {:mix_shell, :info, [message2]}
  236. assert_received {:mix_shell, :info, [message3]}
  237. assert message =~ "Invites list:"
  238. assert message2 =~ invite.invite_type
  239. assert message3 =~ invite2.invite_type
  240. end
  241. end
  242. describe "running revoke_invite" do
  243. test "invite is revoked" do
  244. {:ok, invite} = Pleroma.UserInviteToken.create_invite(%{expires_at: Date.utc_today()})
  245. assert capture_io(fn ->
  246. Mix.Tasks.Pleroma.User.run([
  247. "revoke_invite",
  248. invite.token
  249. ])
  250. end)
  251. assert_received {:mix_shell, :info, [message]}
  252. assert message =~ "Invite for token #{invite.token} was revoked."
  253. end
  254. test "it prints an error message when invite is not exist" do
  255. Mix.Tasks.Pleroma.User.run(["revoke_invite", "foo"])
  256. assert_received {:mix_shell, :error, [message]}
  257. assert message =~ "No invite found"
  258. end
  259. end
  260. describe "running delete_activities" do
  261. test "activities are deleted" do
  262. %{nickname: nickname} = insert(:user)
  263. assert :ok == Mix.Tasks.Pleroma.User.run(["delete_activities", nickname])
  264. assert_received {:mix_shell, :info, [message]}
  265. assert message == "User #{nickname} statuses deleted."
  266. end
  267. test "it prints an error message when user is not exist" do
  268. Mix.Tasks.Pleroma.User.run(["delete_activities", "foo"])
  269. assert_received {:mix_shell, :error, [message]}
  270. assert message =~ "No local user"
  271. end
  272. end
  273. describe "running toggle_confirmed" do
  274. test "user is confirmed" do
  275. %{id: id, nickname: nickname} = insert(:user, info: %{confirmation_pending: false})
  276. assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname])
  277. assert_received {:mix_shell, :info, [message]}
  278. assert message == "#{nickname} needs confirmation."
  279. user = Repo.get(User, id)
  280. assert user.info.confirmation_pending
  281. assert user.info.confirmation_token
  282. end
  283. test "user is not confirmed" do
  284. %{id: id, nickname: nickname} =
  285. insert(:user, info: %{confirmation_pending: true, confirmation_token: "some token"})
  286. assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname])
  287. assert_received {:mix_shell, :info, [message]}
  288. assert message == "#{nickname} doesn't need confirmation."
  289. user = Repo.get(User, id)
  290. refute user.info.confirmation_pending
  291. refute user.info.confirmation_token
  292. end
  293. test "it prints an error message when user is not exist" do
  294. Mix.Tasks.Pleroma.User.run(["toggle_confirmed", "foo"])
  295. assert_received {:mix_shell, :error, [message]}
  296. assert message =~ "No local user"
  297. end
  298. end
  299. describe "search" do
  300. test "it returns users matching" do
  301. user = insert(:user)
  302. moon = insert(:user, nickname: "moon", name: "fediverse expert moon")
  303. moot = insert(:user, nickname: "moot")
  304. kawen = insert(:user, nickname: "kawen", name: "fediverse expert moon")
  305. {:ok, user} = User.follow(user, kawen)
  306. assert [moon.id, kawen.id] == User.Search.search("moon") |> Enum.map(& &1.id)
  307. res = User.search("moo") |> Enum.map(& &1.id)
  308. assert moon.id in res
  309. assert moot.id in res
  310. assert kawen.id in res
  311. assert [moon.id, kawen.id] == User.Search.search("moon fediverse") |> Enum.map(& &1.id)
  312. assert [kawen.id, moon.id] ==
  313. User.Search.search("moon fediverse", for_user: user) |> Enum.map(& &1.id)
  314. end
  315. end
  316. describe "signing out" do
  317. test "it deletes all user's tokens and authorizations" do
  318. user = insert(:user)
  319. insert(:oauth_token, user: user)
  320. insert(:oauth_authorization, user: user)
  321. assert Repo.get_by(Token, user_id: user.id)
  322. assert Repo.get_by(Authorization, user_id: user.id)
  323. :ok = Mix.Tasks.Pleroma.User.run(["sign_out", user.nickname])
  324. refute Repo.get_by(Token, user_id: user.id)
  325. refute Repo.get_by(Authorization, user_id: user.id)
  326. end
  327. test "it prints an error message when user is not exist" do
  328. Mix.Tasks.Pleroma.User.run(["sign_out", "foo"])
  329. assert_received {:mix_shell, :error, [message]}
  330. assert message =~ "No local user"
  331. end
  332. end
  333. describe "tagging" do
  334. test "it add tags to a user" do
  335. user = insert(:user)
  336. :ok = Mix.Tasks.Pleroma.User.run(["tag", user.nickname, "pleroma"])
  337. user = User.get_cached_by_nickname(user.nickname)
  338. assert "pleroma" in user.tags
  339. end
  340. test "it prints an error message when user is not exist" do
  341. Mix.Tasks.Pleroma.User.run(["tag", "foo"])
  342. assert_received {:mix_shell, :error, [message]}
  343. assert message =~ "Could not change user tags"
  344. end
  345. end
  346. describe "untagging" do
  347. test "it deletes tags from a user" do
  348. user = insert(:user, tags: ["pleroma"])
  349. assert "pleroma" in user.tags
  350. :ok = Mix.Tasks.Pleroma.User.run(["untag", user.nickname, "pleroma"])
  351. user = User.get_cached_by_nickname(user.nickname)
  352. assert Enum.empty?(user.tags)
  353. end
  354. test "it prints an error message when user is not exist" do
  355. Mix.Tasks.Pleroma.User.run(["untag", "foo"])
  356. assert_received {:mix_shell, :error, [message]}
  357. assert message =~ "Could not change user tags"
  358. end
  359. end
  360. end