Ensure consistent behavior between pleroma.user activate/deactivate mix tasks
authorMark Felder <feld@feld.me>
Mon, 25 Jan 2021 16:48:28 +0000 (10:48 -0600)
committerMark Felder <feld@feld.me>
Mon, 25 Jan 2021 16:48:28 +0000 (10:48 -0600)
lib/mix/tasks/pleroma/user.ex
test/mix/tasks/pleroma/user_test.exs

index bb9a080a4ba91fd8ac3c9497f90967732020b60f..53d5fc6d927799253ee85a98d66e14cbd7a4d610 100644 (file)
@@ -162,17 +162,20 @@ defmodule Mix.Tasks.Pleroma.User do
   def run(["deactivate", nickname]) do
     start_pleroma()
 
-    with %User{} = user <- User.get_cached_by_nickname(nickname) do
-      shell_info("Deactivating #{user.nickname}")
+    with %User{} = user <- User.get_cached_by_nickname(nickname),
+         true <- user.is_active do
       User.set_activation(user, false)
       :timer.sleep(500)
 
       user = User.get_cached_by_id(user.id)
 
       if Enum.empty?(Enum.filter(User.get_friends(user), & &1.local)) do
-        shell_info("Successfully unsubscribed all local followers from #{user.nickname}")
+        shell_info("Successfully deactivated #{nickname} and unsubscribed all local followers")
       end
     else
+      false ->
+        shell_info("User #{nickname} already deactivated")
+
       _ ->
         shell_error("No user #{nickname}")
     end
index 768beb0a6ec981ebd2b0aa4da22a110d53094d0e..a2178bbd1137b965fa089f5b2b3cd6d340865c20 100644 (file)
@@ -158,7 +158,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do
   end
 
   describe "running deactivate" do
-    test "user is unsubscribed" do
+    test "active user is deactivated and unsubscribed" do
       followed = insert(:user)
       remote_followed = insert(:user, local: false)
       user = insert(:user)
@@ -168,18 +168,28 @@ defmodule Mix.Tasks.Pleroma.UserTest do
 
       Mix.Tasks.Pleroma.User.run(["deactivate", user.nickname])
 
-      assert_received {:mix_shell, :info, [message]}
-      assert message =~ "Deactivating"
-
       # Note that the task has delay :timer.sleep(500)
       assert_received {:mix_shell, :info, [message]}
-      assert message =~ "Successfully unsubscribed"
+
+      assert message ==
+               "Successfully deactivated #{user.nickname} and unsubscribed all local followers"
 
       user = User.get_cached_by_nickname(user.nickname)
       assert Enum.empty?(Enum.filter(User.get_friends(user), & &1.local))
       refute user.is_active
     end
 
+    test "user is deactivated" do
+      %{id: id, nickname: nickname} = insert(:user, is_active: false)
+
+      assert :ok = Mix.Tasks.Pleroma.User.run(["deactivate", nickname])
+      assert_received {:mix_shell, :info, [message]}
+      assert message == "User #{nickname} already deactivated"
+
+      user = Repo.get(User, id)
+      refute user.is_active
+    end
+
     test "no user to deactivate" do
       Mix.Tasks.Pleroma.User.run(["deactivate", "nonexistent"])
 
@@ -479,7 +489,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do
       assert user.is_active
     end
 
-    test "it prints an error message when user is not exist" do
+    test "no user to activate" do
       Mix.Tasks.Pleroma.User.run(["activate", "foo"])
 
       assert_received {:mix_shell, :error, [message]}