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.

915 lines
27KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.AdminAPI.UserControllerTest do
  5. use Pleroma.Web.ConnCase
  6. use Oban.Testing, repo: Pleroma.Repo
  7. import Mock
  8. import Pleroma.Factory
  9. alias Pleroma.HTML
  10. alias Pleroma.ModerationLog
  11. alias Pleroma.Repo
  12. alias Pleroma.Tests.ObanHelpers
  13. alias Pleroma.User
  14. alias Pleroma.Web.ActivityPub.Relay
  15. alias Pleroma.Web.CommonAPI
  16. alias Pleroma.Web.Endpoint
  17. alias Pleroma.Web.MediaProxy
  18. setup_all do
  19. Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
  20. :ok
  21. end
  22. setup do
  23. admin = insert(:user, is_admin: true)
  24. token = insert(:oauth_admin_token, user: admin)
  25. conn =
  26. build_conn()
  27. |> assign(:user, admin)
  28. |> assign(:token, token)
  29. {:ok, %{admin: admin, token: token, conn: conn}}
  30. end
  31. test "with valid `admin_token` query parameter, skips OAuth scopes check" do
  32. clear_config([:admin_token], "password123")
  33. user = insert(:user)
  34. conn = get(build_conn(), "/api/pleroma/admin/users/#{user.nickname}?admin_token=password123")
  35. assert json_response(conn, 200)
  36. end
  37. test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope",
  38. %{admin: admin} do
  39. user = insert(:user)
  40. url = "/api/pleroma/admin/users/#{user.nickname}"
  41. good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"])
  42. good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"])
  43. good_token3 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts"])
  44. bad_token1 = insert(:oauth_token, user: admin, scopes: ["read:accounts"])
  45. bad_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts:partial"])
  46. bad_token3 = nil
  47. for good_token <- [good_token1, good_token2, good_token3] do
  48. conn =
  49. build_conn()
  50. |> assign(:user, admin)
  51. |> assign(:token, good_token)
  52. |> get(url)
  53. assert json_response(conn, 200)
  54. end
  55. for good_token <- [good_token1, good_token2, good_token3] do
  56. conn =
  57. build_conn()
  58. |> assign(:user, nil)
  59. |> assign(:token, good_token)
  60. |> get(url)
  61. assert json_response(conn, :forbidden)
  62. end
  63. for bad_token <- [bad_token1, bad_token2, bad_token3] do
  64. conn =
  65. build_conn()
  66. |> assign(:user, admin)
  67. |> assign(:token, bad_token)
  68. |> get(url)
  69. assert json_response(conn, :forbidden)
  70. end
  71. end
  72. describe "DELETE /api/pleroma/admin/users" do
  73. test "single user", %{admin: admin, conn: conn} do
  74. clear_config([:instance, :federating], true)
  75. user =
  76. insert(:user,
  77. avatar: %{"url" => [%{"href" => "https://someurl"}]},
  78. banner: %{"url" => [%{"href" => "https://somebanner"}]},
  79. bio: "Hello world!",
  80. name: "A guy"
  81. )
  82. # Create some activities to check they got deleted later
  83. follower = insert(:user)
  84. {:ok, _} = CommonAPI.post(user, %{status: "test"})
  85. {:ok, _, _, _} = CommonAPI.follow(user, follower)
  86. {:ok, _, _, _} = CommonAPI.follow(follower, user)
  87. user = Repo.get(User, user.id)
  88. assert user.note_count == 1
  89. assert user.follower_count == 1
  90. assert user.following_count == 1
  91. assert user.is_active
  92. with_mock Pleroma.Web.Federator,
  93. publish: fn _ -> nil end,
  94. perform: fn _, _ -> nil end do
  95. conn =
  96. conn
  97. |> put_req_header("accept", "application/json")
  98. |> delete("/api/pleroma/admin/users?nickname=#{user.nickname}")
  99. ObanHelpers.perform_all()
  100. refute User.get_by_nickname(user.nickname).is_active
  101. log_entry = Repo.one(ModerationLog)
  102. assert ModerationLog.get_log_entry_message(log_entry) ==
  103. "@#{admin.nickname} deleted users: @#{user.nickname}"
  104. assert json_response(conn, 200) == [user.nickname]
  105. user = Repo.get(User, user.id)
  106. refute user.is_active
  107. assert user.avatar == %{}
  108. assert user.banner == %{}
  109. assert user.note_count == 0
  110. assert user.follower_count == 0
  111. assert user.following_count == 0
  112. assert user.bio == ""
  113. assert user.name == nil
  114. assert called(Pleroma.Web.Federator.publish(:_))
  115. end
  116. end
  117. test "multiple users", %{admin: admin, conn: conn} do
  118. user_one = insert(:user)
  119. user_two = insert(:user)
  120. conn =
  121. conn
  122. |> put_req_header("accept", "application/json")
  123. |> delete("/api/pleroma/admin/users", %{
  124. nicknames: [user_one.nickname, user_two.nickname]
  125. })
  126. log_entry = Repo.one(ModerationLog)
  127. assert ModerationLog.get_log_entry_message(log_entry) ==
  128. "@#{admin.nickname} deleted users: @#{user_one.nickname}, @#{user_two.nickname}"
  129. response = json_response(conn, 200)
  130. assert response -- [user_one.nickname, user_two.nickname] == []
  131. end
  132. end
  133. describe "/api/pleroma/admin/users" do
  134. test "Create", %{conn: conn} do
  135. conn =
  136. conn
  137. |> put_req_header("accept", "application/json")
  138. |> post("/api/pleroma/admin/users", %{
  139. "users" => [
  140. %{
  141. "nickname" => "lain",
  142. "email" => "lain@example.org",
  143. "password" => "test"
  144. },
  145. %{
  146. "nickname" => "lain2",
  147. "email" => "lain2@example.org",
  148. "password" => "test"
  149. }
  150. ]
  151. })
  152. response = json_response(conn, 200) |> Enum.map(&Map.get(&1, "type"))
  153. assert response == ["success", "success"]
  154. log_entry = Repo.one(ModerationLog)
  155. assert ["lain", "lain2"] -- Enum.map(log_entry.data["subjects"], & &1["nickname"]) == []
  156. end
  157. test "Cannot create user with existing email", %{conn: conn} do
  158. user = insert(:user)
  159. conn =
  160. conn
  161. |> put_req_header("accept", "application/json")
  162. |> post("/api/pleroma/admin/users", %{
  163. "users" => [
  164. %{
  165. "nickname" => "lain",
  166. "email" => user.email,
  167. "password" => "test"
  168. }
  169. ]
  170. })
  171. assert json_response(conn, 409) == [
  172. %{
  173. "code" => 409,
  174. "data" => %{
  175. "email" => user.email,
  176. "nickname" => "lain"
  177. },
  178. "error" => "email has already been taken",
  179. "type" => "error"
  180. }
  181. ]
  182. end
  183. test "Cannot create user with existing nickname", %{conn: conn} do
  184. user = insert(:user)
  185. conn =
  186. conn
  187. |> put_req_header("accept", "application/json")
  188. |> post("/api/pleroma/admin/users", %{
  189. "users" => [
  190. %{
  191. "nickname" => user.nickname,
  192. "email" => "someuser@plerama.social",
  193. "password" => "test"
  194. }
  195. ]
  196. })
  197. assert json_response(conn, 409) == [
  198. %{
  199. "code" => 409,
  200. "data" => %{
  201. "email" => "someuser@plerama.social",
  202. "nickname" => user.nickname
  203. },
  204. "error" => "nickname has already been taken",
  205. "type" => "error"
  206. }
  207. ]
  208. end
  209. test "Multiple user creation works in transaction", %{conn: conn} do
  210. user = insert(:user)
  211. conn =
  212. conn
  213. |> put_req_header("accept", "application/json")
  214. |> post("/api/pleroma/admin/users", %{
  215. "users" => [
  216. %{
  217. "nickname" => "newuser",
  218. "email" => "newuser@pleroma.social",
  219. "password" => "test"
  220. },
  221. %{
  222. "nickname" => "lain",
  223. "email" => user.email,
  224. "password" => "test"
  225. }
  226. ]
  227. })
  228. assert json_response(conn, 409) == [
  229. %{
  230. "code" => 409,
  231. "data" => %{
  232. "email" => user.email,
  233. "nickname" => "lain"
  234. },
  235. "error" => "email has already been taken",
  236. "type" => "error"
  237. },
  238. %{
  239. "code" => 409,
  240. "data" => %{
  241. "email" => "newuser@pleroma.social",
  242. "nickname" => "newuser"
  243. },
  244. "error" => "",
  245. "type" => "error"
  246. }
  247. ]
  248. assert User.get_by_nickname("newuser") === nil
  249. end
  250. end
  251. describe "/api/pleroma/admin/users/:nickname" do
  252. test "Show", %{conn: conn} do
  253. user = insert(:user)
  254. conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}")
  255. assert user_response(user) == json_response(conn, 200)
  256. end
  257. test "when the user doesn't exist", %{conn: conn} do
  258. user = build(:user)
  259. conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}")
  260. assert %{"error" => "Not found"} == json_response(conn, 404)
  261. end
  262. end
  263. describe "/api/pleroma/admin/users/follow" do
  264. test "allows to force-follow another user", %{admin: admin, conn: conn} do
  265. user = insert(:user)
  266. follower = insert(:user)
  267. conn
  268. |> put_req_header("accept", "application/json")
  269. |> post("/api/pleroma/admin/users/follow", %{
  270. "follower" => follower.nickname,
  271. "followed" => user.nickname
  272. })
  273. user = User.get_cached_by_id(user.id)
  274. follower = User.get_cached_by_id(follower.id)
  275. assert User.following?(follower, user)
  276. log_entry = Repo.one(ModerationLog)
  277. assert ModerationLog.get_log_entry_message(log_entry) ==
  278. "@#{admin.nickname} made @#{follower.nickname} follow @#{user.nickname}"
  279. end
  280. end
  281. describe "/api/pleroma/admin/users/unfollow" do
  282. test "allows to force-unfollow another user", %{admin: admin, conn: conn} do
  283. user = insert(:user)
  284. follower = insert(:user)
  285. User.follow(follower, user)
  286. conn
  287. |> put_req_header("accept", "application/json")
  288. |> post("/api/pleroma/admin/users/unfollow", %{
  289. "follower" => follower.nickname,
  290. "followed" => user.nickname
  291. })
  292. user = User.get_cached_by_id(user.id)
  293. follower = User.get_cached_by_id(follower.id)
  294. refute User.following?(follower, user)
  295. log_entry = Repo.one(ModerationLog)
  296. assert ModerationLog.get_log_entry_message(log_entry) ==
  297. "@#{admin.nickname} made @#{follower.nickname} unfollow @#{user.nickname}"
  298. end
  299. end
  300. describe "GET /api/pleroma/admin/users" do
  301. test "renders users array for the first page", %{conn: conn, admin: admin} do
  302. user = insert(:user, local: false, tags: ["foo", "bar"])
  303. user2 = insert(:user, is_approved: false, registration_reason: "I'm a chill dude")
  304. conn = get(conn, "/api/pleroma/admin/users?page=1")
  305. users =
  306. [
  307. user_response(
  308. admin,
  309. %{"roles" => %{"admin" => true, "moderator" => false}}
  310. ),
  311. user_response(user, %{"local" => false, "tags" => ["foo", "bar"]}),
  312. user_response(
  313. user2,
  314. %{
  315. "local" => true,
  316. "is_approved" => false,
  317. "registration_reason" => "I'm a chill dude",
  318. "actor_type" => "Person"
  319. }
  320. )
  321. ]
  322. |> Enum.sort_by(& &1["nickname"])
  323. assert json_response(conn, 200) == %{
  324. "count" => 3,
  325. "page_size" => 50,
  326. "users" => users
  327. }
  328. end
  329. test "pagination works correctly with service users", %{conn: conn} do
  330. service1 = User.get_or_create_service_actor_by_ap_id(Endpoint.url() <> "/meido", "meido")
  331. insert_list(25, :user)
  332. assert %{"count" => 26, "page_size" => 10, "users" => users1} =
  333. conn
  334. |> get("/api/pleroma/admin/users?page=1&filters=", %{page_size: "10"})
  335. |> json_response(200)
  336. assert Enum.count(users1) == 10
  337. assert service1 not in users1
  338. assert %{"count" => 26, "page_size" => 10, "users" => users2} =
  339. conn
  340. |> get("/api/pleroma/admin/users?page=2&filters=", %{page_size: "10"})
  341. |> json_response(200)
  342. assert Enum.count(users2) == 10
  343. assert service1 not in users2
  344. assert %{"count" => 26, "page_size" => 10, "users" => users3} =
  345. conn
  346. |> get("/api/pleroma/admin/users?page=3&filters=", %{page_size: "10"})
  347. |> json_response(200)
  348. assert Enum.count(users3) == 6
  349. assert service1 not in users3
  350. end
  351. test "renders empty array for the second page", %{conn: conn} do
  352. insert(:user)
  353. conn = get(conn, "/api/pleroma/admin/users?page=2")
  354. assert json_response(conn, 200) == %{
  355. "count" => 2,
  356. "page_size" => 50,
  357. "users" => []
  358. }
  359. end
  360. test "regular search", %{conn: conn} do
  361. user = insert(:user, nickname: "bob")
  362. conn = get(conn, "/api/pleroma/admin/users?query=bo")
  363. assert json_response(conn, 200) == %{
  364. "count" => 1,
  365. "page_size" => 50,
  366. "users" => [user_response(user, %{"local" => true})]
  367. }
  368. end
  369. test "search by domain", %{conn: conn} do
  370. user = insert(:user, nickname: "nickname@domain.com")
  371. insert(:user)
  372. conn = get(conn, "/api/pleroma/admin/users?query=domain.com")
  373. assert json_response(conn, 200) == %{
  374. "count" => 1,
  375. "page_size" => 50,
  376. "users" => [user_response(user)]
  377. }
  378. end
  379. test "search by full nickname", %{conn: conn} do
  380. user = insert(:user, nickname: "nickname@domain.com")
  381. insert(:user)
  382. conn = get(conn, "/api/pleroma/admin/users?query=nickname@domain.com")
  383. assert json_response(conn, 200) == %{
  384. "count" => 1,
  385. "page_size" => 50,
  386. "users" => [user_response(user)]
  387. }
  388. end
  389. test "search by display name", %{conn: conn} do
  390. user = insert(:user, name: "Display name")
  391. insert(:user)
  392. conn = get(conn, "/api/pleroma/admin/users?name=display")
  393. assert json_response(conn, 200) == %{
  394. "count" => 1,
  395. "page_size" => 50,
  396. "users" => [user_response(user)]
  397. }
  398. end
  399. test "search by email", %{conn: conn} do
  400. user = insert(:user, email: "email@example.com")
  401. insert(:user)
  402. conn = get(conn, "/api/pleroma/admin/users?email=email@example.com")
  403. assert json_response(conn, 200) == %{
  404. "count" => 1,
  405. "page_size" => 50,
  406. "users" => [user_response(user)]
  407. }
  408. end
  409. test "regular search with page size", %{conn: conn} do
  410. user = insert(:user, nickname: "aalice")
  411. user2 = insert(:user, nickname: "alice")
  412. conn1 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=1")
  413. assert json_response(conn1, 200) == %{
  414. "count" => 2,
  415. "page_size" => 1,
  416. "users" => [user_response(user)]
  417. }
  418. conn2 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=2")
  419. assert json_response(conn2, 200) == %{
  420. "count" => 2,
  421. "page_size" => 1,
  422. "users" => [user_response(user2)]
  423. }
  424. end
  425. test "only local users" do
  426. admin = insert(:user, is_admin: true, nickname: "john")
  427. token = insert(:oauth_admin_token, user: admin)
  428. user = insert(:user, nickname: "bob")
  429. insert(:user, nickname: "bobb", local: false)
  430. conn =
  431. build_conn()
  432. |> assign(:user, admin)
  433. |> assign(:token, token)
  434. |> get("/api/pleroma/admin/users?query=bo&filters=local")
  435. assert json_response(conn, 200) == %{
  436. "count" => 1,
  437. "page_size" => 50,
  438. "users" => [user_response(user)]
  439. }
  440. end
  441. test "only local users with no query", %{conn: conn, admin: old_admin} do
  442. admin = insert(:user, is_admin: true, nickname: "john")
  443. user = insert(:user, nickname: "bob")
  444. insert(:user, nickname: "bobb", local: false)
  445. conn = get(conn, "/api/pleroma/admin/users?filters=local")
  446. users =
  447. [
  448. user_response(user),
  449. user_response(admin, %{
  450. "roles" => %{"admin" => true, "moderator" => false}
  451. }),
  452. user_response(old_admin, %{
  453. "is_active" => true,
  454. "roles" => %{"admin" => true, "moderator" => false}
  455. })
  456. ]
  457. |> Enum.sort_by(& &1["nickname"])
  458. assert json_response(conn, 200) == %{
  459. "count" => 3,
  460. "page_size" => 50,
  461. "users" => users
  462. }
  463. end
  464. test "only unconfirmed users", %{conn: conn} do
  465. sad_user = insert(:user, nickname: "sadboy", is_confirmed: false)
  466. old_user = insert(:user, nickname: "oldboy", is_confirmed: false)
  467. insert(:user, nickname: "happyboy", is_approved: true)
  468. insert(:user, is_confirmed: true)
  469. result =
  470. conn
  471. |> get("/api/pleroma/admin/users?filters=unconfirmed")
  472. |> json_response(200)
  473. users =
  474. Enum.map([old_user, sad_user], fn user ->
  475. user_response(user, %{
  476. "is_confirmed" => false,
  477. "is_approved" => true
  478. })
  479. end)
  480. |> Enum.sort_by(& &1["nickname"])
  481. assert result == %{"count" => 2, "page_size" => 50, "users" => users}
  482. end
  483. test "only unapproved users", %{conn: conn} do
  484. user =
  485. insert(:user,
  486. nickname: "sadboy",
  487. is_approved: false,
  488. registration_reason: "Plz let me in!"
  489. )
  490. insert(:user, nickname: "happyboy", is_approved: true)
  491. conn = get(conn, "/api/pleroma/admin/users?filters=need_approval")
  492. users = [
  493. user_response(
  494. user,
  495. %{"is_approved" => false, "registration_reason" => "Plz let me in!"}
  496. )
  497. ]
  498. assert json_response(conn, 200) == %{
  499. "count" => 1,
  500. "page_size" => 50,
  501. "users" => users
  502. }
  503. end
  504. test "load only admins", %{conn: conn, admin: admin} do
  505. second_admin = insert(:user, is_admin: true)
  506. insert(:user)
  507. insert(:user)
  508. conn = get(conn, "/api/pleroma/admin/users?filters=is_admin")
  509. users =
  510. [
  511. user_response(admin, %{
  512. "is_active" => true,
  513. "roles" => %{"admin" => true, "moderator" => false}
  514. }),
  515. user_response(second_admin, %{
  516. "is_active" => true,
  517. "roles" => %{"admin" => true, "moderator" => false}
  518. })
  519. ]
  520. |> Enum.sort_by(& &1["nickname"])
  521. assert json_response(conn, 200) == %{
  522. "count" => 2,
  523. "page_size" => 50,
  524. "users" => users
  525. }
  526. end
  527. test "load only moderators", %{conn: conn} do
  528. moderator = insert(:user, is_moderator: true)
  529. insert(:user)
  530. insert(:user)
  531. conn = get(conn, "/api/pleroma/admin/users?filters=is_moderator")
  532. assert json_response(conn, 200) == %{
  533. "count" => 1,
  534. "page_size" => 50,
  535. "users" => [
  536. user_response(moderator, %{
  537. "is_active" => true,
  538. "roles" => %{"admin" => false, "moderator" => true}
  539. })
  540. ]
  541. }
  542. end
  543. test "load users with actor_type is Person", %{admin: admin, conn: conn} do
  544. insert(:user, actor_type: "Service")
  545. insert(:user, actor_type: "Application")
  546. user1 = insert(:user)
  547. user2 = insert(:user)
  548. response =
  549. conn
  550. |> get(user_path(conn, :list), %{actor_types: ["Person"]})
  551. |> json_response(200)
  552. users =
  553. [
  554. user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}}),
  555. user_response(user1),
  556. user_response(user2)
  557. ]
  558. |> Enum.sort_by(& &1["nickname"])
  559. assert response == %{"count" => 3, "page_size" => 50, "users" => users}
  560. end
  561. test "load users with actor_type is Person and Service", %{admin: admin, conn: conn} do
  562. user_service = insert(:user, actor_type: "Service")
  563. insert(:user, actor_type: "Application")
  564. user1 = insert(:user)
  565. user2 = insert(:user)
  566. response =
  567. conn
  568. |> get(user_path(conn, :list), %{actor_types: ["Person", "Service"]})
  569. |> json_response(200)
  570. users =
  571. [
  572. user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}}),
  573. user_response(user1),
  574. user_response(user2),
  575. user_response(user_service, %{"actor_type" => "Service"})
  576. ]
  577. |> Enum.sort_by(& &1["nickname"])
  578. assert response == %{"count" => 4, "page_size" => 50, "users" => users}
  579. end
  580. test "load users with actor_type is Service", %{conn: conn} do
  581. user_service = insert(:user, actor_type: "Service")
  582. insert(:user, actor_type: "Application")
  583. insert(:user)
  584. insert(:user)
  585. response =
  586. conn
  587. |> get(user_path(conn, :list), %{actor_types: ["Service"]})
  588. |> json_response(200)
  589. users = [user_response(user_service, %{"actor_type" => "Service"})]
  590. assert response == %{"count" => 1, "page_size" => 50, "users" => users}
  591. end
  592. test "load users with tags list", %{conn: conn} do
  593. user1 = insert(:user, tags: ["first"])
  594. user2 = insert(:user, tags: ["second"])
  595. insert(:user)
  596. insert(:user)
  597. conn = get(conn, "/api/pleroma/admin/users?tags[]=first&tags[]=second")
  598. users =
  599. [
  600. user_response(user1, %{"tags" => ["first"]}),
  601. user_response(user2, %{"tags" => ["second"]})
  602. ]
  603. |> Enum.sort_by(& &1["nickname"])
  604. assert json_response(conn, 200) == %{
  605. "count" => 2,
  606. "page_size" => 50,
  607. "users" => users
  608. }
  609. end
  610. test "`active` filters out users pending approval", %{token: token} do
  611. insert(:user, is_approved: false)
  612. %{id: user_id} = insert(:user, is_approved: true)
  613. %{id: admin_id} = token.user
  614. conn =
  615. build_conn()
  616. |> assign(:user, token.user)
  617. |> assign(:token, token)
  618. |> get("/api/pleroma/admin/users?filters=active")
  619. assert %{
  620. "count" => 2,
  621. "page_size" => 50,
  622. "users" => [
  623. %{"id" => ^admin_id},
  624. %{"id" => ^user_id}
  625. ]
  626. } = json_response(conn, 200)
  627. end
  628. test "it works with multiple filters" do
  629. admin = insert(:user, nickname: "john", is_admin: true)
  630. token = insert(:oauth_admin_token, user: admin)
  631. user = insert(:user, nickname: "bob", local: false, is_active: false)
  632. insert(:user, nickname: "ken", local: true, is_active: false)
  633. insert(:user, nickname: "bobb", local: false, is_active: true)
  634. conn =
  635. build_conn()
  636. |> assign(:user, admin)
  637. |> assign(:token, token)
  638. |> get("/api/pleroma/admin/users?filters=deactivated,external")
  639. assert json_response(conn, 200) == %{
  640. "count" => 1,
  641. "page_size" => 50,
  642. "users" => [user_response(user)]
  643. }
  644. end
  645. test "it omits relay user", %{admin: admin, conn: conn} do
  646. assert %User{} = Relay.get_actor()
  647. conn = get(conn, "/api/pleroma/admin/users")
  648. assert json_response(conn, 200) == %{
  649. "count" => 1,
  650. "page_size" => 50,
  651. "users" => [
  652. user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}})
  653. ]
  654. }
  655. end
  656. end
  657. test "PATCH /api/pleroma/admin/users/activate", %{admin: admin, conn: conn} do
  658. user_one = insert(:user, is_active: false)
  659. user_two = insert(:user, is_active: false)
  660. conn =
  661. patch(
  662. conn,
  663. "/api/pleroma/admin/users/activate",
  664. %{nicknames: [user_one.nickname, user_two.nickname]}
  665. )
  666. response = json_response(conn, 200)
  667. assert Enum.map(response["users"], & &1["is_active"]) == [true, true]
  668. log_entry = Repo.one(ModerationLog)
  669. assert ModerationLog.get_log_entry_message(log_entry) ==
  670. "@#{admin.nickname} activated users: @#{user_one.nickname}, @#{user_two.nickname}"
  671. end
  672. test "PATCH /api/pleroma/admin/users/deactivate", %{admin: admin, conn: conn} do
  673. user_one = insert(:user, is_active: true)
  674. user_two = insert(:user, is_active: true)
  675. conn =
  676. patch(
  677. conn,
  678. "/api/pleroma/admin/users/deactivate",
  679. %{nicknames: [user_one.nickname, user_two.nickname]}
  680. )
  681. response = json_response(conn, 200)
  682. assert Enum.map(response["users"], & &1["is_active"]) == [false, false]
  683. log_entry = Repo.one(ModerationLog)
  684. assert ModerationLog.get_log_entry_message(log_entry) ==
  685. "@#{admin.nickname} deactivated users: @#{user_one.nickname}, @#{user_two.nickname}"
  686. end
  687. test "PATCH /api/pleroma/admin/users/approve", %{admin: admin, conn: conn} do
  688. user_one = insert(:user, is_approved: false)
  689. user_two = insert(:user, is_approved: false)
  690. conn =
  691. patch(
  692. conn,
  693. "/api/pleroma/admin/users/approve",
  694. %{nicknames: [user_one.nickname, user_two.nickname]}
  695. )
  696. response = json_response(conn, 200)
  697. assert Enum.map(response["users"], & &1["is_approved"]) == [true, true]
  698. log_entry = Repo.one(ModerationLog)
  699. assert ModerationLog.get_log_entry_message(log_entry) ==
  700. "@#{admin.nickname} approved users: @#{user_one.nickname}, @#{user_two.nickname}"
  701. end
  702. test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admin, conn: conn} do
  703. user = insert(:user)
  704. conn = patch(conn, "/api/pleroma/admin/users/#{user.nickname}/toggle_activation")
  705. assert json_response(conn, 200) ==
  706. user_response(
  707. user,
  708. %{"is_active" => !user.is_active}
  709. )
  710. log_entry = Repo.one(ModerationLog)
  711. assert ModerationLog.get_log_entry_message(log_entry) ==
  712. "@#{admin.nickname} deactivated users: @#{user.nickname}"
  713. end
  714. defp user_response(user, attrs \\ %{}) do
  715. %{
  716. "is_active" => user.is_active,
  717. "id" => user.id,
  718. "email" => user.email,
  719. "nickname" => user.nickname,
  720. "roles" => %{"admin" => false, "moderator" => false},
  721. "local" => user.local,
  722. "tags" => [],
  723. "avatar" => User.avatar_url(user) |> MediaProxy.url(),
  724. "display_name" => HTML.strip_tags(user.name || user.nickname),
  725. "is_confirmed" => true,
  726. "is_approved" => true,
  727. "url" => user.ap_id,
  728. "registration_reason" => nil,
  729. "actor_type" => "Person"
  730. }
  731. |> Map.merge(attrs)
  732. end
  733. end