#482 Provide better default messages and merge MessagesManager

- Return message from the JAR's messages_en.yml file instead of an unusable error for the end user
- Merge MessagesManager into Messages
This commit is contained in:
ljacqu
2016-02-11 21:27:16 +01:00
parent 2d8a80049b
commit 39168bc818
12 changed files with 271 additions and 135 deletions
@@ -0,0 +1,43 @@
package fr.xephi.authme.output;
import fr.xephi.authme.TestHelper;
import fr.xephi.authme.util.StringUtils;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.junit.Test;
import java.io.File;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
/**
* Tests that the project's default language file contains a text for all message keys.
*/
public class MessagesFileConsistencyTest {
private static final String DEFAULT_MESSAGES_FILE = "/messages/messages_en.yml";
@Test
public void shouldHaveAllMessages() {
File file = TestHelper.getJarFile(DEFAULT_MESSAGES_FILE);
FileConfiguration configuration = YamlConfiguration.loadConfiguration(file);
for (MessageKey messageKey : MessageKey.values()) {
verifyHasMessage(messageKey, configuration);
}
}
private static void verifyHasMessage(MessageKey messageKey, FileConfiguration configuration) {
final String key = messageKey.getKey();
final String message = configuration.getString(key);
assertThat("Default messages file should have message for key '" + key + "'",
StringUtils.isEmpty(message), equalTo(false));
for (String tag : messageKey.getTags()) {
assertThat("The message for key '" + key + "' contains the tag '" + tag + "' in the default messages file",
message.contains(tag), equalTo(true));
}
}
}
@@ -1,6 +1,8 @@
package fr.xephi.authme.output;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.ConsoleLoggerTestInitializer;
import fr.xephi.authme.TestHelper;
import fr.xephi.authme.util.WrapperMock;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -11,11 +13,11 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import java.io.File;
import java.net.URL;
import java.util.logging.Logger;
import static org.hamcrest.Matchers.arrayWithSize;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
@@ -26,7 +28,8 @@ import static org.mockito.Mockito.verify;
*/
public class MessagesIntegrationTest {
private static final String YML_TEST_FILE = "messages_test.yml";
private static final String YML_TEST_FILE = "/messages_test.yml";
private static final String YML_DEFAULT_TEST_FILE = "/messages_default.yml";
private Messages messages;
@BeforeClass
@@ -39,15 +42,15 @@ public class MessagesIntegrationTest {
* Loads the messages in the file {@code messages_test.yml} in the test resources folder.
* The file does not contain all messages defined in {@link MessageKey} and its contents
* reflect various test cases -- not what the keys stand for.
* <p>
* Similarly, the {@code messages_default.yml} from the test resources represents a default
* file that should contain all messages, but again, for testing, it just contains a few.
*/
@Before
public void setUpMessages() {
URL url = getClass().getClassLoader().getResource(YML_TEST_FILE);
if (url == null) {
throw new RuntimeException("File '" + YML_TEST_FILE + "' could not be loaded");
}
messages = new Messages(new File(url.getFile()));
File testFile = TestHelper.getJarFile(YML_TEST_FILE);
File defaultFile = TestHelper.getJarFile(YML_DEFAULT_TEST_FILE);
messages = new Messages(testFile, defaultFile);
}
@Test
@@ -101,20 +104,6 @@ public class MessagesIntegrationTest {
assertThat(message[0], equalTo("Apostrophes ' should be loaded correctly, don't you think?"));
}
@Test
public void shouldReturnErrorForUnknownCode() {
// given
// The following is a key that is not defined in the test file
MessageKey key = MessageKey.UNREGISTERED_SUCCESS;
// when
String[] message = messages.retrieve(key);
// then
assertThat(message, arrayWithSize(1));
assertThat(message[0], startsWith("Error getting message with key '"));
}
@Test
public void shouldSendMessageToPlayer() {
// given
@@ -176,25 +165,88 @@ public class MessagesIntegrationTest {
assertThat(message, equalTo("Use /captcha THE_CAPTCHA to solve the captcha"));
}
@Test(expected = RuntimeException.class)
public void shouldThrowForInvalidReplacementCount() {
@Test
public void shouldLogErrorForInvalidReplacementCount() {
// given
Logger logger = mock(Logger.class);
ConsoleLogger.setLogger(logger);
MessageKey key = MessageKey.CAPTCHA_WRONG_ERROR;
// when
messages.send(mock(CommandSender.class), key, "rep", "rep2");
// then - expect exception
// then
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
verify(logger).warning(captor.capture());
assertThat(captor.getValue(), containsString("Invalid number of replacements"));
}
@Test(expected = RuntimeException.class)
@Test
public void shouldThrowForReplacementsOnKeyWithNoTags() {
// given
Logger logger = mock(Logger.class);
ConsoleLogger.setLogger(logger);
MessageKey key = MessageKey.UNKNOWN_USER;
// when
messages.send(mock(CommandSender.class), key, "Replacement");
// then - expect exception
// then
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
verify(logger).warning(captor.capture());
assertThat(captor.getValue(), containsString("Invalid number of replacements"));
}
@Test
public void shouldGetMessageFromDefaultFile() {
// given
// Key is only present in default file
MessageKey key = MessageKey.MUST_REGISTER_MESSAGE;
// when
String message = messages.retrieveSingle(key);
// then
assertThat(message, equalTo("Message from default file"));
}
@Test
public void shouldNotUseMessageFromDefaultFile() {
// given
// Key is present in both files
MessageKey key = MessageKey.WRONG_PASSWORD;
// when
String message = messages.retrieveSingle(key);
// then
assertThat(message, equalTo("§cWrong password!"));
}
@Test
public void shouldReturnErrorForMissingMessage() {
// given
// Key is not present in test file or default file
MessageKey key = MessageKey.TWO_FACTOR_CREATE;
// when
String message = messages.retrieveSingle(key);
// then
assertThat(message, containsString("Error retrieving message"));
}
@Test
public void shouldAllowNullAsDefaultFile() {
// given
Messages testMessages = new Messages(TestHelper.getJarFile(YML_TEST_FILE), null);
// Key not present in test file
MessageKey key = MessageKey.TWO_FACTOR_CREATE;
// when
String message = testMessages.retrieveSingle(key);
// then
assertThat(message, containsString("Error retrieving message"));
}
}