From 760b01dfb2313268e96018512486476c5703dd1b Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 18 Mar 2019 01:21:39 +0300 Subject: [PATCH] test PlayerStatsMapper --- .../java/ru/prisonlife/api/PrisonAPI.java | 3 +- .../api/store/DailyRespectTaskEntity.java | 9 + .../api/store/PlayerStatsEntity.java | 9 + .../ru/prisonlife/api/store/SQLStore.java | 3 +- .../ru/prisonlife/api/template/Prisoner.java | 37 ++-- src/main/resources/config.yml | 1 + .../api/store/PlayerStatsMapper.xml | 11 +- .../ru/prisonlife/api/store/config.xml | 2 +- .../api/store/PlayerStatsMapperTest.java | 205 ++++++++++++++++++ .../ru/prisonlife/api/store/SQLStoreTest.java | 5 +- 10 files changed, 261 insertions(+), 24 deletions(-) create mode 100644 src/test/java/ru/prisonlife/api/store/PlayerStatsMapperTest.java diff --git a/src/main/java/ru/prisonlife/api/PrisonAPI.java b/src/main/java/ru/prisonlife/api/PrisonAPI.java index f5dc00c..6797258 100644 --- a/src/main/java/ru/prisonlife/api/PrisonAPI.java +++ b/src/main/java/ru/prisonlife/api/PrisonAPI.java @@ -44,10 +44,11 @@ public class PrisonAPI extends JavaPlugin { public void onEnable() { saveDefaultConfig(); + final String dbDriver = getConfig().getString("database.driver"); final String dbUrl = getConfig().getString("database.url"); final String dbUser = getConfig().getString("database.user"); final String dbPasswd = getConfig().getString("database.password"); - sqlStore = new SQLStore(dbUrl, dbUser, dbPasswd); + sqlStore = new SQLStore(dbDriver, dbUrl, dbUser, dbPasswd); } } diff --git a/src/main/java/ru/prisonlife/api/store/DailyRespectTaskEntity.java b/src/main/java/ru/prisonlife/api/store/DailyRespectTaskEntity.java index d598a58..a3c7a66 100644 --- a/src/main/java/ru/prisonlife/api/store/DailyRespectTaskEntity.java +++ b/src/main/java/ru/prisonlife/api/store/DailyRespectTaskEntity.java @@ -4,6 +4,7 @@ import java.util.Objects; public class DailyRespectTaskEntity { + private String name; private String uuid; private Integer cooldownRespect; @@ -35,4 +36,12 @@ public class DailyRespectTaskEntity { public int hashCode() { return Objects.hash(getUuid()); } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } } diff --git a/src/main/java/ru/prisonlife/api/store/PlayerStatsEntity.java b/src/main/java/ru/prisonlife/api/store/PlayerStatsEntity.java index ffcf6e6..ce6003d 100644 --- a/src/main/java/ru/prisonlife/api/store/PlayerStatsEntity.java +++ b/src/main/java/ru/prisonlife/api/store/PlayerStatsEntity.java @@ -5,6 +5,7 @@ import java.util.Objects; public class PlayerStatsEntity { private String uuid; + private String name; private Integer wallet; private Integer faction; private Integer rang; @@ -143,4 +144,12 @@ public class PlayerStatsEntity { public void setSuspect(Integer suspect) { this.suspect = suspect; } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } } diff --git a/src/main/java/ru/prisonlife/api/store/SQLStore.java b/src/main/java/ru/prisonlife/api/store/SQLStore.java index be2c810..4729ebb 100644 --- a/src/main/java/ru/prisonlife/api/store/SQLStore.java +++ b/src/main/java/ru/prisonlife/api/store/SQLStore.java @@ -10,8 +10,9 @@ public class SQLStore { private SqlSessionFactory sqlSessionFactory; - public SQLStore(String url, String user, String password) { + public SQLStore(String driver, String url, String user, String password) { Properties properties = new Properties(); + properties.put("driver", driver); properties.put("url", url); properties.put("user", user); properties.put("password", password); diff --git a/src/main/java/ru/prisonlife/api/template/Prisoner.java b/src/main/java/ru/prisonlife/api/template/Prisoner.java index 850ec5c..25c13be 100644 --- a/src/main/java/ru/prisonlife/api/template/Prisoner.java +++ b/src/main/java/ru/prisonlife/api/template/Prisoner.java @@ -1,6 +1,5 @@ package ru.prisonlife.api.template; -import com.google.common.collect.ImmutableMap; import org.apache.ibatis.session.SqlSession; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -8,11 +7,12 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import ru.prisonlife.api.PrisonAPI; +import ru.prisonlife.api.store.DailyRespectTaskEntity; +import ru.prisonlife.api.store.PlayerStatsEntity; import ru.prisonlife.api.store.PlayersInCagesEntity; import java.io.File; import java.lang.ref.WeakReference; -import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -165,22 +165,12 @@ public class Prisoner extends AbstractApiData { return stats; } - public void register() throws SQLException { + public void register() { try (SqlSession sqlSession = getSqlStore().openSession()) { Integer result = sqlSession.selectOne("PlayerStats.countByUuid", getPlayer().getUniqueId().toString()); if (result == null || result == 0) { - sqlSession.insert("PlayerStats.register", ImmutableMap.builder() - .put("name", getPlayer().getName()) - .put("uuid", getPlayer().getUniqueId().toString()) - .build() - ); - - sqlSession.insert("DailyRespectTask.register", ImmutableMap.builder() - .put("name", getPlayer().getName()) - .put("uuid", getPlayer().getUniqueId().toString()) - .put("cooldown", 3600 * 24) - .build() - ); + registerPlayerStats(sqlSession); + registerDailyRespectTask(sqlSession); level = new Level(this); stats = new Stats(this); @@ -189,6 +179,23 @@ public class Prisoner extends AbstractApiData { } } + private void registerPlayerStats(SqlSession sqlSession) { + final PlayerStatsEntity entity = new PlayerStatsEntity(); + entity.setName(getPlayer().getName()); + entity.setUuid(getPlayer().getUniqueId().toString()); + + sqlSession.insert("PlayerStats.register", entity); + } + + private void registerDailyRespectTask(SqlSession sqlSession) { + final DailyRespectTaskEntity entity = new DailyRespectTaskEntity(); + entity.setName(getPlayer().getName()); + entity.setUuid(getPlayer().getUniqueId().toString()); + entity.setCooldownRespect(3600 * 24); + + sqlSession.insert("DailyRespectTask.register", entity); + } + private PlayersInCagesEntity getPlayersInCagesEntity() { PlayersInCagesEntity entity; if (refPlayersInCagesEntity != null) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index b8b244a..aff8fe7 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,4 +1,5 @@ database: + driver: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/prison4life user: root password: root \ No newline at end of file diff --git a/src/main/resources/ru/prisonlife/api/store/PlayerStatsMapper.xml b/src/main/resources/ru/prisonlife/api/store/PlayerStatsMapper.xml index 85ed322..f121207 100644 --- a/src/main/resources/ru/prisonlife/api/store/PlayerStatsMapper.xml +++ b/src/main/resources/ru/prisonlife/api/store/PlayerStatsMapper.xml @@ -3,6 +3,7 @@ + @@ -27,9 +28,9 @@ SELECT COUNT(*) FROM player_stats WHERE UUID = #{id} - - INSERT INTO player_stats (NAME, UUID, LEVEL, POINTS, FACTION, RESPECT, F_RANG, SUSPECT, WALLET, G_TIME, D_BLOCKS, K_PLAYERS, K_MOBS, DEATHS) - VALUES (#{name}, #{uuid}, 1, 0, 'NONE', 0, 0, 0, 0, 0, 0, 0, 0, 0) + + INSERT INTO player_stats (NAME, UUID, LEVEL, POINTS, FACTION, RESPECT, F_RANG, SUSPECT, WALLET, G_TIME, D_BLOCKS, K_PLAYERS, K_MOBS, DEATHS, COOLDOWN) + VALUES (#{name}, #{uuid}, #{level}, #{points}, #{faction}, #{respect}, #{rang}, #{suspect}, #{wallet}, #{serverTime}, #{blocks}, #{players}, #{mobs}, #{deaths}, #{cooldownRespect}) @@ -45,7 +46,9 @@ D_BLOCKS = #{blocks}, K_PLAYERS = #{players}, K_MOBS = #{mobs}, - DEATHS = #{deaths} + DEATHS = #{deaths}, + NAME = #{name}, + SUSPECT = #{suspect} WHERE UUID = #{uuid}; diff --git a/src/main/resources/ru/prisonlife/api/store/config.xml b/src/main/resources/ru/prisonlife/api/store/config.xml index ebf567a..e04816d 100644 --- a/src/main/resources/ru/prisonlife/api/store/config.xml +++ b/src/main/resources/ru/prisonlife/api/store/config.xml @@ -12,7 +12,7 @@ - + diff --git a/src/test/java/ru/prisonlife/api/store/PlayerStatsMapperTest.java b/src/test/java/ru/prisonlife/api/store/PlayerStatsMapperTest.java new file mode 100644 index 0000000..74d3ece --- /dev/null +++ b/src/test/java/ru/prisonlife/api/store/PlayerStatsMapperTest.java @@ -0,0 +1,205 @@ +package ru.prisonlife.api.store; + +import org.apache.ibatis.session.SqlSession; +import org.junit.After; +import org.junit.BeforeClass; +import org.junit.Test; +import ru.prisonlife.api.PrisonAPI; + +import java.lang.reflect.Field; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static org.junit.Assert.*; + +public class PlayerStatsMapperTest { + + private static SQLStore sqlStore; + + @BeforeClass + public static void beforeAll() { + sqlStore = new SQLStore( + "org.h2.Driver", + "jdbc:h2:mem:testDb;DB_CLOSE_DELAY=-1", + "sa", + "" + ); + + assertNotNull(sqlStore); + + try (SqlSession sqlSession = sqlStore.openSession()) { + assertNotNull(sqlSession); + + final String sql = "CREATE TABLE IF NOT EXISTS player_stats (" + + "NAME VARCHAR(16)," + + "UUID VARCHAR(64)," + + "WALLET INT," + + "FACTION INT," + + "F_RANG INT," + + "RESPECT INT," + + "COOLDOWN INT," + + "POINTS DOUBLE," + + "LEVEL DOUBLE," + + "G_TIME INT," + + "D_BLOCKS INT," + + "K_PLAYERS INT," + + "K_MOBS INT," + + "DEATHS INT," + + "SUSPECT INT);"; + + try (Statement statement = sqlSession.getConnection().createStatement()) { + statement.execute(sql); + } catch (SQLException e) { + e.printStackTrace(); + + fail(e.getMessage()); + } + } + } + + @After + public void after() { + try(SqlSession session = sqlStore.openSession()) { + try(Statement statement = session.getConnection().createStatement()) { + statement.execute("DELETE FROM player_stats"); + } + } catch (SQLException e) { + e.printStackTrace(); + + fail(e.getMessage()); + } + } + + private PlayerStatsEntity createPlayerStatsEntity() { + PlayerStatsEntity entity = new PlayerStatsEntity(); + + entity.setName("Fake Player"); + entity.setUuid(UUID.randomUUID().toString()); + entity.setWallet(1); + entity.setFaction(PrisonAPI.Factions.NONE.getId()); + entity.setRang(2); + entity.setRespect(3); + entity.setCooldownRespect(4); + entity.setPoints(5.0D); + entity.setLevel(6.0D); + entity.setServerTime(7); + entity.setBlocks(8); + entity.setPlayers(9); + entity.setMobs(10); + entity.setDeaths(11); + entity.setSuspect(12); + + return entity; + } + + @Test + public void testRegisterAndSelectOne() { + final PlayerStatsEntity savedEntity = createPlayerStatsEntity(); + + try (SqlSession session = sqlStore.openSession()) { + assertEquals(1, session.insert("PlayerStats.register", savedEntity)); + session.commit(); + } + + assertRegister(savedEntity); + + PlayerStatsEntity entity; + try (SqlSession session = sqlStore.openSession()) { + entity = session.selectOne("PlayerStats.selectOne", savedEntity.getUuid()); + } + + assertNotNull(entity); + assertEquals(entity, savedEntity); + assertFields(entity, savedEntity); + } + + @Test + public void testCount() { + final PlayerStatsEntity savedEntity = createPlayerStatsEntity(); + + try (SqlSession session = sqlStore.openSession()) { + assertEquals(1, session.insert("PlayerStats.register", savedEntity)); + session.commit(); + } + + Integer result; + try (SqlSession session = sqlStore.openSession()) { + result = session.selectOne("PlayerStats.countByUuid", savedEntity.getUuid()); + } + + assertNotNull(result); + assertEquals(1, result.intValue()); + } + + @Test + public void testUpdate() { + final PlayerStatsEntity savedEntity = createPlayerStatsEntity(); + + try (SqlSession session = sqlStore.openSession()) { + assertEquals(1, session.insert("PlayerStats.register", savedEntity)); + session.commit(); + } + + savedEntity.setName("New Name"); + + try (SqlSession session = sqlStore.openSession()) { + assertEquals(1, session.update("PlayerStats.update", savedEntity)); + session.commit(); + } + + PlayerStatsEntity entity; + try (SqlSession session = sqlStore.openSession()) { + entity = session.selectOne("PlayerStats.selectOne", savedEntity.getUuid()); + } + + assertNotNull(entity); + assertEquals(entity.getName(), savedEntity.getName()); + } + + private void assertRegister(PlayerStatsEntity savedEntity) { + try (SqlSession session = sqlStore.openSession()) { + final String sql = "SELECT COUNT(*) FROM player_stats WHERE UUID = ?"; + + try (PreparedStatement stmt = session.getConnection().prepareStatement(sql)) { + stmt.setString(1, savedEntity.getUuid()); + + try(ResultSet resultSet = stmt.executeQuery()) { + assertTrue(resultSet.next()); + assertEquals(1, resultSet.getInt(1)); + } + } catch (SQLException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + } + + private void assertFields(PlayerStatsEntity expected, PlayerStatsEntity actual) { + final List expectedFields = Arrays.asList(expected.getClass().getDeclaredFields()); + final List actualFields = Arrays.asList(actual.getClass().getDeclaredFields()); + + assertEquals(expectedFields.size(), actualFields.size()); + + expectedFields.forEach(expField -> { + Optional optField = actualFields.stream().filter(field -> field.getName().equals(expField.getName())).findFirst(); + assertTrue(optField.isPresent()); + Field actField = optField.get(); + + expField.setAccessible(true); + actField.setAccessible(true); + + try { + assertEquals("Fields '" + expField.getName() + "' is not equals!", + expField.get(expected), actField.get(actual)); + } catch (IllegalAccessException e) { + fail(e.getMessage()); + } + }); + } +} \ No newline at end of file diff --git a/src/test/java/ru/prisonlife/api/store/SQLStoreTest.java b/src/test/java/ru/prisonlife/api/store/SQLStoreTest.java index c011e34..7c28074 100644 --- a/src/test/java/ru/prisonlife/api/store/SQLStoreTest.java +++ b/src/test/java/ru/prisonlife/api/store/SQLStoreTest.java @@ -3,14 +3,15 @@ package ru.prisonlife.api.store; import org.apache.ibatis.session.SqlSession; import org.junit.Test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertNotNull; public class SQLStoreTest { @Test public void testCreate() { SQLStore sqlStore = new SQLStore( - "jdbc:h2:mem:testDb", + "org.h2.Driver", + "jdbc:h2:mem:testDb;DB_CLOSE_DELAY=-1", "sa", "" );