mobilizon.chapril.org-mobil.../test/tasks/actors/delete_test.exs
Thomas Citharel 5bc63185fd
Add a CLI command to delete actors
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2022-05-09 18:27:51 +02:00

179 lines
5.8 KiB
Elixir

defmodule Mix.Tasks.Mobilizon.Actors.DeleteTest do
use Mobilizon.DataCase
import Mobilizon.Factory
alias Mix.Tasks.Mobilizon.Actors.Delete
alias Mobilizon.Actors
alias Mobilizon.Actors.Actor
alias Mobilizon.Federation.ActivityPub.Relay
alias Mobilizon.Users.User
Mix.shell(Mix.Shell.Process)
@preferred_username "toto"
@name "Léo Pandaï"
describe "delete local profile" do
setup do
%User{} = user = insert(:user)
%Actor{} =
profile = insert(:actor, user: user, preferred_username: @preferred_username, name: @name)
{:ok, user: user, profile: profile}
end
test "delete when username isn't set" do
Delete.run([])
# Debug message
assert_received {:mix_shell, :error, [message]}
assert message =~
"mobilizon.actors.delete requires an username or a federated username as argument"
end
test "delete when no actor can't be found" do
Delete.run(["other_one"])
# Debug message
assert_received {:mix_shell, :error, [message]}
assert message =~
"No actor found with this username"
end
test "delete with -y", %{profile: profile} do
Delete.run([@preferred_username, "-y"])
assert_received {:mix_shell, :info, [message]}
refute_received {:mix_shell, :yes?}
assert message =~
"The actor #{Actor.display_name_and_username(profile)} has been deleted"
assert nil == Actors.get_actor_by_name(@preferred_username)
end
test "delete while accepting", %{profile: profile} do
display_name = Actor.display_name_and_username(profile)
send(self(), {:mix_shell_input, :yes?, true})
send(self(), {:mix_shell_input, :yes?, true})
Delete.run([@preferred_username])
assert_received {:mix_shell, :yes?, [input]}
assert input ==
"All content by this profile or group will be deleted. Continue with deleting #{display_name}?"
assert_received {:mix_shell, :yes?, [input2]}
assert input2 ==
"This profile is the only one user #{profile.user.email} has. Mobilizon will invite the user to create a new profile on their next login. If you want to remove the whole user account, use the `mobilizon.users.delete` command. Continue deleting?"
assert_received {:mix_shell, :info, [message2]}
assert message2 =~ "The actor #{display_name} has been deleted"
assert nil == Actors.get_actor_by_name(@preferred_username)
end
end
describe "delete group" do
@group_username "already_there"
@profile_username "theo"
setup do
group = insert(:group, preferred_username: @group_username)
profile = insert(:actor, preferred_username: @profile_username)
insert(:member, parent: group, actor: profile, role: :administrator)
insert(:member, parent: group, role: :member)
{:ok, group: group, profile: profile}
end
test "when everything is accepted", %{group: group} do
display_name = Actor.display_name_and_username(group)
send(self(), {:mix_shell_input, :yes?, true})
send(self(), {:mix_shell_input, :yes?, true})
Delete.run([@group_username])
assert_received {:mix_shell, :yes?, [input]}
assert input ==
"All content by this profile or group will be deleted. Continue with deleting #{display_name}?"
assert_received {:mix_shell, :yes?, [input2]}
assert input2 == "Group #{display_name} has 2 members and 0 followers. Continue deleting?"
assert_received {:mix_shell, :info, [message]}
assert message =~ "Group members will be notified of the group deletion."
assert_received {:mix_shell, :info, [message2]}
assert message2 =~ "The actor #{display_name} has been deleted"
assert nil == Actors.get_actor_by_name(@preferred_username)
end
test "when something is rejected", %{group: group} do
display_name = Actor.display_name_and_username(group)
send(self(), {:mix_shell_input, :yes?, false})
Delete.run([@group_username])
assert_received {:mix_shell, :yes?, [input]}
assert input ==
"All content by this profile or group will be deleted. Continue with deleting #{display_name}?"
assert_received {:mix_shell, :error, [message]}
assert message =~ "Actor has not been deleted."
assert nil == Actors.get_actor_by_name(@preferred_username)
end
test "with assume_yes option", %{group: group} do
display_name = Actor.display_name_and_username(group)
Delete.run([@group_username, "-y"])
refute_received {:mix_shell, :yes?}
assert_received {:mix_shell, :info, [message]}
assert message =~ "Group members will be notified of the group deletion."
assert_received {:mix_shell, :info, [message2]}
assert message2 =~ "The actor #{display_name} has been deleted"
assert nil == Actors.get_actor_by_name(@preferred_username)
end
test "fails when called for an internal actor" do
Relay.get_actor()
Delete.run(["relay", "-y"])
assert_received {:mix_shell, :error, [message]}
assert message =~ "This actor can't be deleted."
end
end
describe "delete something else" do
@actor_username "whatever"
setup do
actor = insert(:actor, preferred_username: @actor_username, type: :Application)
{:ok, actor: actor}
end
test "fails", %{actor: actor} do
display_name = Actor.display_name_and_username(actor)
send(self(), {:mix_shell_input, :yes?, true})
Delete.run([@actor_username])
assert_received {:mix_shell, :yes?, [input]}
assert input ==
"All content by this profile or group will be deleted. Continue with deleting #{display_name}?"
assert_received {:mix_shell, :error, [message2]}
assert message2 =~ "Actor has not been deleted."
end
end
end