From b842531c3f5308746e72433e8a56861068eaefec Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 2 Dec 2023 13:21:49 -0800 Subject: [PATCH] Added tests. --- .../managers/StoneGeneratorManager.java | 37 ++++++---- .../managers/StoneGeneratorManagerTest.java | 70 ++++++++++++------- 2 files changed, 69 insertions(+), 38 deletions(-) diff --git a/src/main/java/world/bentobox/magiccobblestonegenerator/managers/StoneGeneratorManager.java b/src/main/java/world/bentobox/magiccobblestonegenerator/managers/StoneGeneratorManager.java index 63dfe42..ec5681e 100644 --- a/src/main/java/world/bentobox/magiccobblestonegenerator/managers/StoneGeneratorManager.java +++ b/src/main/java/world/bentobox/magiccobblestonegenerator/managers/StoneGeneratorManager.java @@ -7,7 +7,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -203,36 +202,48 @@ private boolean loadGeneratorData(GeneratorDataObject generatorData) { * This method allows to store single generatorTier object. * * @param generatorTier object that must be saved in database. + * @return CompletableFuture to indicate if it is done */ - public void saveGeneratorTier(GeneratorTierObject generatorTier) { - this.generatorTierDatabase.saveObjectAsync(generatorTier); + public CompletableFuture saveGeneratorTier(GeneratorTierObject generatorTier) { + return this.generatorTierDatabase.saveObjectAsync(generatorTier); } /** * This method allows to store single generatorBundle object. * * @param generatorBundle object that must be saved in database. + * @return CompletableFuture to indicate if it is done */ - public void saveGeneratorBundle(GeneratorBundleObject generatorBundle) { - this.generatorBundleDatabase.saveObjectAsync(generatorBundle); + public CompletableFuture saveGeneratorBundle(GeneratorBundleObject generatorBundle) { + return this.generatorBundleDatabase.saveObjectAsync(generatorBundle); } /** * This method allows to store single generatorData object. * * @param generatorData object that must be saved in database. + * @return CompletableFuture to indicate if it is done */ - public void saveGeneratorData(GeneratorDataObject generatorData) { - this.generatorDataDatabase.saveObjectAsync(generatorData); + public CompletableFuture saveGeneratorData(GeneratorDataObject generatorData) { + return this.generatorDataDatabase.saveObjectAsync(generatorData); } /** * Save generator tiers from cache into database + * + * @return CompletableFuture to indicate if it is done */ - public void save() { - this.generatorTierCache.values().forEach(this::saveGeneratorTier); - this.generatorBundleCache.values().forEach(this::saveGeneratorBundle); - this.generatorDataCache.values().forEach(this::saveGeneratorData); + public CompletableFuture save() { + List> futures = this.generatorTierCache.values().stream() + .map(this::saveGeneratorTier).collect(Collectors.toList()); + futures.addAll(this.generatorBundleCache.values().stream().map(this::saveGeneratorBundle) + .collect(Collectors.toList())); + futures.addAll( + this.generatorDataCache.values().stream().map(this::saveGeneratorData).collect(Collectors.toList())); + + return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).thenApply(v -> + // Return true if all futures completed successfully + futures.stream().allMatch(CompletableFuture::join)); } /** @@ -242,7 +253,7 @@ public void save() { * @param gameMode GameMode addon which generators must be removed. */ public void wipeGameModeGenerators(GameModeAddon gameMode) { - final String objectKey = gameMode.getDescription().getName().toLowerCase(Locale.ENGLISH); + final String objectKey = gameMode.getDescription().getName().toLowerCase(); // Collect all generators List keySet = new ArrayList<>(this.generatorTierCache.keySet()); @@ -842,7 +853,6 @@ public void checkGeneratorUnlockStatus(Island island, @Nullable User user, @Null // If level is null, check value from addon. final long islandLevel = level == null ? this.getIslandLevel(island) : level; final User owner = island.isSpawn() ? null : User.getInstance(island.getOwner()); - this.getIslandGeneratorTiers(island.getWorld(), dataObject).stream(). // Filter out default generators. They are always unlocked and active. filter(generator -> !generator.isDefaultGenerator()). @@ -914,7 +924,6 @@ public void unlockGenerator(@NotNull GeneratorDataObject dataObject, @Nullable U } return; } - // Create and call bukkit event to check if unlocking should be cancelled. GeneratorUnlockEvent event = new GeneratorUnlockEvent(generator, user, island); Bukkit.getPluginManager().callEvent(event); diff --git a/src/test/java/world/bentobox/magiccobblestonegenerator/managers/StoneGeneratorManagerTest.java b/src/test/java/world/bentobox/magiccobblestonegenerator/managers/StoneGeneratorManagerTest.java index 34ae944..9dd3440 100644 --- a/src/test/java/world/bentobox/magiccobblestonegenerator/managers/StoneGeneratorManagerTest.java +++ b/src/test/java/world/bentobox/magiccobblestonegenerator/managers/StoneGeneratorManagerTest.java @@ -9,6 +9,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -19,6 +20,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Comparator; +import java.util.Optional; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.logging.Logger; @@ -27,6 +29,7 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; +import org.bukkit.plugin.PluginManager; import org.jetbrains.annotations.Nullable; import org.junit.After; import org.junit.Before; @@ -98,6 +101,8 @@ public class StoneGeneratorManagerTest { private IslandsManager im; @Mock private IslandWorldManager iwm; + @Mock + private PluginManager pim; @SuppressWarnings("unchecked") @BeforeClass @@ -179,10 +184,16 @@ public void setUp() throws Exception { when(addon.getDescription()).thenReturn(desc); when(gameModeAddon.getDescription()).thenReturn(desc); + // Island + when(island.getOwner()).thenReturn(uuid); + // Island manager + when(im.getIsland(world, uuid)).thenReturn(island); when(addon.getIslands()).thenReturn(im); // IWM + when(iwm.getAddon(world)).thenReturn(Optional.of(gameModeAddon)); + when(iwm.getPermissionPrefix(any())).thenReturn("bskyblock."); when(plugin.getIWM()).thenReturn(iwm); // Location @@ -192,6 +203,11 @@ public void setUp() throws Exception { RanksManager rm = new RanksManager(); when(plugin.getRanksManager()).thenReturn(rm); + // Bukkit + PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); + when(Bukkit.getPlayer(uuid)).thenReturn(p); + when(Bukkit.getPluginManager()).thenReturn(pim); + sgm = new StoneGeneratorManager(addon); // Addon Manager @@ -350,7 +366,8 @@ public void testLoadGeneratorBundleOverwritePass() { */ @Test public void testSaveGeneratorTier() { - sgm.saveGeneratorTier(generatorTier); + CompletableFuture cf = sgm.saveGeneratorTier(generatorTier); + assertTrue(cf.isDone()); } /** @@ -359,7 +376,8 @@ public void testSaveGeneratorTier() { */ @Test public void testSaveGeneratorBundle() { - sgm.saveGeneratorBundle(generatorBundle); + CompletableFuture cf = sgm.saveGeneratorBundle(generatorBundle); + assertTrue(cf.isDone()); } /** @@ -368,7 +386,8 @@ public void testSaveGeneratorBundle() { */ @Test public void testSaveGeneratorData() { - sgm.saveGeneratorData(generatorData); + CompletableFuture cf = sgm.saveGeneratorData(generatorData); + assertTrue(cf.isDone()); } /** @@ -377,7 +396,8 @@ public void testSaveGeneratorData() { */ @Test public void testSave() { - sgm.save(); + CompletableFuture cf = sgm.save(); + assertTrue(cf.isDone()); } /** @@ -387,6 +407,8 @@ public void testSave() { @Test public void testWipeGameModeGenerators() { sgm.wipeGameModeGenerators(gameModeAddon); + verify(addon).log("All generators for magiccobblegenerator are removed!"); + verify(addon).log("All bundles for magiccobblegenerator are removed!"); } /** @@ -396,6 +418,7 @@ public void testWipeGameModeGenerators() { @Test public void testWipeIslandData() { sgm.wipeIslandData(gameModeAddon); + verify(addon).log("All island data for MagicCobbleGenerator are removed!"); } /** @@ -405,6 +428,7 @@ public void testWipeIslandData() { @Test public void testWipeGeneratorTier() { sgm.wipeGeneratorTier(generatorTier); + // Does not seem testable... } /** @@ -485,7 +509,9 @@ public void testGetBundleById() { */ @Test public void testWipeBundle() { + sgm.loadGeneratorBundle(generatorBundle, false, user); sgm.wipeBundle(generatorBundle); + verify(h).deleteID(uuid.toString()); } /** @@ -494,7 +520,9 @@ public void testWipeBundle() { */ @Test public void testLoadUserIslands() { + sgm.addWorld(world); sgm.loadUserIslands(uuid); + verify(island, times(18)).getOwner(); } /** @@ -503,7 +531,10 @@ public void testLoadUserIslands() { */ @Test public void testValidateIslandData() { - assertNull(sgm.validateIslandData(island)); + sgm.addWorld(world); + @Nullable + GeneratorDataObject gdo = sgm.validateIslandData(island); + assertNotNull(gdo); } /** @@ -513,6 +544,7 @@ public void testValidateIslandData() { @Test public void testCheckGeneratorUnlockStatus() { sgm.checkGeneratorUnlockStatus(island, user, 10L); + verify(island, times(2)).isSpawn(); } /** @@ -540,6 +572,8 @@ public void testGetGeneratorDataUserWorld() { @Test public void testUnlockGenerator() { sgm.unlockGenerator(generatorData, user, island, generatorTier); + verify(user).sendMessage( + "stone-generator.conversations.prefixstone-generator.messages.generator-cannot-be-unlocked"); } /** @@ -548,7 +582,7 @@ public void testUnlockGenerator() { */ @Test public void testDeactivateGenerator() { - sgm.deactivateGenerator(user, generatorData, generatorTier); + assertFalse(sgm.deactivateGenerator(user, generatorData, generatorTier)); } /** @@ -567,6 +601,7 @@ public void testCanActivateGenerator() { @Test public void testActivateGeneratorUserIslandGeneratorDataObjectGeneratorTierObject() { sgm.activateGenerator(user, island, generatorData, generatorTier); + // TODO: add a test } /** @@ -575,16 +610,8 @@ public void testActivateGeneratorUserIslandGeneratorDataObjectGeneratorTierObjec */ @Test public void testActivateGeneratorUserIslandGeneratorDataObjectGeneratorTierObjectBoolean() { - sgm.activateGenerator(user, island, generatorData, generatorTier, false); - } - - /** - * Test method for - * {@link world.bentobox.magiccobblestonegenerator.managers.StoneGeneratorManager#activateGenerator(world.bentobox.bentobox.api.user.User, world.bentobox.bentobox.database.objects.Island, world.bentobox.magiccobblestonegenerator.database.objects.GeneratorDataObject, world.bentobox.magiccobblestonegenerator.database.objects.GeneratorTierObject, boolean)}. - */ - @Test - public void testActivateGeneratorUserIslandGeneratorDataObjectGeneratorTierObjectBooleanBypass() { sgm.activateGenerator(user, island, generatorData, generatorTier, true); + // TODO: add a test } /** @@ -603,6 +630,7 @@ public void testCanPurchaseGenerator() { @Test public void testPurchaseGeneratorUserIslandGeneratorDataObjectGeneratorTierObject() { sgm.purchaseGenerator(user, island, generatorData, generatorTier); + // TODO: add a test } /** @@ -611,16 +639,8 @@ public void testPurchaseGeneratorUserIslandGeneratorDataObjectGeneratorTierObjec */ @Test public void testPurchaseGeneratorUserIslandGeneratorDataObjectGeneratorTierObjectBoolean() { - sgm.purchaseGenerator(user, island, generatorData, generatorTier, false); - } - - /** - * Test method for - * {@link world.bentobox.magiccobblestonegenerator.managers.StoneGeneratorManager#purchaseGenerator(world.bentobox.bentobox.api.user.User, world.bentobox.bentobox.database.objects.Island, world.bentobox.magiccobblestonegenerator.database.objects.GeneratorDataObject, world.bentobox.magiccobblestonegenerator.database.objects.GeneratorTierObject, boolean)}. - */ - @Test - public void testPurchaseGeneratorUserIslandGeneratorDataObjectGeneratorTierObjectBooleanBypass() { sgm.purchaseGenerator(user, island, generatorData, generatorTier, true); + // TODO: add a test } /** @@ -630,6 +650,7 @@ public void testPurchaseGeneratorUserIslandGeneratorDataObjectGeneratorTierObjec @Test public void testWipeGeneratorDataString() { sgm.wipeGeneratorData(uuid.toString()); + // TODO: add a test } /** @@ -639,6 +660,7 @@ public void testWipeGeneratorDataString() { @Test public void testWipeGeneratorDataGeneratorDataObject() { sgm.wipeGeneratorData(generatorData); + // TODO: add a test } /**