diff --git a/modules/GuildManager/pom.xml b/modules/GuildManager/pom.xml index 4f5f6c8..831c7ba 100644 --- a/modules/GuildManager/pom.xml +++ b/modules/GuildManager/pom.xml @@ -109,8 +109,8 @@ provided - me.clip - placeholderapi + com.github.PlaceholderAPI + PlaceholderAPI 2.11.1 provided @@ -120,6 +120,18 @@ 5.6.0-SNAPSHOT provided + + junit + junit + 4.13.2 + test + + + org.mockito + mockito-core + 4.5.1 + test + diff --git a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/command/GuildCommandS.java b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/command/GuildCommandS.java index c57fbbe..1d1f1cb 100644 --- a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/command/GuildCommandS.java +++ b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/command/GuildCommandS.java @@ -1,5 +1,6 @@ package com.mcatk.guildmanager.command; +import com.mcatk.guildmanager.GuildManager; import com.mcatk.guildmanager.GuildItem; import com.mcatk.guildmanager.Msg; import com.mcatk.guildmanager.exceptions.ParaLengthException; diff --git a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepository.java b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepository.java index abbc2be..5618cc7 100644 --- a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepository.java +++ b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepository.java @@ -181,12 +181,29 @@ public HashMap getAllGuilds() { g.setCash(rs.getInt("guild_cash")); g.setResidenceFLag(rs.getBoolean("guild_has_residence")); g.setHasChangedName(rs.getBoolean("guild_has_changed_name")); - g.setMembers(getMembersFromSQL(g.getId())); guilds.put(g.getId(), g); } } catch (SQLException e) { e.printStackTrace(); } + + try (PreparedStatement ps = getConnection().prepareStatement(SqlCommand.GET_ALL_MEMBERS.toString())) { + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + Member m = new Member( + rs.getString("player_id"), + rs.getString("guild_id"), + rs.getInt("player_contribution"), + rs.getBoolean("player_is_advanced") + ); + Guild g = guilds.get(m.getGuildID()); + if (g != null) { + g.getMembers().add(m); + } + } + } catch (SQLException e) { + e.printStackTrace(); + } return guilds; } diff --git a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/SqlCommand.java b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/SqlCommand.java index ab26869..b6301d5 100644 --- a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/SqlCommand.java +++ b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/SqlCommand.java @@ -38,6 +38,9 @@ public enum SqlCommand { GET_PLAYER( "SELECT * FROM player_guild WHERE player_id = ?" ), + GET_ALL_MEMBERS( + "SELECT * FROM player_guild" + ), GET_ALL_GUILDS( "SELECT * FROM guild" ), diff --git a/modules/GuildManager/src/test/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepositoryTest.java b/modules/GuildManager/src/test/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepositoryTest.java new file mode 100644 index 0000000..1de7994 --- /dev/null +++ b/modules/GuildManager/src/test/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepositoryTest.java @@ -0,0 +1,88 @@ +package com.mcatk.guildmanager.core.repository.jdbc; + +import com.mcatk.guildmanager.core.config.DbConfig; +import com.mcatk.guildmanager.models.Guild; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import java.lang.reflect.Field; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.contains; +import static org.mockito.Mockito.*; + +public class JdbcGuildRepositoryTest { + + private JdbcGuildRepository repository; + private Connection mockConnection; + private ResultSet mockResultSetGuilds; + private ResultSet mockResultSetMembers; + + @Before + public void setUp() throws Exception { + DbConfig config = new DbConfig("localhost", 3306, "test", "user", "pass"); + repository = new JdbcGuildRepository(config); + + mockConnection = mock(Connection.class); + mockResultSetGuilds = mock(ResultSet.class); + mockResultSetMembers = mock(ResultSet.class); + + // Inject mock connection + Field connectionField = JdbcGuildRepository.class.getDeclaredField("connection"); + connectionField.setAccessible(true); + connectionField.set(repository, mockConnection); + + when(mockConnection.isClosed()).thenReturn(false); + } + + @Test + public void testGetAllGuilds_Optimization() throws SQLException { + PreparedStatement psGuilds = mock(PreparedStatement.class); + PreparedStatement psMembers = mock(PreparedStatement.class); + + // Setup mock calls for prepareStatement + when(mockConnection.prepareStatement(contains("FROM guild"))).thenReturn(psGuilds); + // The optimized code fetches all members at once + when(mockConnection.prepareStatement(contains("SELECT * FROM player_guild"))).thenReturn(psMembers); + + when(psGuilds.executeQuery()).thenReturn(mockResultSetGuilds); + when(psMembers.executeQuery()).thenReturn(mockResultSetMembers); + + // Setup 5 guilds + when(mockResultSetGuilds.next()).thenReturn(true, true, true, true, true, false); + when(mockResultSetGuilds.getString("guild_id")).thenReturn("g1", "g2", "g3", "g4", "g5"); + + // Members return nothing for now + when(mockResultSetMembers.next()).thenReturn(true, true, false); + when(mockResultSetMembers.getString("player_id")).thenReturn("player1", "player2"); + when(mockResultSetMembers.getString("guild_id")).thenReturn("g1", "g2"); + when(mockResultSetMembers.getInt("player_contribution")).thenReturn(100, 200); + when(mockResultSetMembers.getBoolean("player_is_advanced")).thenReturn(true, false); + + HashMap result = repository.getAllGuilds(); + + assertEquals(5, result.size()); + + // Verify optimization: + // 1 call for guilds + // 1 call for all members + // Total 2 calls to prepareStatement + verify(mockConnection, times(2)).prepareStatement(anyString()); + + // Verify Data Mapping + assertEquals(1, result.get("g1").getMembers().size()); + assertEquals("player1", result.get("g1").getMembers().get(0).getId()); + + assertEquals(1, result.get("g2").getMembers().size()); + assertEquals("player2", result.get("g2").getMembers().get(0).getId()); + + assertEquals(0, result.get("g3").getMembers().size()); + } +}