#306 Add command service and set up constructor dependency injection

(work in progress)
- Pass all dependencies via constructor
- Encapsulate command handling more (e.g. split CommandHandler with new CommandMapper)
- Add help command to all base commands at one central point

See AccountsCommand or HelpCommand for an example of the advantages - all necessary functions come from CommandService; objects aren't retrieved through a singleton getInstance() method anymore
This commit is contained in:
ljacqu
2015-12-23 14:54:45 +01:00
parent f785d9d357
commit 8ef1b2ae3e
14 changed files with 517 additions and 471 deletions
@@ -1,12 +1,14 @@
package fr.xephi.authme.command;
import fr.xephi.authme.command.executable.HelpCommand;
import fr.xephi.authme.output.Messages;
import fr.xephi.authme.permission.DefaultPermission;
import fr.xephi.authme.permission.PermissionsManager;
import fr.xephi.authme.permission.PlayerPermission;
import org.bukkit.command.CommandSender;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
@@ -35,12 +37,12 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
/**
* Test for {@link CommandHandler}.
* Test for {@link CommandMapper}.
*/
public class CommandHandlerTest {
public class CommandMapperTest {
private static Set<CommandDescription> commands;
private static CommandHandler handler;
private static CommandMapper mapper;
private static PermissionsManager permissionsManagerMock;
@BeforeClass
@@ -69,7 +71,7 @@ public class CommandHandlerTest {
@Before
public void setUpMocks() {
permissionsManagerMock = mock(PermissionsManager.class);
handler = new CommandHandler(commands, permissionsManagerMock);
mapper = new CommandMapper(commands, mock(Messages.class), permissionsManagerMock);
}
// -----------
@@ -79,9 +81,11 @@ public class CommandHandlerTest {
public void shouldMapPartsToLoginChildCommand() {
// given
List<String> parts = Arrays.asList("authme", "login", "test1");
CommandSender sender = mock(CommandSender.class);
given(permissionsManagerMock.hasPermission(eq(sender), any(CommandDescription.class))).willReturn(true);
// when
FoundCommandResult result = handler.mapPartsToCommand(parts);
FoundCommandResult result = mapper.mapPartsToCommand(sender, parts);
// then
assertThat(result.getCommandDescription(), equalTo(getChildWithLabel("login", "authme")));
@@ -96,9 +100,11 @@ public class CommandHandlerTest {
public void shouldMapPartsToCommandWithNoCaseSensitivity() {
// given
List<String> parts = Arrays.asList("Authme", "REG", "arg1", "arg2");
CommandSender sender = mock(CommandSender.class);
given(permissionsManagerMock.hasPermission(eq(sender), any(CommandDescription.class))).willReturn(true);
// when
FoundCommandResult result = handler.mapPartsToCommand(parts);
FoundCommandResult result = mapper.mapPartsToCommand(sender, parts);
// then
assertThat(result.getCommandDescription(), equalTo(getChildWithLabel("register", "authme")));
@@ -112,9 +118,11 @@ public class CommandHandlerTest {
public void shouldRejectCommandWithTooManyArguments() {
// given
List<String> parts = Arrays.asList("authme", "register", "pass123", "pass123", "pass123");
CommandSender sender = mock(CommandSender.class);
given(permissionsManagerMock.hasPermission(eq(sender), any(CommandDescription.class))).willReturn(true);
// when
FoundCommandResult result = handler.mapPartsToCommand(parts);
FoundCommandResult result = mapper.mapPartsToCommand(sender, parts);
// then
assertThat(result.getCommandDescription(), equalTo(getChildWithLabel("register", "authme")));
@@ -128,9 +136,11 @@ public class CommandHandlerTest {
public void shouldRejectCommandWithTooFewArguments() {
// given
List<String> parts = Arrays.asList("authme", "Reg");
CommandSender sender = mock(CommandSender.class);
given(permissionsManagerMock.hasPermission(eq(sender), any(CommandDescription.class))).willReturn(true);
// when
FoundCommandResult result = handler.mapPartsToCommand(parts);
FoundCommandResult result = mapper.mapPartsToCommand(sender, parts);
// then
assertThat(result.getCommandDescription(), equalTo(getChildWithLabel("register", "authme")));
@@ -144,9 +154,11 @@ public class CommandHandlerTest {
public void shouldSuggestCommandWithSimilarLabel() {
// given
List<String> parts = Arrays.asList("authme", "reh", "pass123", "pass123");
CommandSender sender = mock(CommandSender.class);
given(permissionsManagerMock.hasPermission(eq(sender), any(CommandDescription.class))).willReturn(true);
// when
FoundCommandResult result = handler.mapPartsToCommand(parts);
FoundCommandResult result = mapper.mapPartsToCommand(sender, parts);
// then
assertThat(result.getCommandDescription(), equalTo(getChildWithLabel("register", "authme")));
@@ -161,9 +173,11 @@ public class CommandHandlerTest {
public void shouldSuggestMostSimilarCommand() {
// given
List<String> parts = Arrays.asList("authme", "asdfawetawty4asdca");
CommandSender sender = mock(CommandSender.class);
given(permissionsManagerMock.hasPermission(eq(sender), any(CommandDescription.class))).willReturn(true);
// when
FoundCommandResult result = handler.mapPartsToCommand(parts);
FoundCommandResult result = mapper.mapPartsToCommand(sender, parts);
// then
assertThat(result.getCommandDescription(), not(nullValue()));
@@ -177,9 +191,11 @@ public class CommandHandlerTest {
public void shouldHandleBaseWithWrongArguments() {
// given
List<String> parts = singletonList("unregister");
CommandSender sender = mock(CommandSender.class);
given(permissionsManagerMock.hasPermission(eq(sender), any(CommandDescription.class))).willReturn(true);
// when
FoundCommandResult result = handler.mapPartsToCommand(parts);
FoundCommandResult result = mapper.mapPartsToCommand(sender, parts);
// then
assertThat(result.getResultStatus(), equalTo(FoundResultStatus.INCORRECT_ARGUMENTS));
@@ -193,9 +209,11 @@ public class CommandHandlerTest {
public void shouldHandleUnknownBase() {
// given
List<String> parts = asList("bogus", "label1", "arg1");
CommandSender sender = mock(CommandSender.class);
given(permissionsManagerMock.hasPermission(eq(sender), any(CommandDescription.class))).willReturn(true);
// when
FoundCommandResult result = handler.mapPartsToCommand(parts);
FoundCommandResult result = mapper.mapPartsToCommand(sender, parts);
// then
assertThat(result.getResultStatus(), equalTo(FoundResultStatus.MISSING_BASE_COMMAND));
@@ -205,7 +223,7 @@ public class CommandHandlerTest {
@Test
public void shouldHandleNullInput() {
// given / when
FoundCommandResult result = handler.mapPartsToCommand(null);
FoundCommandResult result = mapper.mapPartsToCommand(mock(CommandSender.class), null);
// then
assertThat(result.getResultStatus(), equalTo(FoundResultStatus.MISSING_BASE_COMMAND));
@@ -216,9 +234,11 @@ public class CommandHandlerTest {
public void shouldMapToBaseWithProperArguments() {
// given
List<String> parts = asList("Unreg", "player1");
CommandSender sender = mock(CommandSender.class);
given(permissionsManagerMock.hasPermission(eq(sender), any(CommandDescription.class))).willReturn(true);
// when
FoundCommandResult result = handler.mapPartsToCommand(parts);
FoundCommandResult result = mapper.mapPartsToCommand(sender, parts);
// then
assertThat(result.getResultStatus(), equalTo(FoundResultStatus.SUCCESS));
@@ -232,9 +252,11 @@ public class CommandHandlerTest {
public void shouldReturnChildlessBaseCommandWithArgCountError() {
// given
List<String> parts = asList("unregistER", "player1", "wrongArg");
CommandSender sender = mock(CommandSender.class);
given(permissionsManagerMock.hasPermission(eq(sender), any(CommandDescription.class))).willReturn(true);
// when
FoundCommandResult result = handler.mapPartsToCommand(parts);
FoundCommandResult result = mapper.mapPartsToCommand(sender, parts);
// then
assertThat(result.getResultStatus(), equalTo(FoundResultStatus.INCORRECT_ARGUMENTS));
@@ -248,6 +270,7 @@ public class CommandHandlerTest {
// processCommand() tests
// ----------
@Test
@Ignore
public void shouldCallMappedCommandWithArgs() {
// given
String bukkitLabel = "Authme";
@@ -258,11 +281,13 @@ public class CommandHandlerTest {
given(permissionsManagerMock.hasPermission(sender, command)).willReturn(true);
// when
handler.processCommand(sender, bukkitLabel, bukkitArgs);
// FIXME #306 Move to CommandHandler test
// mapper.processCommand(sender, bukkitLabel, bukkitArgs);
// then
ArgumentCaptor<List> argsCaptor = ArgumentCaptor.forClass(List.class);
verify(command.getExecutableCommand()).executeCommand(eq(sender), argsCaptor.capture());
verify(command.getExecutableCommand())
.executeCommand(eq(sender), argsCaptor.capture(), any(CommandService.class));
List<String> argument = argsCaptor.getValue();
assertThat(argument, contains("myPass"));
// Ensure that no error message was issued to the command sender
@@ -270,6 +295,7 @@ public class CommandHandlerTest {
}
@Test
@Ignore
public void shouldNotCallExecutableCommandIfNoPermission() {
// given
String bukkitLabel = "unreg";
@@ -279,13 +305,14 @@ public class CommandHandlerTest {
.willReturn(false);
// when
handler.processCommand(sender, bukkitLabel, bukkitArgs);
// FIXME #306 Move to CommandHandler test
// mapper.processCommand(sender, bukkitLabel, bukkitArgs);
// then
CommandDescription command = getCommandWithLabel("unregister", commands);
verify(permissionsManagerMock).hasPermission(sender, command);
verify(command.getExecutableCommand(), never())
.executeCommand(any(CommandSender.class), anyListOf(String.class));
.executeCommand(any(CommandSender.class), anyListOf(String.class), any(CommandService.class));
ArgumentCaptor<String> messageCaptor = ArgumentCaptor.forClass(String.class);
verify(sender).sendMessage(messageCaptor.capture());
@@ -294,6 +321,7 @@ public class CommandHandlerTest {
}
@Test
@Ignore
public void shouldStripWhitespace() {
// given
String bukkitLabel = "AuthMe";
@@ -304,17 +332,20 @@ public class CommandHandlerTest {
given(permissionsManagerMock.hasPermission(sender, command)).willReturn(true);
// when
handler.processCommand(sender, bukkitLabel, bukkitArgs);
// FIXME #306 Move to CommandHandler test
// mapper.processCommand(sender, bukkitLabel, bukkitArgs);
// then
ArgumentCaptor<List> argsCaptor = ArgumentCaptor.forClass(List.class);
verify(command.getExecutableCommand()).executeCommand(eq(sender), argsCaptor.capture());
verify(command.getExecutableCommand())
.executeCommand(eq(sender), argsCaptor.capture(), any(CommandService.class));
List<String> arguments = argsCaptor.getValue();
assertThat(arguments, contains("testArg"));
verify(sender, never()).sendMessage(anyString());
}
@Test
@Ignore
public void shouldPassCommandPathAsArgumentsToHelpCommand() {
// given
String bukkitLabel = "email";
@@ -325,11 +356,13 @@ public class CommandHandlerTest {
given(permissionsManagerMock.hasPermission(sender, command)).willReturn(true);
// when
handler.processCommand(sender, bukkitLabel, bukkitArgs);
// FIXME #306 Move to CommandHandler test
// mapper.processCommand(sender, bukkitLabel, bukkitArgs);
// then
ArgumentCaptor<List> argsCaptor = ArgumentCaptor.forClass(List.class);
verify(command.getExecutableCommand()).executeCommand(eq(sender), argsCaptor.capture());
verify(command.getExecutableCommand())
.executeCommand(eq(sender), argsCaptor.capture(), any(CommandService.class));
List<String> arguments = argsCaptor.getValue();
assertThat(arguments, contains("email", "arg1"));
}