diff --git a/modules/Gem/pom.xml b/modules/Gem/pom.xml index 6476837..eaa98ad 100644 --- a/modules/Gem/pom.xml +++ b/modules/Gem/pom.xml @@ -64,7 +64,7 @@ placeholderapi - https://repo.extendedclip.com/content/repositories/placeholderapi/ + https://repo.helpch.at/releases/ @@ -78,8 +78,38 @@ me.clip placeholderapi - 2.11.1 + 2.11.5 provided + + junit + junit + 4.13.2 + test + + + org.mockito + mockito-core + 5.2.0 + test + + + org.mockito + mockito-inline + 5.2.0 + test + + + net.bytebuddy + byte-buddy + 1.14.19 + test + + + net.bytebuddy + byte-buddy-agent + 1.14.19 + test + diff --git a/modules/Gem/src/main/java/com/mcatk/gem/GemExecutor.java b/modules/Gem/src/main/java/com/mcatk/gem/GemExecutor.java index 0fe8194..30f9dc6 100644 --- a/modules/Gem/src/main/java/com/mcatk/gem/GemExecutor.java +++ b/modules/Gem/src/main/java/com/mcatk/gem/GemExecutor.java @@ -44,7 +44,7 @@ public Integer getTotalGems(String name) { public void addGems(String name, int addGems) { Integer gems = MySQLManager.getInstance().getGems(name); - if (MySQLManager.getInstance().getGems(name) == null) { + if (gems == null) { MySQLManager.getInstance().insertData(name); gems = 0; } diff --git a/modules/Gem/src/test/java/com/mcatk/gem/GemExecutorTest.java b/modules/Gem/src/test/java/com/mcatk/gem/GemExecutorTest.java new file mode 100644 index 0000000..330152c --- /dev/null +++ b/modules/Gem/src/test/java/com/mcatk/gem/GemExecutorTest.java @@ -0,0 +1,79 @@ +package com.mcatk.gem; + +import com.mcatk.gem.sql.MySQLManager; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import java.lang.reflect.Field; +import java.util.logging.Logger; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class GemExecutorTest { + + @Mock + private MySQLManager mySQLManagerMock; + + @Mock + private Gem gemMock; + + private GemExecutor gemExecutor; + + @Before + public void setUp() throws Exception { + // Mock MySQLManager.instance + setStaticField(MySQLManager.class, "instance", mySQLManagerMock); + + // Mock Gem.plugin + setStaticField(Gem.class, "plugin", gemMock); + + gemExecutor = new GemExecutor(); + } + + @After + public void tearDown() throws Exception { + setStaticField(MySQLManager.class, "instance", null); + setStaticField(Gem.class, "plugin", null); + } + + private void setStaticField(Class clazz, String fieldName, Object value) throws Exception { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + field.set(null, value); + } + + @Test + public void testAddGems_Performance() { + String playerName = "TestPlayer"; + int gemsToAdd = 100; + + // Simulate new user: getGems returns null + when(mySQLManagerMock.getGems(playerName)).thenReturn(null); + + // Mock getTotal to return a value (e.g. 0) + when(mySQLManagerMock.getTotal(playerName)).thenReturn(0); + + gemExecutor.addGems(playerName, gemsToAdd); + + // Verify getGems is called exactly ONCE (target behavior) + verify(mySQLManagerMock, times(1)).getGems(playerName); + + // Verify insertData is called + verify(mySQLManagerMock).insertData(playerName); + + // Verify update calls + verify(mySQLManagerMock).setGems(eq(playerName), eq(gemsToAdd)); + verify(mySQLManagerMock).setTotal(eq(playerName), eq(gemsToAdd)); + + // Verify log + verify(gemMock).log(anyString()); + } +}