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