Archived
0

test PlayerStatsMapper

This commit is contained in:
2019-03-18 01:21:39 +03:00
parent 7904c71026
commit 760b01dfb2
10 changed files with 261 additions and 24 deletions

View File

@@ -44,10 +44,11 @@ public class PrisonAPI extends JavaPlugin {
public void onEnable() { public void onEnable() {
saveDefaultConfig(); saveDefaultConfig();
final String dbDriver = getConfig().getString("database.driver");
final String dbUrl = getConfig().getString("database.url"); final String dbUrl = getConfig().getString("database.url");
final String dbUser = getConfig().getString("database.user"); final String dbUser = getConfig().getString("database.user");
final String dbPasswd = getConfig().getString("database.password"); final String dbPasswd = getConfig().getString("database.password");
sqlStore = new SQLStore(dbUrl, dbUser, dbPasswd); sqlStore = new SQLStore(dbDriver, dbUrl, dbUser, dbPasswd);
} }
} }

View File

@@ -4,6 +4,7 @@ import java.util.Objects;
public class DailyRespectTaskEntity { public class DailyRespectTaskEntity {
private String name;
private String uuid; private String uuid;
private Integer cooldownRespect; private Integer cooldownRespect;
@@ -35,4 +36,12 @@ public class DailyRespectTaskEntity {
public int hashCode() { public int hashCode() {
return Objects.hash(getUuid()); return Objects.hash(getUuid());
} }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
} }

View File

@@ -5,6 +5,7 @@ import java.util.Objects;
public class PlayerStatsEntity { public class PlayerStatsEntity {
private String uuid; private String uuid;
private String name;
private Integer wallet; private Integer wallet;
private Integer faction; private Integer faction;
private Integer rang; private Integer rang;
@@ -143,4 +144,12 @@ public class PlayerStatsEntity {
public void setSuspect(Integer suspect) { public void setSuspect(Integer suspect) {
this.suspect = suspect; this.suspect = suspect;
} }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
} }

View File

@@ -10,8 +10,9 @@ public class SQLStore {
private SqlSessionFactory sqlSessionFactory; 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 properties = new Properties();
properties.put("driver", driver);
properties.put("url", url); properties.put("url", url);
properties.put("user", user); properties.put("user", user);
properties.put("password", password); properties.put("password", password);

View File

@@ -1,6 +1,5 @@
package ru.prisonlife.api.template; package ru.prisonlife.api.template;
import com.google.common.collect.ImmutableMap;
import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSession;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@@ -8,11 +7,12 @@ import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import ru.prisonlife.api.PrisonAPI; import ru.prisonlife.api.PrisonAPI;
import ru.prisonlife.api.store.DailyRespectTaskEntity;
import ru.prisonlife.api.store.PlayerStatsEntity;
import ru.prisonlife.api.store.PlayersInCagesEntity; import ru.prisonlife.api.store.PlayersInCagesEntity;
import java.io.File; import java.io.File;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@@ -165,22 +165,12 @@ public class Prisoner extends AbstractApiData {
return stats; return stats;
} }
public void register() throws SQLException { public void register() {
try (SqlSession sqlSession = getSqlStore().openSession()) { try (SqlSession sqlSession = getSqlStore().openSession()) {
Integer result = sqlSession.selectOne("PlayerStats.countByUuid", getPlayer().getUniqueId().toString()); Integer result = sqlSession.selectOne("PlayerStats.countByUuid", getPlayer().getUniqueId().toString());
if (result == null || result == 0) { if (result == null || result == 0) {
sqlSession.insert("PlayerStats.register", ImmutableMap.builder() registerPlayerStats(sqlSession);
.put("name", getPlayer().getName()) registerDailyRespectTask(sqlSession);
.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()
);
level = new Level(this); level = new Level(this);
stats = new Stats(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() { private PlayersInCagesEntity getPlayersInCagesEntity() {
PlayersInCagesEntity entity; PlayersInCagesEntity entity;
if (refPlayersInCagesEntity != null) { if (refPlayersInCagesEntity != null) {

View File

@@ -1,4 +1,5 @@
database: database:
driver: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/prison4life url: jdbc:mysql://localhost:3306/prison4life
user: root user: root
password: root password: root

View File

@@ -3,6 +3,7 @@
<mapper namespace="PlayerStats"> <mapper namespace="PlayerStats">
<resultMap id="result" type="PlayerStatsEntity"> <resultMap id="result" type="PlayerStatsEntity">
<result property = "name" column = "NAME"/>
<result property = "uuid" column = "UUID"/> <result property = "uuid" column = "UUID"/>
<result property = "wallet" column = "WALLET"/> <result property = "wallet" column = "WALLET"/>
<result property = "faction" column = "FACTION"/> <result property = "faction" column = "FACTION"/>
@@ -27,9 +28,9 @@
SELECT COUNT(*) FROM player_stats WHERE UUID = #{id} SELECT COUNT(*) FROM player_stats WHERE UUID = #{id}
</select> </select>
<insert id="register"> <insert id="register" parameterType="PlayerStatsEntity">
INSERT INTO player_stats (NAME, UUID, LEVEL, POINTS, FACTION, RESPECT, F_RANG, SUSPECT, WALLET, G_TIME, D_BLOCKS, K_PLAYERS, K_MOBS, DEATHS) 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}, 1, 0, 'NONE', 0, 0, 0, 0, 0, 0, 0, 0, 0) VALUES (#{name}, #{uuid}, #{level}, #{points}, #{faction}, #{respect}, #{rang}, #{suspect}, #{wallet}, #{serverTime}, #{blocks}, #{players}, #{mobs}, #{deaths}, #{cooldownRespect})
</insert> </insert>
<update id="update" parameterType="PlayerStatsEntity"> <update id="update" parameterType="PlayerStatsEntity">
@@ -45,7 +46,9 @@
D_BLOCKS = #{blocks}, D_BLOCKS = #{blocks},
K_PLAYERS = #{players}, K_PLAYERS = #{players},
K_MOBS = #{mobs}, K_MOBS = #{mobs},
DEATHS = #{deaths} DEATHS = #{deaths},
NAME = #{name},
SUSPECT = #{suspect}
WHERE UUID = #{uuid}; WHERE UUID = #{uuid};
</update> </update>

View File

@@ -12,7 +12,7 @@
<environment id="main"> <environment id="main">
<transactionManager type="JDBC"/> <transactionManager type="JDBC"/>
<dataSource type="POOLED"> <dataSource type="POOLED">
<property name = "driver" value = "com.mysql.jdbc.Driver"/> <property name = "driver" value = "${driver}"/>
<property name = "url" value = "${url}"/> <property name = "url" value = "${url}"/>
<property name = "username" value = "${user}"/> <property name = "username" value = "${user}"/>
<property name = "password" value = "${password}"/> <property name = "password" value = "${password}"/>

View File

@@ -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<Field> expectedFields = Arrays.asList(expected.getClass().getDeclaredFields());
final List<Field> actualFields = Arrays.asList(actual.getClass().getDeclaredFields());
assertEquals(expectedFields.size(), actualFields.size());
expectedFields.forEach(expField -> {
Optional<Field> 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());
}
});
}
}

View File

@@ -3,14 +3,15 @@ package ru.prisonlife.api.store;
import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSession;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.*; import static org.junit.Assert.assertNotNull;
public class SQLStoreTest { public class SQLStoreTest {
@Test @Test
public void testCreate() { public void testCreate() {
SQLStore sqlStore = new SQLStore( SQLStore sqlStore = new SQLStore(
"jdbc:h2:mem:testDb", "org.h2.Driver",
"jdbc:h2:mem:testDb;DB_CLOSE_DELAY=-1",
"sa", "sa",
"" ""
); );