package me.gnat008.perworldinventory.data; import ch.jalu.injector.Injector; import ch.jalu.injector.InjectorBuilder; import ch.jalu.injector.testing.InjectDelayed; import com.google.common.io.Files; import me.gnat008.perworldinventory.BukkitService; import me.gnat008.perworldinventory.DataFolder; import me.gnat008.perworldinventory.PerWorldInventory; import me.gnat008.perworldinventory.TestHelper; import me.gnat008.perworldinventory.config.Settings; import me.gnat008.perworldinventory.data.players.PWIPlayer; import me.gnat008.perworldinventory.groups.Group; import org.bukkit.*; import org.bukkit.entity.Player; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import java.io.File; import java.io.IOException; import java.util.UUID; import static me.gnat008.perworldinventory.TestHelper.mockGroup; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; /** * Test for {@link FlatFile} */ @RunWith(MockitoJUnitRunner.class) public class FlatFileTest { private static final UUID UUID_WITH_DATA = UUID.fromString("7f7c909b-24f1-49a4-817f-baa4f4973980"); @InjectDelayed private FlatFile flatFile; @Mock private PerWorldInventory plugin; @Mock private Settings settings; @Mock private BukkitService bukkitService; @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @Before public void setup() throws IOException { File testFolder = temporaryFolder.newFolder(); String userDataPath = "data/7f7c909b-24f1-49a4-817f-baa4f4973980/"; File source = TestHelper.getJarFile(TestHelper.PROJECT_ROOT + userDataPath + "last-logout.json"); File userFolder = new File(testFolder, userDataPath); userFolder.mkdirs(); File destination = new File(userFolder, "last-logout.json"); Files.copy(source, destination); File data = TestHelper.getJarFile(TestHelper.PROJECT_ROOT + userDataPath + "test-group.json"); destination = new File(userFolder, "test-group.json"); Files.copy(data, destination); // Injector is restricted to creating classes only in 'data' package: // ensures that anything else that is required has to be provided explicitly Injector injector = new InjectorBuilder().addDefaultHandlers("me.gnat008.perworldinventory.data").create(); injector.provide(DataFolder.class, testFolder); injector.register(PerWorldInventory.class, plugin); injector.register(Settings.class, settings); injector.register(BukkitService.class, bukkitService); flatFile = injector.getSingleton(FlatFile.class); } @Test public void shouldGetSurvivalFile() { // given Group group = mockGroup("test-group"); GameMode gameMode = GameMode.SURVIVAL; PWIPlayer player = mock(PWIPlayer.class); given(player.getUuid()).willReturn(UUID_WITH_DATA); // when File result = flatFile.getFile(gameMode, group, player.getUuid()); // then assertTrue(result.getName().equals("test-group.json")); } @Test public void shouldGetCreativeFile() { // given Group group = mockGroup("test-group"); GameMode gameMode = GameMode.CREATIVE; PWIPlayer player = mock(PWIPlayer.class); given(player.getUuid()).willReturn(UUID_WITH_DATA); // when File result = flatFile.getFile(gameMode, group, player.getUuid()); // then assertTrue(result.getName().equals("test-group_creative.json")); } @Test public void shouldGetAdventureFile() { // given Group group = mockGroup("test-group"); GameMode gameMode = GameMode.ADVENTURE; PWIPlayer player = mock(PWIPlayer.class); given(player.getUuid()).willReturn(UUID_WITH_DATA); // when File result = flatFile.getFile(gameMode, group, player.getUuid()); // then assertTrue(result.getName().equals("test-group_adventure.json")); } @Test public void shouldGetSpectatorFile() { // given Group group = mockGroup("test-group"); GameMode gameMode = GameMode.SPECTATOR; PWIPlayer player = mock(PWIPlayer.class); given(player.getUuid()).willReturn(UUID_WITH_DATA); // when File result = flatFile.getFile(gameMode, group, player.getUuid()); // then assertTrue(result.getName().equals("test-group_creative.json")); } @Test public void lastLogoutLocationExists() { // given Player player = mock(Player.class); given(player.getUniqueId()).willReturn(UUID_WITH_DATA); World world = mock(World.class); setUpWorldReturnedByBukkit(world); // when Location result = flatFile.getLogoutData(player); // then assertTrue(result != null); assertTrue(result.getWorld().equals(world)); } @Test public void lastLogoutLocationDoesNotExist() { // given Player player = mock(Player.class); UUID randUUID = UUID.randomUUID(); given(player.getUniqueId()).willReturn(randUUID); // when Location result = flatFile.getLogoutData(player); // then assertTrue(result == null); } /** * Sets the {@link Server} field in the Bukkit class with a mock and makes it return * the given World object for {@link Bukkit#getWorld(String)}. */ private static void setUpWorldReturnedByBukkit(World world) { Server server = mock(Server.class); given(server.getWorld(anyString())).willReturn(world); TestHelper.setField(Bukkit.class, "server", null, server); } }