logo

pleroma

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

user_test.exs (18361B)


  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 Mix.Tasks.Pleroma.UserTest do
  5. alias Pleroma.Activity
  6. alias Pleroma.MFA
  7. alias Pleroma.Object
  8. alias Pleroma.Repo
  9. alias Pleroma.Tests.ObanHelpers
  10. alias Pleroma.User
  11. alias Pleroma.Web.CommonAPI
  12. alias Pleroma.Web.OAuth.Authorization
  13. alias Pleroma.Web.OAuth.Token
  14. use Pleroma.DataCase
  15. use Oban.Testing, repo: Pleroma.Repo
  16. import ExUnit.CaptureIO
  17. import Mock
  18. import Pleroma.Factory
  19. setup do
  20. Mox.stub_with(Pleroma.UnstubbedConfigMock, Pleroma.Config)
  21. :ok
  22. end
  23. setup_all do
  24. Mix.shell(Mix.Shell.Process)
  25. on_exit(fn ->
  26. Mix.shell(Mix.Shell.IO)
  27. end)
  28. :ok
  29. end
  30. describe "running new" do
  31. test "user is created" do
  32. # just get random data
  33. unsaved = build(:user)
  34. # prepare to answer yes
  35. send(self(), {:mix_shell_input, :prompt, "Y"})
  36. Mix.Tasks.Pleroma.User.run([
  37. "new",
  38. unsaved.nickname,
  39. unsaved.email,
  40. "--name",
  41. unsaved.name,
  42. "--bio",
  43. unsaved.bio,
  44. "--password",
  45. "test",
  46. "--moderator",
  47. "--admin"
  48. ])
  49. assert_received {:mix_shell, :info, [message]}
  50. assert message =~ "user will be created"
  51. assert_received {:mix_shell, :prompt, [message]}
  52. assert message =~ "Continue"
  53. assert_received {:mix_shell, :info, [message]}
  54. assert message =~ "created"
  55. user = User.get_cached_by_nickname(unsaved.nickname)
  56. assert user.name == unsaved.name
  57. assert user.email == unsaved.email
  58. assert user.bio == unsaved.bio
  59. assert user.is_moderator
  60. assert user.is_admin
  61. end
  62. test "user is not created" do
  63. unsaved = build(:user)
  64. # prepare to answer no
  65. send(self(), {:mix_shell_input, :prompt, "N"})
  66. Mix.Tasks.Pleroma.User.run(["new", unsaved.nickname, unsaved.email])
  67. assert_received {:mix_shell, :info, [message]}
  68. assert message =~ "user will be created"
  69. assert_received {:mix_shell, :prompt, [message]}
  70. assert message =~ "Continue"
  71. assert_received {:mix_shell, :info, [message]}
  72. assert message =~ "will not be created"
  73. refute User.get_cached_by_nickname(unsaved.nickname)
  74. end
  75. end
  76. describe "running rm" do
  77. test "user is deleted" do
  78. clear_config([:instance, :federating], true)
  79. user = insert(:user)
  80. with_mock Pleroma.Web.Federator,
  81. publish: fn _ -> nil end do
  82. Mix.Tasks.Pleroma.User.run(["rm", user.nickname])
  83. ObanHelpers.perform_all()
  84. assert_received {:mix_shell, :info, [message]}
  85. assert message =~ " deleted"
  86. assert %{is_active: false} = User.get_by_nickname(user.nickname)
  87. assert called(Pleroma.Web.Federator.publish(:_))
  88. end
  89. end
  90. test "a remote user's create activity is deleted when the object has been pruned" do
  91. user = insert(:user)
  92. user2 = insert(:user)
  93. {:ok, post} = CommonAPI.post(user, %{status: "uguu"})
  94. {:ok, post2} = CommonAPI.post(user2, %{status: "test"})
  95. obj = Object.normalize(post2, fetch: false)
  96. {:ok, like_object, meta} = Pleroma.Web.ActivityPub.Builder.like(user, obj)
  97. {:ok, like_activity, _meta} =
  98. Pleroma.Web.ActivityPub.Pipeline.common_pipeline(
  99. like_object,
  100. Keyword.put(meta, :local, true)
  101. )
  102. like_activity.data["object"]
  103. |> Pleroma.Object.get_by_ap_id()
  104. |> Repo.delete()
  105. clear_config([:instance, :federating], true)
  106. object = Object.normalize(post, fetch: false)
  107. Object.prune(object)
  108. with_mock Pleroma.Web.Federator,
  109. publish: fn _ -> nil end do
  110. Mix.Tasks.Pleroma.User.run(["rm", user.nickname])
  111. ObanHelpers.perform_all()
  112. assert_received {:mix_shell, :info, [message]}
  113. assert message =~ " deleted"
  114. assert %{is_active: false} = User.get_by_nickname(user.nickname)
  115. assert called(Pleroma.Web.Federator.publish(:_))
  116. refute Pleroma.Repo.get(Pleroma.Activity, like_activity.id)
  117. end
  118. refute Activity.get_by_id(post.id)
  119. end
  120. test "no user to delete" do
  121. Mix.Tasks.Pleroma.User.run(["rm", "nonexistent"])
  122. assert_received {:mix_shell, :error, [message]}
  123. assert message =~ "No local user"
  124. end
  125. end
  126. describe "running deactivate" do
  127. test "active user is deactivated and unsubscribed" do
  128. followed = insert(:user)
  129. remote_followed = insert(:user, local: false)
  130. user = insert(:user)
  131. User.follow(user, followed, :follow_accept)
  132. User.follow(user, remote_followed, :follow_accept)
  133. Mix.Tasks.Pleroma.User.run(["deactivate", user.nickname])
  134. # Note that the task has delay :timer.sleep(500)
  135. assert_received {:mix_shell, :info, [message]}
  136. assert message ==
  137. "Successfully deactivated #{user.nickname} and unsubscribed all local followers"
  138. user = User.get_cached_by_nickname(user.nickname)
  139. assert Enum.empty?(Enum.filter(User.get_friends(user), & &1.local))
  140. refute user.is_active
  141. end
  142. test "user is deactivated" do
  143. %{id: id, nickname: nickname} = insert(:user, is_active: false)
  144. assert :ok = Mix.Tasks.Pleroma.User.run(["deactivate", nickname])
  145. assert_received {:mix_shell, :info, [message]}
  146. assert message == "User #{nickname} already deactivated"
  147. user = Repo.get(User, id)
  148. refute user.is_active
  149. end
  150. test "no user to deactivate" do
  151. Mix.Tasks.Pleroma.User.run(["deactivate", "nonexistent"])
  152. assert_received {:mix_shell, :error, [message]}
  153. assert message =~ "No user"
  154. end
  155. end
  156. describe "running set" do
  157. test "All statuses set" do
  158. user = insert(:user)
  159. Mix.Tasks.Pleroma.User.run([
  160. "set",
  161. user.nickname,
  162. "--admin",
  163. "--confirmed",
  164. "--locked",
  165. "--moderator"
  166. ])
  167. assert_received {:mix_shell, :info, [message]}
  168. assert message =~ ~r/Admin status .* true/
  169. assert_received {:mix_shell, :info, [message]}
  170. assert message =~ ~r/Confirmation status.* true/
  171. assert_received {:mix_shell, :info, [message]}
  172. assert message =~ ~r/Locked status .* true/
  173. assert_received {:mix_shell, :info, [message]}
  174. assert message =~ ~r/Moderator status .* true/
  175. user = User.get_cached_by_nickname(user.nickname)
  176. assert user.is_moderator
  177. assert user.is_locked
  178. assert user.is_admin
  179. assert user.is_confirmed
  180. end
  181. test "All statuses unset" do
  182. user =
  183. insert(:user,
  184. is_locked: true,
  185. is_moderator: true,
  186. is_admin: true,
  187. is_confirmed: false
  188. )
  189. Mix.Tasks.Pleroma.User.run([
  190. "set",
  191. user.nickname,
  192. "--no-admin",
  193. "--no-confirmed",
  194. "--no-locked",
  195. "--no-moderator"
  196. ])
  197. assert_received {:mix_shell, :info, [message]}
  198. assert message =~ ~r/Admin status .* false/
  199. assert_received {:mix_shell, :info, [message]}
  200. assert message =~ ~r/Confirmation status.* false/
  201. assert_received {:mix_shell, :info, [message]}
  202. assert message =~ ~r/Locked status .* false/
  203. assert_received {:mix_shell, :info, [message]}
  204. assert message =~ ~r/Moderator status .* false/
  205. user = User.get_cached_by_nickname(user.nickname)
  206. refute user.is_moderator
  207. refute user.is_locked
  208. refute user.is_admin
  209. refute user.is_confirmed
  210. end
  211. test "no user to set status" do
  212. Mix.Tasks.Pleroma.User.run(["set", "nonexistent", "--moderator"])
  213. assert_received {:mix_shell, :error, [message]}
  214. assert message =~ "No local user"
  215. end
  216. end
  217. describe "running reset_password" do
  218. test "password reset token is generated" do
  219. user = insert(:user)
  220. assert capture_io(fn ->
  221. Mix.Tasks.Pleroma.User.run(["reset_password", user.nickname])
  222. end) =~ "URL:"
  223. assert_received {:mix_shell, :info, [message]}
  224. assert message =~ "Generated"
  225. end
  226. test "no user to reset password" do
  227. Mix.Tasks.Pleroma.User.run(["reset_password", "nonexistent"])
  228. assert_received {:mix_shell, :error, [message]}
  229. assert message =~ "No local user"
  230. end
  231. end
  232. describe "running reset_mfa" do
  233. test "disables MFA" do
  234. user =
  235. insert(:user,
  236. multi_factor_authentication_settings: %MFA.Settings{
  237. enabled: true,
  238. totp: %MFA.Settings.TOTP{secret: "xx", confirmed: true}
  239. }
  240. )
  241. Mix.Tasks.Pleroma.User.run(["reset_mfa", user.nickname])
  242. assert_received {:mix_shell, :info, [message]}
  243. assert message == "Multi-Factor Authentication disabled for #{user.nickname}"
  244. assert %{enabled: false, totp: false} ==
  245. user.nickname
  246. |> User.get_cached_by_nickname()
  247. |> MFA.mfa_settings()
  248. end
  249. test "no user to reset MFA" do
  250. Mix.Tasks.Pleroma.User.run(["reset_password", "nonexistent"])
  251. assert_received {:mix_shell, :error, [message]}
  252. assert message =~ "No local user"
  253. end
  254. end
  255. describe "running invite" do
  256. test "invite token is generated" do
  257. assert capture_io(fn ->
  258. Mix.Tasks.Pleroma.User.run(["invite"])
  259. end) =~ "http"
  260. assert_received {:mix_shell, :info, [message]}
  261. assert message =~ "Generated user invite token one time"
  262. end
  263. test "token is generated with expires_at" do
  264. assert capture_io(fn ->
  265. Mix.Tasks.Pleroma.User.run([
  266. "invite",
  267. "--expires-at",
  268. Date.to_string(Date.utc_today())
  269. ])
  270. end)
  271. assert_received {:mix_shell, :info, [message]}
  272. assert message =~ "Generated user invite token date limited"
  273. end
  274. test "token is generated with max use" do
  275. assert capture_io(fn ->
  276. Mix.Tasks.Pleroma.User.run([
  277. "invite",
  278. "--max-use",
  279. "5"
  280. ])
  281. end)
  282. assert_received {:mix_shell, :info, [message]}
  283. assert message =~ "Generated user invite token reusable"
  284. end
  285. test "token is generated with max use and expires date" do
  286. assert capture_io(fn ->
  287. Mix.Tasks.Pleroma.User.run([
  288. "invite",
  289. "--max-use",
  290. "5",
  291. "--expires-at",
  292. Date.to_string(Date.utc_today())
  293. ])
  294. end)
  295. assert_received {:mix_shell, :info, [message]}
  296. assert message =~ "Generated user invite token reusable date limited"
  297. end
  298. end
  299. describe "running invites" do
  300. test "invites are listed" do
  301. {:ok, invite} = Pleroma.UserInviteToken.create_invite()
  302. {:ok, invite2} =
  303. Pleroma.UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 15})
  304. # assert capture_io(fn ->
  305. Mix.Tasks.Pleroma.User.run([
  306. "invites"
  307. ])
  308. # end)
  309. assert_received {:mix_shell, :info, [message]}
  310. assert_received {:mix_shell, :info, [message2]}
  311. assert_received {:mix_shell, :info, [message3]}
  312. assert message =~ "Invites list:"
  313. assert message2 =~ invite.invite_type
  314. assert message3 =~ invite2.invite_type
  315. end
  316. end
  317. describe "running revoke_invite" do
  318. test "invite is revoked" do
  319. {:ok, invite} = Pleroma.UserInviteToken.create_invite(%{expires_at: Date.utc_today()})
  320. assert capture_io(fn ->
  321. Mix.Tasks.Pleroma.User.run([
  322. "revoke_invite",
  323. invite.token
  324. ])
  325. end)
  326. assert_received {:mix_shell, :info, [message]}
  327. assert message =~ "Invite for token #{invite.token} was revoked."
  328. end
  329. end
  330. describe "running delete_activities" do
  331. test "activities are deleted" do
  332. %{nickname: nickname} = insert(:user)
  333. assert :ok == Mix.Tasks.Pleroma.User.run(["delete_activities", nickname])
  334. assert_received {:mix_shell, :info, [message]}
  335. assert message == "User #{nickname} statuses deleted."
  336. end
  337. test "it prints an error message when user is not exist" do
  338. Mix.Tasks.Pleroma.User.run(["delete_activities", "foo"])
  339. assert_received {:mix_shell, :error, [message]}
  340. assert message =~ "No local user"
  341. end
  342. end
  343. describe "running confirm" do
  344. test "user is confirmed" do
  345. %{id: id, nickname: nickname} = insert(:user, is_confirmed: true)
  346. assert :ok = Mix.Tasks.Pleroma.User.run(["confirm", nickname])
  347. assert_received {:mix_shell, :info, [message]}
  348. assert message == "#{nickname} doesn't need confirmation."
  349. user = Repo.get(User, id)
  350. assert user.is_confirmed
  351. refute user.confirmation_token
  352. end
  353. test "user is not confirmed" do
  354. %{id: id, nickname: nickname} =
  355. insert(:user, is_confirmed: false, confirmation_token: "some token")
  356. assert :ok = Mix.Tasks.Pleroma.User.run(["confirm", nickname])
  357. assert_received {:mix_shell, :info, [message]}
  358. assert message == "#{nickname} doesn't need confirmation."
  359. user = Repo.get(User, id)
  360. assert user.is_confirmed
  361. refute user.confirmation_token
  362. end
  363. test "it prints an error message when user is not exist" do
  364. Mix.Tasks.Pleroma.User.run(["confirm", "foo"])
  365. assert_received {:mix_shell, :error, [message]}
  366. assert message =~ "No local user"
  367. end
  368. end
  369. describe "running activate" do
  370. test "user is activated" do
  371. %{id: id, nickname: nickname} = insert(:user, is_active: true)
  372. assert :ok = Mix.Tasks.Pleroma.User.run(["activate", nickname])
  373. assert_received {:mix_shell, :info, [message]}
  374. assert message == "User #{nickname} already activated"
  375. user = Repo.get(User, id)
  376. assert user.is_active
  377. end
  378. test "user is not activated" do
  379. %{id: id, nickname: nickname} = insert(:user, is_active: false)
  380. assert :ok = Mix.Tasks.Pleroma.User.run(["activate", nickname])
  381. assert_received {:mix_shell, :info, [message]}
  382. assert message == "Successfully activated #{nickname}"
  383. user = Repo.get(User, id)
  384. assert user.is_active
  385. end
  386. test "no user to activate" do
  387. Mix.Tasks.Pleroma.User.run(["activate", "foo"])
  388. assert_received {:mix_shell, :error, [message]}
  389. assert message =~ "No user"
  390. end
  391. end
  392. describe "search" do
  393. test "it returns users matching" do
  394. user = insert(:user)
  395. moon = insert(:user, nickname: "moon", name: "fediverse expert moon")
  396. moot = insert(:user, nickname: "moot")
  397. kawen = insert(:user, nickname: "kawen", name: "fediverse expert moon")
  398. {:ok, user, moon} = User.follow(user, moon)
  399. assert [moon.id, kawen.id] == User.Search.search("moon") |> Enum.map(& &1.id)
  400. res = User.search("moo") |> Enum.map(& &1.id)
  401. assert Enum.sort([moon.id, moot.id, kawen.id]) == Enum.sort(res)
  402. assert [kawen.id, moon.id] == User.Search.search("expert fediverse") |> Enum.map(& &1.id)
  403. assert [moon.id, kawen.id] ==
  404. User.Search.search("expert fediverse", for_user: user) |> Enum.map(& &1.id)
  405. end
  406. end
  407. describe "signing out" do
  408. test "it deletes all user's tokens and authorizations" do
  409. user = insert(:user)
  410. insert(:oauth_token, user: user)
  411. insert(:oauth_authorization, user: user)
  412. assert Repo.get_by(Token, user_id: user.id)
  413. assert Repo.get_by(Authorization, user_id: user.id)
  414. :ok = Mix.Tasks.Pleroma.User.run(["sign_out", user.nickname])
  415. refute Repo.get_by(Token, user_id: user.id)
  416. refute Repo.get_by(Authorization, user_id: user.id)
  417. end
  418. test "it prints an error message when user is not exist" do
  419. Mix.Tasks.Pleroma.User.run(["sign_out", "foo"])
  420. assert_received {:mix_shell, :error, [message]}
  421. assert message =~ "No local user"
  422. end
  423. end
  424. describe "tagging" do
  425. test "it add tags to a user" do
  426. user = insert(:user)
  427. :ok = Mix.Tasks.Pleroma.User.run(["tag", user.nickname, "pleroma"])
  428. user = User.get_cached_by_nickname(user.nickname)
  429. assert "pleroma" in user.tags
  430. end
  431. test "it prints an error message when user is not exist" do
  432. Mix.Tasks.Pleroma.User.run(["tag", "foo"])
  433. assert_received {:mix_shell, :error, [message]}
  434. assert message =~ "Could not change user tags"
  435. end
  436. end
  437. describe "untagging" do
  438. test "it deletes tags from a user" do
  439. user = insert(:user, tags: ["pleroma"])
  440. assert "pleroma" in user.tags
  441. :ok = Mix.Tasks.Pleroma.User.run(["untag", user.nickname, "pleroma"])
  442. user = User.get_cached_by_nickname(user.nickname)
  443. assert Enum.empty?(user.tags)
  444. end
  445. test "it prints an error message when user is not exist" do
  446. Mix.Tasks.Pleroma.User.run(["untag", "foo"])
  447. assert_received {:mix_shell, :error, [message]}
  448. assert message =~ "Could not change user tags"
  449. end
  450. end
  451. describe "bulk confirm and unconfirm" do
  452. test "confirm all" do
  453. user1 = insert(:user, is_confirmed: false)
  454. user2 = insert(:user, is_confirmed: false)
  455. refute user1.is_confirmed
  456. refute user2.is_confirmed
  457. Mix.Tasks.Pleroma.User.run(["confirm_all"])
  458. user1 = User.get_cached_by_nickname(user1.nickname)
  459. user2 = User.get_cached_by_nickname(user2.nickname)
  460. assert user1.is_confirmed
  461. assert user2.is_confirmed
  462. end
  463. test "unconfirm all" do
  464. user1 = insert(:user, is_confirmed: true)
  465. user2 = insert(:user, is_confirmed: true)
  466. admin = insert(:user, is_admin: true, is_confirmed: true)
  467. mod = insert(:user, is_moderator: true, is_confirmed: true)
  468. assert user1.is_confirmed
  469. assert user2.is_confirmed
  470. Mix.Tasks.Pleroma.User.run(["unconfirm_all"])
  471. user1 = User.get_cached_by_nickname(user1.nickname)
  472. user2 = User.get_cached_by_nickname(user2.nickname)
  473. admin = User.get_cached_by_nickname(admin.nickname)
  474. mod = User.get_cached_by_nickname(mod.nickname)
  475. refute user1.is_confirmed
  476. refute user2.is_confirmed
  477. assert admin.is_confirmed
  478. assert mod.is_confirmed
  479. end
  480. end
  481. end