Merge enum branch into master

This commit is contained in:
ljacqu 2015-11-26 21:45:06 +01:00
commit 93cddb7a5c
21 changed files with 537 additions and 155 deletions

View File

@ -17,7 +17,7 @@ public class AntiBot {
private static final AuthMe plugin = AuthMe.getInstance(); private static final AuthMe plugin = AuthMe.getInstance();
private static final Messages messages = plugin.getMessages(); private static final Messages messages = plugin.getMessages();
private static Wrapper wrapper = new Wrapper(plugin); private static Wrapper wrapper = Wrapper.getInstance();
private static final List<String> antibotPlayers = new ArrayList<>(); private static final List<String> antibotPlayers = new ArrayList<>();
private static AntiBotStatus antiBotStatus = AntiBotStatus.DISABLED; private static AntiBotStatus antiBotStatus = AntiBotStatus.DISABLED;

View File

@ -17,7 +17,7 @@ import java.util.Date;
*/ */
public final class ConsoleLogger { public final class ConsoleLogger {
private static Wrapper wrapper = new Wrapper(AuthMe.getInstance()); private static Wrapper wrapper = Wrapper.getInstance();
private static final DateFormat df = new SimpleDateFormat("[MM-dd HH:mm:ss]"); private static final DateFormat df = new SimpleDateFormat("[MM-dd HH:mm:ss]");
private ConsoleLogger() { private ConsoleLogger() {

View File

@ -226,12 +226,12 @@ public class CommandDescription {
*/ */
public void setLabels(List<String> labels) { public void setLabels(List<String> labels) {
// Check whether the command label list should be cleared // Check whether the command label list should be cleared
if (labels == null) if (labels == null) {
this.labels.clear(); this.labels.clear();
} else {
else
this.labels = labels; this.labels = labels;
} }
}
/** /**
* Set the command label. * Set the command label.
@ -344,7 +344,7 @@ public class CommandDescription {
/** /**
* Get the absolute command label, without a slash. * Get the absolute command label, without a slash.
* *
* @return String * @return the absolute label
*/ */
public String getAbsoluteLabel() { public String getAbsoluteLabel() {
return getAbsoluteLabel(false); return getAbsoluteLabel(false);
@ -364,8 +364,8 @@ public class CommandDescription {
/** /**
* Get the absolute command label. * Get the absolute command label.
* *
* @param includeSlash boolean * @param includeSlash
* @param reference CommandParts * @param reference
* *
* @return Absolute command label. * @return Absolute command label.
*/ */
@ -644,12 +644,12 @@ public class CommandDescription {
*/ */
public void setArguments(List<CommandArgumentDescription> arguments) { public void setArguments(List<CommandArgumentDescription> arguments) {
// Convert null into an empty argument list // Convert null into an empty argument list
if (arguments == null) if (arguments == null) {
this.arguments.clear(); this.arguments.clear();
} else {
else
this.arguments = arguments; this.arguments = arguments;
} }
}
/** /**
* Check whether an argument exists. * Check whether an argument exists.
@ -659,12 +659,7 @@ public class CommandDescription {
* @return True if this argument already exists, false otherwise. * @return True if this argument already exists, false otherwise.
*/ */
public boolean hasArgument(CommandArgumentDescription argument) { public boolean hasArgument(CommandArgumentDescription argument) {
// Make sure the argument is valid return argument != null && arguments.contains(argument);
if (argument == null)
return false;
// Check whether the argument exists, return the result
return this.arguments.contains(argument);
} }
/** /**
@ -881,19 +876,22 @@ public class CommandDescription {
*/ */
public int getSuitableArgumentsDifference(CommandParts commandReference) { public int getSuitableArgumentsDifference(CommandParts commandReference) {
// Make sure the command reference is valid // Make sure the command reference is valid
if (commandReference.getCount() <= 0) if (commandReference.getCount() <= 0) {
return -1; return -1;
}
// Get the remaining command reference element count // Get the remaining command reference element count
int remainingElementCount = commandReference.getCount() - getParentCount() - 1; int remainingElementCount = commandReference.getCount() - getParentCount() - 1;
// Check if there are too less arguments // Check if there are too few arguments
if (getMinimumArguments() > remainingElementCount) if (getMinimumArguments() > remainingElementCount) {
return Math.abs(getMinimumArguments() - remainingElementCount); return Math.abs(getMinimumArguments() - remainingElementCount);
}
// Check if there are too many arguments // Check if there are too many arguments
if (getMaximumArguments() < remainingElementCount && getMaximumArguments() >= 0) if (getMaximumArguments() < remainingElementCount && getMaximumArguments() >= 0) {
return Math.abs(remainingElementCount - getMaximumArguments()); return Math.abs(remainingElementCount - getMaximumArguments());
}
// The arguments seem to be EQUALS, return the result // The arguments seem to be EQUALS, return the result
return 0; return 0;
@ -934,12 +932,14 @@ public class CommandDescription {
*/ */
public boolean isValid() { public boolean isValid() {
// Make sure any command label is set // Make sure any command label is set
if (getLabels().size() == 0) if (getLabels().size() == 0) {
return false; return false;
}
// Make sure the permissions are set up properly // Make sure the permissions are set up properly
if (this.permissions == null) if (this.permissions == null) {
return false; return false;
}
// Everything seems to be correct, return the result // Everything seems to be correct, return the result
return true; return true;

View File

@ -17,6 +17,11 @@ public class ChangePasswordCommand extends ExecutableCommand {
@Override @Override
public boolean executeCommand(CommandSender sender, CommandParts commandReference, CommandParts commandArguments) { public boolean executeCommand(CommandSender sender, CommandParts commandReference, CommandParts commandArguments) {
// Make sure the current command executor is a player
if (!(sender instanceof Player)) {
return true;
}
final AuthMe plugin = AuthMe.getInstance(); final AuthMe plugin = AuthMe.getInstance();
final Messages m = plugin.getMessages(); final Messages m = plugin.getMessages();
@ -24,11 +29,6 @@ public class ChangePasswordCommand extends ExecutableCommand {
String playerPass = commandArguments.get(0); String playerPass = commandArguments.get(0);
String playerPassVerify = commandArguments.get(1); String playerPassVerify = commandArguments.get(1);
// Make sure the current command executor is a player
if (!(sender instanceof Player)) {
return true;
}
// Get the player instance and make sure it's authenticated // Get the player instance and make sure it's authenticated
Player player = (Player) sender; Player player = (Player) sender;
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
@ -38,6 +38,7 @@ public class ChangePasswordCommand extends ExecutableCommand {
} }
// Make sure the password is allowed // Make sure the password is allowed
// TODO ljacqu 20151121: The password confirmation appears to be never verified
String playerPassLowerCase = playerPass.toLowerCase(); String playerPassLowerCase = playerPass.toLowerCase();
if (playerPassLowerCase.contains("delete") || playerPassLowerCase.contains("where") if (playerPassLowerCase.contains("delete") || playerPassLowerCase.contains("where")
|| playerPassLowerCase.contains("insert") || playerPassLowerCase.contains("modify") || playerPassLowerCase.contains("insert") || playerPassLowerCase.contains("modify")
@ -56,12 +57,10 @@ public class ChangePasswordCommand extends ExecutableCommand {
m.send(player, MessageKey.INVALID_PASSWORD_LENGTH); m.send(player, MessageKey.INVALID_PASSWORD_LENGTH);
return true; return true;
} }
if (!Settings.unsafePasswords.isEmpty()) { if (!Settings.unsafePasswords.isEmpty() && Settings.unsafePasswords.contains(playerPassLowerCase)) {
if (Settings.unsafePasswords.contains(playerPassLowerCase)) {
m.send(player, MessageKey.PASSWORD_UNSAFE_ERROR); m.send(player, MessageKey.PASSWORD_UNSAFE_ERROR);
return true; return true;
} }
}
// Set the password // Set the password
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, plugin.getServer().getScheduler().runTaskAsynchronously(plugin,

View File

@ -12,19 +12,19 @@ public class AddEmailCommand extends ExecutableCommand {
@Override @Override
public boolean executeCommand(CommandSender sender, CommandParts commandReference, CommandParts commandArguments) { public boolean executeCommand(CommandSender sender, CommandParts commandReference, CommandParts commandArguments) {
// Get the parameter values
String playerMail = commandArguments.get(0);
String playerMailVerify = commandArguments.get(1);
// Make sure the current command executor is a player // Make sure the current command executor is a player
if (!(sender instanceof Player)) { if (!(sender instanceof Player)) {
return true; return true;
} }
// Get the parameter values
String playerMail = commandArguments.get(0);
String playerMailVerify = commandArguments.get(1);
// Get the player and perform email addition // Get the player and perform email addition
final AuthMe plugin = AuthMe.getInstance(); final AuthMe plugin = AuthMe.getInstance();
final Player player = (Player) sender; final Player player = (Player) sender;
plugin.management.performAddEmail(player, playerMail, playerMailVerify); plugin.getManagement().performAddEmail(player, playerMail, playerMailVerify);
return true; return true;
} }
} }

View File

@ -12,19 +12,19 @@ public class ChangeEmailCommand extends ExecutableCommand {
@Override @Override
public boolean executeCommand(CommandSender sender, CommandParts commandReference, CommandParts commandArguments) { public boolean executeCommand(CommandSender sender, CommandParts commandReference, CommandParts commandArguments) {
// Get the parameter values
String playerMailOld = commandArguments.get(0);
String playerMailNew = commandArguments.get(1);
// Make sure the current command executor is a player // Make sure the current command executor is a player
if (!(sender instanceof Player)) { if (!(sender instanceof Player)) {
return true; return true;
} }
// Get the parameter values
String playerMailOld = commandArguments.get(0);
String playerMailNew = commandArguments.get(1);
// Get the player instance and execute action // Get the player instance and execute action
final AuthMe plugin = AuthMe.getInstance(); final AuthMe plugin = AuthMe.getInstance();
final Player player = (Player) sender; final Player player = (Player) sender;
plugin.management.performChangeEmail(player, playerMailOld, playerMailNew); plugin.getManagement().performChangeEmail(player, playerMailOld, playerMailNew);
return true; return true;
} }
} }

View File

@ -22,14 +22,14 @@ public class RecoverEmailCommand extends ExecutableCommand {
@Override @Override
public boolean executeCommand(CommandSender sender, CommandParts commandReference, CommandParts commandArguments) { public boolean executeCommand(CommandSender sender, CommandParts commandReference, CommandParts commandArguments) {
// Get the parameter values
String playerMail = commandArguments.get(0);
// Make sure the current command executor is a player // Make sure the current command executor is a player
if (!(sender instanceof Player)) { if (!(sender instanceof Player)) {
return true; return true;
} }
// Get the parameter values
String playerMail = commandArguments.get(0);
// Get the player instance and name // Get the player instance and name
final Player player = (Player) sender; final Player player = (Player) sender;
final String playerName = player.getName(); final String playerName = player.getName();

View File

@ -12,8 +12,6 @@ import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitScheduler;
/** /**
* @author Gabriele
* @version $Revision: 1.0 $
*/ */
public class Management { public class Management {
@ -30,13 +28,6 @@ public class Management {
this.sched = this.plugin.getServer().getScheduler(); this.sched = this.plugin.getServer().getScheduler();
} }
/**
* Method performLogin.
*
* @param player Player
* @param password String
* @param forceLogin boolean
*/
public void performLogin(final Player player, final String password, final boolean forceLogin) { public void performLogin(final Player player, final String password, final boolean forceLogin) {
sched.runTaskAsynchronously(plugin, new Runnable() { sched.runTaskAsynchronously(plugin, new Runnable() {
@ -47,11 +38,6 @@ public class Management {
}); });
} }
/**
* Method performLogout.
*
* @param player Player
*/
public void performLogout(final Player player) { public void performLogout(final Player player) {
sched.runTaskAsynchronously(plugin, new Runnable() { sched.runTaskAsynchronously(plugin, new Runnable() {
@ -62,13 +48,6 @@ public class Management {
}); });
} }
/**
* Method performRegister.
*
* @param player Player
* @param password String
* @param email String
*/
public void performRegister(final Player player, final String password, final String email) { public void performRegister(final Player player, final String password, final String email) {
sched.runTaskAsynchronously(plugin, new Runnable() { sched.runTaskAsynchronously(plugin, new Runnable() {
@ -79,13 +58,6 @@ public class Management {
}); });
} }
/**
* Method performUnregister.
*
* @param player Player
* @param password String
* @param force boolean
*/
public void performUnregister(final Player player, final String password, final boolean force) { public void performUnregister(final Player player, final String password, final boolean force) {
sched.runTaskAsynchronously(plugin, new Runnable() { sched.runTaskAsynchronously(plugin, new Runnable() {
@ -96,11 +68,6 @@ public class Management {
}); });
} }
/**
* Method performJoin.
*
* @param player Player
*/
public void performJoin(final Player player) { public void performJoin(final Player player) {
sched.runTaskAsynchronously(plugin, new Runnable() { sched.runTaskAsynchronously(plugin, new Runnable() {
@ -112,12 +79,6 @@ public class Management {
}); });
} }
/**
* Method performQuit.
*
* @param player Player
* @param isKick boolean
*/
public void performQuit(final Player player, final boolean isKick) { public void performQuit(final Player player, final boolean isKick) {
sched.runTaskAsynchronously(plugin, new Runnable() { sched.runTaskAsynchronously(plugin, new Runnable() {
@ -129,13 +90,6 @@ public class Management {
}); });
} }
/**
* Method performAddEmail.
*
* @param player Player
* @param newEmail String
* @param newEmailVerify String
*/
public void performAddEmail(final Player player, final String newEmail, final String newEmailVerify) { public void performAddEmail(final Player player, final String newEmail, final String newEmailVerify) {
sched.runTaskAsynchronously(plugin, new Runnable() { sched.runTaskAsynchronously(plugin, new Runnable() {
@Override @Override
@ -145,13 +99,6 @@ public class Management {
}); });
} }
/**
* Method performChangeEmail.
*
* @param player Player
* @param oldEmail String
* @param newEmail String
*/
public void performChangeEmail(final Player player, final String oldEmail, final String newEmail) { public void performChangeEmail(final Player player, final String oldEmail, final String newEmail) {
sched.runTaskAsynchronously(plugin, new Runnable() { sched.runTaskAsynchronously(plugin, new Runnable() {
@Override @Override

View File

@ -17,7 +17,6 @@ public class GeoLiteAPI {
"available at http://www.maxmind.com"; "available at http://www.maxmind.com";
private static final String GEOIP_URL = "http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry" + private static final String GEOIP_URL = "http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry" +
"/GeoIP.dat.gz"; "/GeoIP.dat.gz";
private static final Wrapper wrapper = new Wrapper(AuthMe.getInstance());
private static final AuthMe plugin = AuthMe.getInstance(); private static final AuthMe plugin = AuthMe.getInstance();
private static LookupService lookupService; private static LookupService lookupService;

View File

@ -10,10 +10,14 @@ import java.io.StringWriter;
/** /**
* Utility class for String operations. * Utility class for String operations.
*/ */
public class StringUtils { public final class StringUtils {
public static final String newline = System.getProperty("line.separator"); public static final String newline = System.getProperty("line.separator");
private StringUtils() {
// Utility class
}
/** /**
* Get the difference of two strings. * Get the difference of two strings.
* *

View File

@ -26,7 +26,7 @@ import java.util.Collections;
*/ */
public final class Utils { public final class Utils {
private static final AuthMe plugin; private static AuthMe plugin;
private static Wrapper wrapper; private static Wrapper wrapper;
private static boolean getOnlinePlayersIsCollection = false; private static boolean getOnlinePlayersIsCollection = false;
@ -34,7 +34,7 @@ public final class Utils {
static { static {
plugin = AuthMe.getInstance(); plugin = AuthMe.getInstance();
wrapper = new Wrapper(plugin); wrapper = Wrapper.getInstance();
initializeOnlinePlayersIsCollectionField(); initializeOnlinePlayersIsCollectionField();
} }
@ -116,9 +116,10 @@ public final class Utils {
// Get the permissions manager, and make sure it's valid // Get the permissions manager, and make sure it's valid
PermissionsManager permsMan = plugin.getPermissionsManager(); PermissionsManager permsMan = plugin.getPermissionsManager();
if (permsMan == null) if (permsMan == null) {
ConsoleLogger.showError("Failed to access permissions manager instance, shutting down."); ConsoleLogger.showError("Failed to access permissions manager instance, aborting.");
assert permsMan != null; return false;
}
// Remove old groups // Remove old groups
permsMan.removeGroups(player, Arrays.asList(Settings.unRegisteredGroup, permsMan.removeGroups(player, Arrays.asList(Settings.unRegisteredGroup,

View File

@ -13,22 +13,31 @@ import java.util.logging.Logger;
*/ */
public class Wrapper { public class Wrapper {
private AuthMe authMe; private static Wrapper singleton;
public Wrapper(AuthMe authMe) { /**
this.authMe = authMe; * Package-private constructor for testing purposes to inject a mock instance.
*/
Wrapper() {
}
public static Wrapper getInstance() {
if (singleton == null) {
singleton = new Wrapper();
}
return singleton;
} }
public AuthMe getAuthMe() { public AuthMe getAuthMe() {
return authMe; return AuthMe.getInstance();
} }
public Server getServer() { public Server getServer() {
return authMe.getServer(); return getAuthMe().getServer();
} }
public Logger getLogger() { public Logger getLogger() {
return authMe.getLogger(); return getAuthMe().getLogger();
} }
public BukkitScheduler getScheduler() { public BukkitScheduler getScheduler() {

View File

@ -1,7 +1,9 @@
package fr.xephi.authme; package fr.xephi.authme;
import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.settings.Messages;
import fr.xephi.authme.util.Wrapper; import fr.xephi.authme.util.Wrapper;
import fr.xephi.authme.util.WrapperMock;
import org.mockito.Mockito; import org.mockito.Mockito;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -34,6 +36,19 @@ public final class AuthMeMockUtil {
mockSingletonForClass(Messages.class, "singleton", mock); mockSingletonForClass(Messages.class, "singleton", mock);
} }
/**
* Creates a mock singleton for the player cache, retrievable from {@link PlayerCache#getInstance()}.
*/
public static void mockPlayerCacheInstance() {
PlayerCache mock = Mockito.mock(PlayerCache.class);
mockSingletonForClass(PlayerCache.class, "singleton", mock);
}
public static void initializeWrapperMock() {
WrapperMock wrapper = new WrapperMock();
mockSingletonForClass(Wrapper.class, "singleton", wrapper);
}
/** /**
* Set the given class' {@link Wrapper} field to a mock implementation. * Set the given class' {@link Wrapper} field to a mock implementation.
* *
@ -50,7 +65,7 @@ public final class AuthMeMockUtil {
} }
public static Wrapper insertMockWrapperInstance(Class<?> clazz, String fieldName, AuthMe authMe) { public static Wrapper insertMockWrapperInstance(Class<?> clazz, String fieldName, AuthMe authMe) {
Wrapper wrapperMock = new WrapperMock(authMe); Wrapper wrapperMock = new WrapperMock();
mockSingletonForClass(clazz, fieldName, wrapperMock); mockSingletonForClass(clazz, fieldName, wrapperMock);
return wrapperMock; return wrapperMock;
} }
@ -69,7 +84,7 @@ public final class AuthMeMockUtil {
* @param fieldName The field name * @param fieldName The field name
* @param mock The mock to set for the given field * @param mock The mock to set for the given field
*/ */
private static void mockSingletonForClass(Class<?> clazz, String fieldName, Object mock) { public static void mockSingletonForClass(Class<?> clazz, String fieldName, Object mock) {
try { try {
Field instance = clazz.getDeclaredField(fieldName); Field instance = clazz.getDeclaredField(fieldName);
instance.setAccessible(true); instance.setAccessible(true);

View File

@ -0,0 +1,41 @@
package fr.xephi.authme.command;
import org.junit.Test;
import java.util.List;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
/**
* Test for {@link CommandManager}.
*/
public class CommandManagerTest {
@Test
public void shouldInitializeCommands() {
// given/when
CommandManager manager = new CommandManager(true);
int commandCount = manager.getCommandDescriptionCount();
List<CommandDescription> commands = manager.getCommandDescriptions();
// then
// It obviously doesn't make sense to test much of the concrete data
// that is being initialized; we just want to guarantee with this test
// that data is indeed being initialized and we take a few "probes"
assertThat(commandCount, equalTo(9));
assertThat(commandsIncludeLabel(commands, "authme"), equalTo(true));
assertThat(commandsIncludeLabel(commands, "register"), equalTo(true));
assertThat(commandsIncludeLabel(commands, "help"), equalTo(false));
}
private static boolean commandsIncludeLabel(Iterable<CommandDescription> commands, String label) {
for (CommandDescription command : commands) {
if (command.getLabels().contains(label)) {
return true;
}
}
return false;
}
}

View File

@ -0,0 +1,166 @@
package fr.xephi.authme.command.executable.changepassword;
import fr.xephi.authme.AuthMeMockUtil;
import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.settings.Messages;
import fr.xephi.authme.settings.Settings;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Test for {@link ChangePasswordCommand}.
*/
public class ChangePasswordCommandTest {
private Messages messagesMock;
private PlayerCache cacheMock;
@Before
public void setUpMocks() {
AuthMeMockUtil.mockAuthMeInstance();
AuthMeMockUtil.mockPlayerCacheInstance();
cacheMock = PlayerCache.getInstance();
AuthMeMockUtil.mockMessagesInstance();
messagesMock = Messages.getInstance();
// Only allow passwords with alphanumerical characters for the test
Settings.getPassRegex = "[a-zA-Z0-9]+";
Settings.getPasswordMinLen = 2;
Settings.passwordMaxLength = 50;
// TODO ljacqu 20151121: Cannot mock getServer() as it's final
// Probably the Command class should delegate as the others do
/*
Server server = Mockito.mock(Server.class);
schedulerMock = Mockito.mock(BukkitScheduler.class);
Mockito.when(server.getScheduler()).thenReturn(schedulerMock);
Mockito.when(pluginMock.getServer()).thenReturn(server);
*/
}
@Test
public void shouldRejectNonPlayerSender() {
// given
CommandSender sender = mock(BlockCommandSender.class);
ChangePasswordCommand command = new ChangePasswordCommand();
CommandParts arguments = mock(CommandParts.class);
// when
command.executeCommand(sender, new CommandParts(), arguments);
// then
verify(arguments, never()).get(anyInt());
//verify(pluginMock, never()).getServer();
}
@Test
public void shouldRejectNotLoggedInPlayer() {
// given
CommandSender sender = initPlayerWithName("name", false);
ChangePasswordCommand command = new ChangePasswordCommand();
// when
command.executeCommand(sender, new CommandParts(), new CommandParts("pass"));
// then
verify(messagesMock).send(sender, "not_logged_in");
//verify(pluginMock, never()).getServer();
}
@Test
public void shouldDenyInvalidPassword() {
// given
CommandSender sender = initPlayerWithName("name", true);
ChangePasswordCommand command = new ChangePasswordCommand();
// when
command.executeCommand(sender, new CommandParts(), new CommandParts("!pass"));
// then
verify(messagesMock).send(sender, "password_error");
//verify(pluginMock, never()).getServer();
}
@Test
public void shouldRejectPasswordEqualToNick() {
// given
CommandSender sender = initPlayerWithName("tester", true);
ChangePasswordCommand command = new ChangePasswordCommand();
// when
command.executeCommand(sender, new CommandParts(), new CommandParts("Tester"));
// then
verify(messagesMock).send(sender, "password_error_nick");
//verify(pluginMock, never()).getServer();
}
@Test
public void shouldRejectTooLongPassword() {
// given
CommandSender sender = initPlayerWithName("abc12", true);
ChangePasswordCommand command = new ChangePasswordCommand();
Settings.passwordMaxLength = 3;
// when
command.executeCommand(sender, new CommandParts(), new CommandParts("test"));
// then
verify(messagesMock).send(sender, "pass_len");
//verify(pluginMock, never()).getServer();
}
@Test
public void shouldRejectTooShortPassword() {
// given
CommandSender sender = initPlayerWithName("abc12", true);
ChangePasswordCommand command = new ChangePasswordCommand();
Settings.getPasswordMinLen = 7;
// when
command.executeCommand(sender, new CommandParts(), new CommandParts("tester"));
// then
verify(messagesMock).send(sender, "pass_len");
//verify(pluginMock, never()).getServer();
}
@Test
public void shouldRejectUnsafeCustomPassword() {
// given
CommandSender sender = initPlayerWithName("player", true);
ChangePasswordCommand command = new ChangePasswordCommand();
Settings.unsafePasswords = Arrays.asList("test", "abc123");
// when
command.executeCommand(sender, new CommandParts(), new CommandParts("abc123"));
// then
verify(messagesMock).send(sender, "password_error_unsafe");
//verify(pluginMock, never()).getServer();
}
private Player initPlayerWithName(String name, boolean loggedIn) {
Player player = mock(Player.class);
when(player.getName()).thenReturn(name);
when(cacheMock.isAuthenticated(name)).thenReturn(loggedIn);
return player;
}
}

View File

@ -0,0 +1,63 @@
package fr.xephi.authme.command.executable.email;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.AuthMeMockUtil;
import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.process.Management;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import java.util.Arrays;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Test for {@link AddEmailCommand}.
*/
public class AddEmailCommandTest {
private AuthMe authMeMock;
private Management managementMock;
@Before
public void setUpMocks() {
AuthMeMockUtil.mockAuthMeInstance();
authMeMock = AuthMe.getInstance();
managementMock = Mockito.mock(Management.class);
when(authMeMock.getManagement()).thenReturn(managementMock);
}
@Test
public void shouldRejectNonPlayerSender() {
// given
CommandSender sender = Mockito.mock(BlockCommandSender.class);
AddEmailCommand command = new AddEmailCommand();
// when
command.executeCommand(sender, new CommandParts(), new CommandParts());
// then
verify(authMeMock, never()).getManagement();
}
@Test
public void shouldForwardData() {
// given
Player sender = Mockito.mock(Player.class);
AddEmailCommand command = new AddEmailCommand();
// when
command.executeCommand(sender, new CommandParts(),
new CommandParts(Arrays.asList("mail@example", "other_example")));
// then
verify(authMeMock).getManagement();
verify(managementMock).performAddEmail(sender, "mail@example", "other_example");
}
}

View File

@ -0,0 +1,63 @@
package fr.xephi.authme.command.executable.email;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.AuthMeMockUtil;
import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.process.Management;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import java.util.Arrays;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Test for {@link ChangeEmailCommand}.
*/
public class ChangeEmailCommandTest {
private AuthMe authMeMock;
private Management managementMock;
@Before
public void setUpMocks() {
AuthMeMockUtil.mockAuthMeInstance();
authMeMock = AuthMe.getInstance();
managementMock = Mockito.mock(Management.class);
when(authMeMock.getManagement()).thenReturn(managementMock);
}
@Test
public void shouldRejectNonPlayerSender() {
// given
CommandSender sender = Mockito.mock(BlockCommandSender.class);
ChangeEmailCommand command = new ChangeEmailCommand();
// when
command.executeCommand(sender, new CommandParts(), new CommandParts());
// then
verify(authMeMock, never()).getManagement();
}
@Test
public void shouldForwardData() {
// given
Player sender = Mockito.mock(Player.class);
ChangeEmailCommand command = new ChangeEmailCommand();
// when
command.executeCommand(sender, new CommandParts(),
new CommandParts(Arrays.asList("new.mail@example.org", "old_mail@example.org")));
// then
verify(authMeMock).getManagement();
verify(managementMock).performChangeEmail(sender, "new.mail@example.org", "old_mail@example.org");
}
}

View File

@ -0,0 +1,36 @@
package fr.xephi.authme.command.executable.email;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.AuthMeMockUtil;
import fr.xephi.authme.command.CommandParts;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.CommandSender;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
/**
* Test for {@link RecoverEmailCommand}.
*/
public class RecoverEmailCommandTest {
@Before
public void setUpMocks() {
AuthMeMockUtil.mockAuthMeInstance();
}
@Test
public void shouldRejectNonPlayerSender() {
// given
CommandSender sender = Mockito.mock(BlockCommandSender.class);
RecoverEmailCommand command = new RecoverEmailCommand();
// when
command.executeCommand(sender, new CommandParts(), new CommandParts());
// then
}
// TODO ljacqu 20151121: Expand tests. This command doesn't use a scheduler and has all of its
// logic inside here.
}

View File

@ -6,7 +6,9 @@ import java.net.MalformedURLException;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.stringContainsInOrder;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@ -97,4 +99,32 @@ public class StringUtilsTest {
// then // then
assertThat(result, equalTo("[MalformedURLException]: Unrecognized URL format")); assertThat(result, equalTo("[MalformedURLException]: Unrecognized URL format"));
} }
@Test
public void shouldPrintStackTrace() {
// given
MalformedURLException ex = new MalformedURLException("Unrecognized URL format");
// when
String result = StringUtils.getStackTrace(ex);
// then
assertThat(result, stringContainsInOrder(getClass().getName()));
}
@Test
public void shouldGetDifferenceWithNullString() {
// given/when/then
assertThat(StringUtils.getDifference(null, "test"), equalTo(1.0));
assertThat(StringUtils.getDifference("test", null), equalTo(1.0));
assertThat(StringUtils.getDifference(null, null), equalTo(1.0));
}
@Test
public void shouldGetDifferenceBetweenTwoString() {
// given/when/then
assertThat(StringUtils.getDifference("test", "taste"), equalTo(0.4));
assertThat(StringUtils.getDifference("test", "bear"), equalTo(0.75));
assertThat(StringUtils.getDifference("test", "something"), greaterThan(0.88));
}
} }

View File

@ -2,63 +2,44 @@ package fr.xephi.authme.util;
import fr.xephi.authme.AuthMe; import fr.xephi.authme.AuthMe;
import fr.xephi.authme.AuthMeMockUtil; import fr.xephi.authme.AuthMeMockUtil;
import fr.xephi.authme.WrapperMock; import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.permission.PermissionsManager; import fr.xephi.authme.permission.PermissionsManager;
import org.bukkit.Server; import fr.xephi.authme.settings.Settings;
import org.bukkit.GameMode;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scheduler.BukkitTask;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Collection; import java.util.Collection;
import java.util.logging.Logger;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.any; import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.*;
import static org.mockito.Mockito.when;
/** /**
* Test for the {@link Utils} class. * Test for the {@link Utils} class.
*/ */
@Ignore
// TODO ljacqu 20151123: Fix test setup
public class UtilsTest { public class UtilsTest {
private AuthMe authMeMock; private AuthMe authMeMock;
private PermissionsManager permissionsManagerMock; private PermissionsManager permissionsManagerMock;
private Wrapper wrapperMock;
@Before @Before
public void setUpMocks() { public void setUpMocks() {
authMeMock = AuthMeMockUtil.mockAuthMeInstance(); authMeMock = AuthMeMockUtil.mockAuthMeInstance();
AuthMeMockUtil.mockSingletonForClass(Utils.class, "plugin", authMeMock);
// We need to create the Wrapper mock before injecting it into Utils because it runs a lot of code in permissionsManagerMock = Mockito.mock(PermissionsManager.class);
// a static block which needs the proper mocks to be set up.
wrapperMock = new WrapperMock(authMeMock);
Server serverMock = wrapperMock.getServer();
BukkitScheduler schedulerMock = mock(BukkitScheduler.class);
when(serverMock.getScheduler()).thenReturn(schedulerMock);
when(schedulerMock.runTaskAsynchronously(any(Plugin.class), any(Runnable.class)))
.thenReturn(mock(BukkitTask.class));
System.out.println("Initialized scheduler mock for server mock");
AuthMeMockUtil.insertMockWrapperInstance(Utils.class, "wrapper", (WrapperMock) wrapperMock);
System.out.println("Iniadfk");
permissionsManagerMock = mock(PermissionsManager.class);
when(authMeMock.getPermissionsManager()).thenReturn(permissionsManagerMock); when(authMeMock.getPermissionsManager()).thenReturn(permissionsManagerMock);
AuthMeMockUtil.initializeWrapperMock();
} }
// TODO ljacques 20151122: The tests for Utils.forceGM somehow can't be set up with the mocks correctly @Test
/*@Test
public void shouldForceSurvivalGameMode() { public void shouldForceSurvivalGameMode() {
// given // given
Player player = mock(Player.class); Player player = mock(Player.class);
@ -68,6 +49,7 @@ public class UtilsTest {
Utils.forceGM(player); Utils.forceGM(player);
// then // then
verify(authMeMock).getPermissionsManager();
verify(player).setGameMode(GameMode.SURVIVAL); verify(player).setGameMode(GameMode.SURVIVAL);
} }
@ -84,10 +66,40 @@ public class UtilsTest {
verify(authMeMock).getPermissionsManager(); verify(authMeMock).getPermissionsManager();
verify(permissionsManagerMock).hasPermission(player, "authme.bypassforcesurvival"); verify(permissionsManagerMock).hasPermission(player, "authme.bypassforcesurvival");
verify(player, never()).setGameMode(any(GameMode.class)); verify(player, never()).setGameMode(any(GameMode.class));
}*/ }
@Test @Test
// Note ljacqu 20151122: This is a heavy test setup with Reflections... If it causes trouble, skip it with @Ignore public void shouldNotAddToNormalGroupIfPermissionsAreDisabled() {
// given
Settings.isPermissionCheckEnabled = false;
Player player = mock(Player.class);
// when
boolean result = Utils.addNormal(player, "test_group");
// then
assertThat(result, equalTo(false));
verify(authMeMock, never()).getPermissionsManager();
}
@Test
public void shouldNotAddToNormalGroupIfPermManagerIsNull() {
// given
Settings.isPermissionCheckEnabled = true;
given(authMeMock.getPermissionsManager()).willReturn(null);
Player player = mock(Player.class);
AuthMeMockUtil.mockSingletonForClass(ConsoleLogger.class, "wrapper", Wrapper.getInstance());
// when
boolean result = Utils.addNormal(player, "test_group");
// then
assertThat(result, equalTo(false));
verify(authMeMock).getPermissionsManager();
}
@Test
// Note ljacqu 20151122: This is a heavy test setup with reflections... If it causes trouble, skip it with @Ignore
public void shouldRetrieveListOfOnlinePlayersFromReflectedMethod() { public void shouldRetrieveListOfOnlinePlayersFromReflectedMethod() {
// given // given
setField("getOnlinePlayersIsCollection", false); setField("getOnlinePlayersIsCollection", false);
@ -114,6 +126,7 @@ public class UtilsTest {
} }
} }
// Note: This method is used through reflections
public static Player[] onlinePlayersImpl() { public static Player[] onlinePlayersImpl() {
return new Player[]{ return new Player[]{
mock(Player.class), mock(Player.class) mock(Player.class), mock(Player.class)

View File

@ -1,6 +1,6 @@
package fr.xephi.authme; package fr.xephi.authme.util;
import fr.xephi.authme.util.Wrapper; import fr.xephi.authme.AuthMe;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitScheduler;
import org.mockito.Mockito; import org.mockito.Mockito;
@ -19,11 +19,7 @@ public class WrapperMock extends Wrapper {
private static Map<Class<?>, Object> mocks = new HashMap<>(); private static Map<Class<?>, Object> mocks = new HashMap<>();
public WrapperMock() { public WrapperMock() {
this((AuthMe) getMock(AuthMe.class)); super();
}
public WrapperMock(AuthMe authMe) {
super(authMe);
} }
@Override @Override