Add import/export command tests.

These are pretty much whitebox tests, so they don't really provide any
improvements to the architecture, but they do add a level of confidence
in terms of refactoring the somewhat unorthodox import/export structure.
This commit is contained in:
Andreas Troelsen
2021-08-06 22:13:14 +02:00
parent 7e08fde493
commit f96c69bb42
2 changed files with 226 additions and 0 deletions
@@ -0,0 +1,79 @@
package org.mobarena.stats.command;
import com.garbagemule.MobArena.Messenger;
import com.garbagemule.MobArena.framework.ArenaMaster;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mobarena.stats.MobArenaStats;
import org.mobarena.stats.store.StatsStore;
import org.mobarena.stats.store.StatsStoreRegistry;
import org.mockito.ArgumentMatchers;
import org.mockito.junit.jupiter.MockitoExtension;
import java.io.IOException;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.*;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
class ExportCommandTest {
MobArenaStats plugin;
ExportCommand subject;
@BeforeEach
void setup() {
plugin = mock(MobArenaStats.class);
subject = new ExportCommand(plugin);
}
@Test
void failure() throws Exception {
ArenaMaster am = mock(ArenaMaster.class);
CommandSender sender = mock(CommandSender.class);
String[] args = {};
Messenger messenger = mock(Messenger.class);
StatsStore source = mock(StatsStore.class);
StatsStore target = mock(StatsStore.class);
StatsStoreRegistry registry = mock(StatsStoreRegistry.class);
when(am.getGlobalMessenger()).thenReturn(messenger);
when(plugin.getStatsStore()).thenReturn(source);
when(plugin.getStatsStoreRegistry()).thenReturn(registry);
when(plugin.getAsyncExecutor()).thenReturn(Runnable::run);
when(registry.create(ArgumentMatchers.any(ConfigurationSection.class))).thenReturn(target);
doThrow(IOException.class).when(source).export(target);
boolean result = subject.execute(am, sender, args);
assertThat(result, equalTo(true));
verify(messenger).tell(eq(sender), contains("Exporting stats"));
verify(messenger).tell(eq(sender), contains("failed"));
}
@Test
void success() throws Exception {
ArenaMaster am = mock(ArenaMaster.class);
CommandSender sender = mock(CommandSender.class);
String[] args = {};
Messenger messenger = mock(Messenger.class);
StatsStore source = mock(StatsStore.class);
StatsStore target = mock(StatsStore.class);
StatsStoreRegistry registry = mock(StatsStoreRegistry.class);
when(am.getGlobalMessenger()).thenReturn(messenger);
when(plugin.getStatsStore()).thenReturn(source);
when(plugin.getStatsStoreRegistry()).thenReturn(registry);
when(plugin.getAsyncExecutor()).thenReturn(Runnable::run);
when(registry.create(ArgumentMatchers.any(ConfigurationSection.class))).thenReturn(target);
boolean result = subject.execute(am, sender, args);
assertThat(result, equalTo(true));
verify(messenger).tell(eq(sender), contains("Exporting stats"));
verify(messenger).tell(eq(sender), contains("complete"));
}
}
@@ -0,0 +1,147 @@
package org.mobarena.stats.command;
import com.garbagemule.MobArena.Messenger;
import com.garbagemule.MobArena.framework.ArenaMaster;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.io.TempDir;
import org.mobarena.stats.MobArenaStats;
import org.mobarena.stats.store.StatsStore;
import org.mobarena.stats.store.StatsStoreRegistry;
import org.mockito.ArgumentMatchers;
import org.mockito.junit.jupiter.MockitoExtension;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.*;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
class ImportCommandTest {
@TempDir
File data;
MobArenaStats plugin;
ImportCommand subject;
@BeforeEach
void setup() {
plugin = mock(MobArenaStats.class);
subject = new ImportCommand(plugin);
}
@Test
void noArgumentsReturnsFalse() {
ArenaMaster am = mock(ArenaMaster.class);
CommandSender sender = mock(CommandSender.class);
String[] args = {};
boolean result = subject.execute(am, sender, args);
assertThat(result, equalTo(false));
}
@Test
void nonExistentSourceFileNoImport() {
String filename = "stats.export-321.db";
ArenaMaster am = mock(ArenaMaster.class);
CommandSender sender = mock(CommandSender.class);
String[] args = {filename};
when(plugin.getDataFolder()).thenReturn(data);
boolean result = subject.execute(am, sender, args);
assertThat(result, equalTo(false));
verify(sender).sendMessage(contains("not found"));
}
@Test
void wrongFilenamePrefixNoImport() throws Exception {
String filename = "stats.db";
Files.createFile(data.toPath().resolve(filename));
ArenaMaster am = mock(ArenaMaster.class);
CommandSender sender = mock(CommandSender.class);
String[] args = {filename};
when(plugin.getDataFolder()).thenReturn(data);
boolean result = subject.execute(am, sender, args);
assertThat(result, equalTo(true));
verify(sender).sendMessage(contains("filename must start with"));
}
@Test
void wrongFilenameSuffixNoImport() throws Exception {
String filename = "stats.export-123.sql";
Files.createFile(data.toPath().resolve(filename));
ArenaMaster am = mock(ArenaMaster.class);
CommandSender sender = mock(CommandSender.class);
String[] args = {filename};
when(plugin.getDataFolder()).thenReturn(data);
boolean result = subject.execute(am, sender, args);
assertThat(result, equalTo(true));
verify(sender).sendMessage(contains("filename must end with"));
}
@Test
void failure() throws Exception {
String filename = "stats.export-123.db";
Files.createFile(data.toPath().resolve(filename));
ArenaMaster am = mock(ArenaMaster.class);
CommandSender sender = mock(CommandSender.class);
String[] args = {filename};
Messenger messenger = mock(Messenger.class);
StatsStore source = mock(StatsStore.class);
StatsStore target = mock(StatsStore.class);
StatsStoreRegistry registry = mock(StatsStoreRegistry.class);
when(am.getGlobalMessenger()).thenReturn(messenger);
when(plugin.getDataFolder()).thenReturn(data);
when(plugin.getStatsStore()).thenReturn(target);
when(plugin.getStatsStoreRegistry()).thenReturn(registry);
when(plugin.getAsyncExecutor()).thenReturn(Runnable::run);
when(registry.create(ArgumentMatchers.any(ConfigurationSection.class))).thenReturn(source);
doThrow(IOException.class).when(source).export(target);
boolean result = subject.execute(am, sender, args);
assertThat(result, equalTo(true));
verify(messenger).tell(eq(sender), contains("Importing stats"));
verify(messenger).tell(eq(sender), contains("failed"));
}
@Test
void success() throws Exception {
String filename = "stats.export-123.db";
Files.createFile(data.toPath().resolve(filename));
ArenaMaster am = mock(ArenaMaster.class);
CommandSender sender = mock(CommandSender.class);
String[] args = {filename};
Messenger messenger = mock(Messenger.class);
StatsStore source = mock(StatsStore.class);
StatsStore target = mock(StatsStore.class);
StatsStoreRegistry registry = mock(StatsStoreRegistry.class);
when(am.getGlobalMessenger()).thenReturn(messenger);
when(plugin.getDataFolder()).thenReturn(data);
when(plugin.getStatsStore()).thenReturn(target);
when(plugin.getStatsStoreRegistry()).thenReturn(registry);
when(plugin.getAsyncExecutor()).thenReturn(Runnable::run);
when(registry.create(ArgumentMatchers.any(ConfigurationSection.class))).thenReturn(source);
boolean result = subject.execute(am, sender, args);
assertThat(result, equalTo(true));
verify(messenger).tell(eq(sender), contains("Importing stats"));
verify(source).export(target);
verify(messenger).tell(eq(sender), contains("complete"));
}
}