From f96c69bb42620387714f417505ecad68cec4ed7e Mon Sep 17 00:00:00 2001 From: Andreas Troelsen Date: Sun, 1 Aug 2021 22:43:10 +0200 Subject: [PATCH] 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. --- .../stats/command/ExportCommandTest.java | 79 ++++++++++ .../stats/command/ImportCommandTest.java | 147 ++++++++++++++++++ 2 files changed, 226 insertions(+) create mode 100644 src/test/java/org/mobarena/stats/command/ExportCommandTest.java create mode 100644 src/test/java/org/mobarena/stats/command/ImportCommandTest.java diff --git a/src/test/java/org/mobarena/stats/command/ExportCommandTest.java b/src/test/java/org/mobarena/stats/command/ExportCommandTest.java new file mode 100644 index 0000000..3b9800f --- /dev/null +++ b/src/test/java/org/mobarena/stats/command/ExportCommandTest.java @@ -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")); + } + +} diff --git a/src/test/java/org/mobarena/stats/command/ImportCommandTest.java b/src/test/java/org/mobarena/stats/command/ImportCommandTest.java new file mode 100644 index 0000000..d811ff9 --- /dev/null +++ b/src/test/java/org/mobarena/stats/command/ImportCommandTest.java @@ -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")); + } + +}