# frozen_string_literal: true
describe ESM::Command::Territory::Remove, category: "command" do
include_context "command"
include_examples "validate_command"
describe "V1" do
describe "#execute" do
include_context "connection_v1"
let(:territory_id) { Faker::Alphanumeric.alphanumeric(number: 3..30) }
context "when the target is a registered user" do
it "removes them from the territory" do
request = execute!(
arguments: {
server_id: server.server_id,
territory_id: territory_id,
target: second_user.mention
}
)
expect(request).not_to be_nil
wait_for { connection.requests }.to be_blank
ESM.discord_bot.test_outbox.await_size(1)
embed = ESM.discord_bot.test_outbox.first.content
expect(embed.description).to match(
/hey #{user.mention}, `#{second_user.steam_uid}` has been removed from territory `#{territory_id}` on `#{server.server_id}`/i
)
end
end
context "when the target is an unregistered user" do
it "raises an exception" do
second_user.update!(steam_uid: "")
execution_args = {
arguments: {
server_id: server.server_id,
territory_id: territory_id,
target: second_user.mention
}
}
expect { execute!(**execution_args) }.to raise_error(ESM::Exception::CheckFailure) do |error|
embed = error.data
expect(embed.description).to match(/has not registered with me yet/i)
end
end
end
context "when the user is an unregistered steam uid" do
it "removes the player from the territory" do
steam_uid = second_user.steam_uid
second_user.update!(steam_uid: "")
request = execute!(
arguments: {
server_id: server.server_id,
territory_id: territory_id,
target: steam_uid
}
)
expect(request).not_to be_nil
wait_for { connection.requests }.to be_blank
ESM.discord_bot.test_outbox.await_size(1)
embed = ESM.discord_bot.test_outbox.first.content
expect(embed.description).to match(
/hey #{user.mention}, `#{steam_uid}` has been removed from territory `#{territory_id}` on `#{server.server_id}`/i
)
end
end
end
end
describe "V2", v2: true do
it "is a player command" do
expect(command.type).to eq(:player)
end
describe "#on_execute", requires_connection: true do
include_context "connection"
let(:target) { second_user.mention }
let(:target_uid) { second_user.steam_uid }
subject(:execute_command) do
execute!(
arguments: {
target:,
territory_id: territory.encoded_id,
server_id: server.server_id
}
)
end
before do
user.exile_account
second_user.exile_account
territory.create_flag
end
shared_examples "succeeds" do
it "removes the target from the territory" do
execute_command
ESM.discord_bot.test_outbox.await_size(2)
# Player response
expect(
ESM.discord_bot.test_outbox.retrieve("`#{target_uid}` has been removed")
).not_to be(nil)
# Admin log
expect(
ESM.discord_bot.test_outbox.retrieve("Player removed Target from territory")
).not_to be(nil)
territory.reload
expect(territory.moderators).not_to include(target_uid)
expect(territory.build_rights).not_to include(target_uid)
end
end
context "when the player is a moderator and they remove another territory member" do
before do
territory.add_moderators!(user.steam_uid, second_user.steam_uid)
end
include_examples "succeeds"
end
context "when the player is a member of the territory and they remove themselves" do
let!(:target) { user.mention }
let!(:target_uid) { user.steam_uid }
before do
territory.add_moderator!(user.steam_uid)
end
include_examples "succeeds"
end
context "when the player is a territory admin and they remove another territory member" do
let!(:territory_admin_uids) { [user.steam_uid] }
before do
expect(territory.moderators).not_to include(user.steam_uid)
territory.add_moderators!(second_user.steam_uid)
end
include_examples "succeeds"
end
context "when the player is a territory admin and they remove themselves" do
let!(:territory_admin_uids) { [user.steam_uid] }
let!(:target) { user.mention }
let!(:target_uid) { user.steam_uid }
include_examples "succeeds"
end
context "when the player is a moderator and they remove another territory member by UID" do
let!(:target) { second_user.steam_uid }
before do
territory.add_moderators!(user.steam_uid, second_user.steam_uid)
end
include_examples "succeeds"
end
context "when logging is enabled" do
before do
territory.add_moderators!(user.steam_uid, second_user.steam_uid)
server.server_setting.update!(logging_remove_player_from_territory: true)
end
include_examples "arma_discord_logging_enabled" do
let(:message) { "`ESMs_command_remove` executed successfully" }
end
end
context "when logging is disabled" do
before do
territory.add_moderators!(user.steam_uid, second_user.steam_uid)
server.server_setting.update!(logging_remove_player_from_territory: false)
end
include_examples "arma_discord_logging_disabled" do
let(:message) { "`ESMs_command_remove` executed successfully" }
end
end
context "when the territory is null" do
before { territory.delete_flag }
include_examples "arma_error_null_flag"
end
context "when the player hasn't joined the server" do
before { user.exile_account.destroy! }
include_examples "arma_error_player_needs_to_join"
end
context "when the target hasn't joined the server" do
before { second_user.exile_account.destroy! }
include_examples "arma_error_target_needs_to_join"
end
context "when the player is not a member of the territory" do
include_examples "arma_error_missing_territory_access"
end
context "when the player is a builder in the territory" do
before { territory.add_builder!(user.steam_uid) }
include_examples "arma_error_missing_territory_access"
end
context "when the target is the owner" do
let!(:target) { territory.owner_uid }
let!(:target_uid) { territory.owner_uid }
before { territory.add_moderators!(user.steam_uid) }
it "raise Remove_CannotRemoveOwner" do
expect { execute_command }.to raise_error(ESM::Exception::ExtensionError) do |error|
expect(error.to_embed.description).to match("you have no power here")
end
end
end
context "when the target is not a member of the territory" do
before { territory.add_moderators!(user.steam_uid) }
it "raise Remove_CannotRemoveNothing" do
expect { execute_command }.to raise_error(ESM::Exception::ExtensionError) do |error|
expect(error.to_embed.description).to match("you can't remove someone you have no power over")
end
end
end
end
end
end