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());
+ }
+}