455 lines
18 KiB
Java
455 lines
18 KiB
Java
package world.bentobox.bentobox.managers;
|
|
|
|
import static org.junit.Assert.assertEquals;
|
|
import static org.junit.Assert.assertFalse;
|
|
import static org.junit.Assert.assertTrue;
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.ArgumentMatchers.anyString;
|
|
import static org.mockito.Mockito.mock;
|
|
import static org.mockito.Mockito.verify;
|
|
import static org.mockito.Mockito.when;
|
|
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.nio.file.StandardOpenOption;
|
|
import java.util.Comparator;
|
|
import java.util.Optional;
|
|
import java.util.zip.ZipEntry;
|
|
import java.util.zip.ZipOutputStream;
|
|
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.Material;
|
|
import org.bukkit.Server;
|
|
import org.bukkit.block.data.BlockData;
|
|
import org.bukkit.configuration.file.YamlConfiguration;
|
|
import org.junit.After;
|
|
import org.junit.Before;
|
|
import org.junit.Test;
|
|
import org.junit.runner.RunWith;
|
|
import org.mockito.Mock;
|
|
import org.mockito.Mockito;
|
|
import org.powermock.api.mockito.PowerMockito;
|
|
import org.powermock.core.classloader.annotations.PrepareForTest;
|
|
import org.powermock.modules.junit4.PowerMockRunner;
|
|
import org.powermock.reflect.Whitebox;
|
|
|
|
import world.bentobox.bentobox.BentoBox;
|
|
import world.bentobox.bentobox.api.user.User;
|
|
import world.bentobox.bentobox.blueprints.Blueprint;
|
|
import world.bentobox.bentobox.blueprints.BlueprintClipboard;
|
|
import world.bentobox.bentobox.util.Util;
|
|
|
|
|
|
/**
|
|
* @author tastybento
|
|
*
|
|
*/
|
|
@RunWith(PowerMockRunner.class)
|
|
@PrepareForTest( {Bukkit.class, BentoBox.class} )
|
|
public class BlueprintClipboardManagerTest {
|
|
|
|
private static final String BLUEPRINT = "blueprint";
|
|
|
|
@Mock
|
|
private BentoBox plugin;
|
|
@Mock
|
|
private BlueprintClipboard clipboard;
|
|
|
|
private File blueprintFolder;
|
|
|
|
private final String json = "{\n" +
|
|
" \"name\": \"blueprint\",\n" +
|
|
" \"attached\": {},\n" +
|
|
" \"entities\": {},\n" +
|
|
" \"blocks\": [\n" +
|
|
" [\n" +
|
|
" [3.0, -5.0, 8.0], {\n" +
|
|
" \"blockData\": \"minecraft:stone\"\n" +
|
|
" }\n" +
|
|
" ],\n" +
|
|
" [\n" +
|
|
" [6.0, -13.0, -20.0], {\n" +
|
|
" \"blockData\": \"minecraft:diorite\"\n" +
|
|
" }\n" +
|
|
" ]\n" +
|
|
" ],\n" +
|
|
" \"xSize\": 10,\n" +
|
|
" \"ySize\": 10,\n" +
|
|
" \"zSize\": 10,\n" +
|
|
" \"bedrock\": [-2.0, -16.0, -1.0]\n" +
|
|
"}";
|
|
|
|
private final String jsonNoBedrock = "{\n" +
|
|
" \"name\": \"blueprint\",\n" +
|
|
" \"attached\": {},\n" +
|
|
" \"entities\": {},\n" +
|
|
" \"blocks\": [\n" +
|
|
" [\n" +
|
|
" [3.0, -5.0, 8.0], {\n" +
|
|
" \"blockData\": \"minecraft:stone\"\n" +
|
|
" }\n" +
|
|
" ],\n" +
|
|
" [\n" +
|
|
" [6.0, -13.0, -20.0], {\n" +
|
|
" \"blockData\": \"minecraft:diorite\"\n" +
|
|
" }\n" +
|
|
" ]\n" +
|
|
" ],\n" +
|
|
" \"xSize\": 10,\n" +
|
|
" \"ySize\": 10,\n" +
|
|
" \"zSize\": 10\n" +
|
|
"}";
|
|
@Mock
|
|
private Server server;
|
|
|
|
private void zip(File targetFile) throws IOException {
|
|
try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(targetFile.getAbsolutePath() + BlueprintsManager.BLUEPRINT_SUFFIX))) {
|
|
zipOutputStream.putNextEntry(new ZipEntry(targetFile.getName()));
|
|
try (FileInputStream inputStream = new FileInputStream(targetFile)) {
|
|
final byte[] buffer = new byte[1024];
|
|
int length;
|
|
while((length = inputStream.read(buffer)) >= 0) {
|
|
zipOutputStream.write(buffer, 0, length);
|
|
}
|
|
}
|
|
try {
|
|
Files.delete(targetFile.toPath());
|
|
} catch (Exception e) {
|
|
plugin.logError(e.getMessage());
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
*/
|
|
@Before
|
|
public void setUp() throws Exception {
|
|
blueprintFolder = new File("blueprints");
|
|
// Clear any residual files
|
|
tearDown();
|
|
// Set up plugin
|
|
BentoBox plugin = mock(BentoBox.class);
|
|
Whitebox.setInternalState(BentoBox.class, "instance", plugin);
|
|
// Hooks
|
|
HooksManager hooksManager = mock(HooksManager.class);
|
|
when(hooksManager.getHook(anyString())).thenReturn(Optional.empty());
|
|
when(plugin.getHooks()).thenReturn(hooksManager);
|
|
|
|
PowerMockito.mockStatic(Bukkit.class);
|
|
BlockData blockData = mock(BlockData.class);
|
|
when(Bukkit.createBlockData(any(Material.class))).thenReturn(blockData);
|
|
when(blockData.getAsString()).thenReturn("test123");
|
|
when(server.getBukkitVersion()).thenReturn("version");
|
|
when(Bukkit.getServer()).thenReturn(server);
|
|
}
|
|
|
|
/**
|
|
*/
|
|
@After
|
|
public void tearDown() throws Exception {
|
|
|
|
if (blueprintFolder.exists()) {
|
|
// Clean up file system
|
|
Files.walk(blueprintFolder.toPath())
|
|
.sorted(Comparator.reverseOrder())
|
|
.map(Path::toFile)
|
|
.forEach(File::delete);
|
|
}
|
|
Mockito.framework().clearInlineMocks();
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#BlueprintClipboardManager(world.bentobox.bentobox.BentoBox, java.io.File)}.
|
|
*/
|
|
@Test
|
|
public void testBlueprintClipboardManagerBentoBoxFile() {
|
|
new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
assertTrue(blueprintFolder.exists());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#BlueprintClipboardManager(world.bentobox.bentobox.BentoBox, java.io.File, world.bentobox.bentobox.blueprints.BlueprintClipboard)}.
|
|
*/
|
|
@Test
|
|
public void testBlueprintClipboardManagerBentoBoxFileBlueprintClipboard() {
|
|
new BlueprintClipboardManager(plugin, blueprintFolder, clipboard);
|
|
assertTrue(blueprintFolder.exists());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#getClipboard()}.
|
|
*/
|
|
@Test
|
|
public void testGetClipboard() {
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder, clipboard);
|
|
assertEquals(clipboard, bcm.getClipboard());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#loadBlueprint(java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testLoadBlueprintNoSuchFile() {
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
try {
|
|
bcm.loadBlueprint("test");
|
|
} catch (Exception e) {
|
|
assertTrue(e instanceof IOException);
|
|
} finally {
|
|
verify(plugin).logError("Could not load blueprint file - does not exist : test.blu");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#loadBlueprint(java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testLoadBlueprintNoFileInZip() throws IOException {
|
|
blueprintFolder.mkdirs();
|
|
// Make a blueprint file
|
|
YamlConfiguration config = new YamlConfiguration();
|
|
config.set("hello", "this is a test");
|
|
File configFile = new File(blueprintFolder, "blueprint.blu");
|
|
config.save(configFile);
|
|
assertTrue(configFile.exists());
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
try {
|
|
bcm.loadBlueprint(BLUEPRINT);
|
|
} catch (Exception e) {
|
|
assertTrue(e instanceof IOException);
|
|
} finally {
|
|
verify(plugin).logError("Could not load blueprint file - does not exist : blueprint");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#loadBlueprint(java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testLoadBlueprintFileInZipJSONError() throws IOException {
|
|
blueprintFolder.mkdirs();
|
|
// Make a blueprint file
|
|
YamlConfiguration config = new YamlConfiguration();
|
|
config.set("hello", "this is a test");
|
|
File configFile = new File(blueprintFolder, BLUEPRINT);
|
|
config.save(configFile);
|
|
// Zip it
|
|
zip(configFile);
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
try {
|
|
bcm.loadBlueprint(BLUEPRINT);
|
|
} catch (Exception e) {
|
|
assertTrue(e instanceof IOException);
|
|
} finally {
|
|
verify(plugin).logError("Blueprint has JSON error: blueprint.blu");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#loadBlueprint(java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testLoadBlueprintFileInZipNoBedrock() throws IOException {
|
|
blueprintFolder.mkdirs();
|
|
// Make a blueprint file
|
|
File configFile = new File(blueprintFolder, BLUEPRINT);
|
|
Files.writeString(configFile.toPath(), jsonNoBedrock, StandardOpenOption.CREATE);
|
|
// Zip it
|
|
zip(configFile);
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
Blueprint bp = bcm.loadBlueprint(BLUEPRINT);
|
|
verify(plugin).logWarning("Blueprint blueprint.blu had no bedrock block in it so one was added automatically in the center. You should check it.");
|
|
// Verify bedrock was placed in the center of the blueprint
|
|
assertEquals(5, bp.getBedrock().getBlockX());
|
|
assertEquals(5, bp.getBedrock().getBlockY());
|
|
assertEquals(5, bp.getBedrock().getBlockZ());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#loadBlueprint(java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testLoadBlueprintFileInZip() throws IOException {
|
|
blueprintFolder.mkdirs();
|
|
// Make a blueprint file
|
|
File configFile = new File(blueprintFolder, BLUEPRINT);
|
|
Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE);
|
|
// Zip it
|
|
zip(configFile);
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
Blueprint bp = bcm.loadBlueprint(BLUEPRINT);
|
|
assertEquals(-2, bp.getBedrock().getBlockX());
|
|
assertEquals(-16, bp.getBedrock().getBlockY());
|
|
assertEquals(-1, bp.getBedrock().getBlockZ());
|
|
assertTrue(bp.getAttached().isEmpty());
|
|
assertTrue(bp.getEntities().isEmpty());
|
|
assertEquals(2, bp.getBlocks().size());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#load(java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testLoadString() throws IOException {
|
|
blueprintFolder.mkdirs();
|
|
// Make a blueprint file
|
|
File configFile = new File(blueprintFolder, BLUEPRINT);
|
|
Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE);
|
|
// Zip it
|
|
zip(configFile);
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
bcm.load(BLUEPRINT);
|
|
Blueprint bp = bcm.getClipboard().getBlueprint();
|
|
assertEquals(-2, bp.getBedrock().getBlockX());
|
|
assertEquals(-16, bp.getBedrock().getBlockY());
|
|
assertEquals(-1, bp.getBedrock().getBlockZ());
|
|
assertTrue(bp.getAttached().isEmpty());
|
|
assertTrue(bp.getEntities().isEmpty());
|
|
assertEquals(2, bp.getBlocks().size());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#load(world.bentobox.bentobox.api.user.User, java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testLoadUserString() throws IOException {
|
|
blueprintFolder.mkdirs();
|
|
// Make a blueprint file
|
|
File configFile = new File(blueprintFolder, BLUEPRINT);
|
|
Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE);
|
|
// Zip it
|
|
zip(configFile);
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
User user = mock(User.class);
|
|
assertTrue(bcm.load(user, BLUEPRINT));
|
|
verify(user).sendMessage("general.success");
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#load(world.bentobox.bentobox.api.user.User, java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testLoadUserStringFail() throws IOException {
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
User user = mock(User.class);
|
|
assertFalse(bcm.load(user, BLUEPRINT));
|
|
verify(user).sendMessage("commands.admin.blueprint.could-not-load");
|
|
verify(plugin).logError("Could not load blueprint file - does not exist : blueprint.blu");
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#save(world.bentobox.bentobox.api.user.User, java.lang.String, java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testSave() throws IOException {
|
|
// Load a blueprint, then save it
|
|
blueprintFolder.mkdirs();
|
|
// Make a blueprint file
|
|
File configFile = new File(blueprintFolder, BLUEPRINT);
|
|
Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE);
|
|
// Zip it
|
|
zip(configFile);
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
bcm.load(BLUEPRINT);
|
|
User user = mock(User.class);
|
|
assertTrue(bcm.save(user, "test1234", ""));
|
|
File bp = new File(blueprintFolder, "test1234.blu");
|
|
assertTrue(bp.exists());
|
|
verify(user).sendMessage("general.success");
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#save(world.bentobox.bentobox.api.user.User, java.lang.String, java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testSaveBadChars() throws IOException {
|
|
// Load a blueprint, then save it
|
|
blueprintFolder.mkdirs();
|
|
// Make a blueprint file
|
|
File configFile = new File(blueprintFolder, BLUEPRINT);
|
|
Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE);
|
|
// Zip it
|
|
zip(configFile);
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
bcm.load(BLUEPRINT);
|
|
User user = mock(User.class);
|
|
assertTrue(bcm.save(user, Util.sanitizeInput("test.1234/../../film"), ""));
|
|
File bp = new File(blueprintFolder, "test.1234_.._.._film.blu");
|
|
assertTrue(bp.exists());
|
|
verify(user).sendMessage("general.success");
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#save(world.bentobox.bentobox.api.user.User, java.lang.String, java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testSaveForeignChars() throws IOException {
|
|
// Load a blueprint, then save it
|
|
blueprintFolder.mkdirs();
|
|
// Make a blueprint file
|
|
File configFile = new File(blueprintFolder, BLUEPRINT);
|
|
Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE);
|
|
// Zip it
|
|
zip(configFile);
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
bcm.load(BLUEPRINT);
|
|
User user = mock(User.class);
|
|
assertTrue(bcm.save(user, "日本語の言葉", ""));
|
|
File bp = new File(blueprintFolder, "日本語の言葉.blu");
|
|
assertTrue(bp.exists());
|
|
verify(user).sendMessage("general.success");
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#save(world.bentobox.bentobox.api.user.User, java.lang.String, java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testSaveForeignBadChars() throws IOException {
|
|
// Load a blueprint, then save it
|
|
blueprintFolder.mkdirs();
|
|
// Make a blueprint file
|
|
File configFile = new File(blueprintFolder, BLUEPRINT);
|
|
Files.writeString(configFile.toPath(), json, StandardOpenOption.CREATE);
|
|
// Zip it
|
|
zip(configFile);
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
bcm.load(BLUEPRINT);
|
|
User user = mock(User.class);
|
|
|
|
assertTrue(bcm.save(user, Util.sanitizeInput("日本語の言葉/../../../config"), ""));
|
|
File bp = new File(blueprintFolder, "日本語の言葉_.._.._.._config.blu");
|
|
assertTrue(bp.exists());
|
|
verify(user).sendMessage("general.success");
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#saveBlueprint(world.bentobox.bentobox.blueprints.Blueprint)}.
|
|
*/
|
|
@Test
|
|
public void testSaveBlueprintNoName() {
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
Blueprint blueprint = mock(Blueprint.class);
|
|
when(blueprint.getName()).thenReturn("");
|
|
assertFalse(bcm.saveBlueprint(blueprint));
|
|
verify(plugin).logError("Blueprint name was empty - could not save it");
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.BlueprintClipboardManager#saveBlueprint(world.bentobox.bentobox.blueprints.Blueprint)}.
|
|
*/
|
|
@Test
|
|
public void testSaveBlueprintSuccess() {
|
|
BlueprintClipboardManager bcm = new BlueprintClipboardManager(plugin, blueprintFolder);
|
|
Blueprint blueprint = new Blueprint();
|
|
blueprint.setName("test123");
|
|
assertTrue(bcm.saveBlueprint(blueprint));
|
|
File bp = new File(blueprintFolder, "test123.blu");
|
|
assertTrue(bp.exists());
|
|
}
|
|
|
|
}
|