package tv.dyndns.kishibe.qmaclone.server.database; import static com.google.common.truth.Truth.assertThat; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.hasKey; import static org.hamcrest.Matchers.isOneOf; import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.hamcrest.Matchers.not; import static org.hamcrest.number.OrderingComparison.greaterThanOrEqualTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import java.math.BigInteger; import java.sql.ResultSet; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.joda.time.DateTime; import org.junit.Before; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import tv.dyndns.kishibe.qmaclone.client.game.ProblemGenre; import tv.dyndns.kishibe.qmaclone.client.game.ProblemType; import tv.dyndns.kishibe.qmaclone.client.game.RandomFlag; import tv.dyndns.kishibe.qmaclone.client.packet.PacketBbsResponse; import tv.dyndns.kishibe.qmaclone.client.packet.PacketBbsThread; import tv.dyndns.kishibe.qmaclone.client.packet.PacketChatMessage; import tv.dyndns.kishibe.qmaclone.client.packet.PacketLinkData; import tv.dyndns.kishibe.qmaclone.client.packet.PacketMonth; import tv.dyndns.kishibe.qmaclone.client.packet.PacketProblem; import tv.dyndns.kishibe.qmaclone.client.packet.PacketProblemCreationLog; import tv.dyndns.kishibe.qmaclone.client.packet.PacketProblemMinimum; import tv.dyndns.kishibe.qmaclone.client.packet.PacketRankingData; import tv.dyndns.kishibe.qmaclone.client.packet.PacketThemeModeEditLog; import tv.dyndns.kishibe.qmaclone.client.packet.PacketThemeModeEditor; import tv.dyndns.kishibe.qmaclone.client.packet.PacketThemeModeEditor.ThemeModeEditorStatus; import tv.dyndns.kishibe.qmaclone.client.packet.PacketThemeQuery; import tv.dyndns.kishibe.qmaclone.client.packet.PacketUserData; import tv.dyndns.kishibe.qmaclone.client.packet.PacketWrongAnswer; import tv.dyndns.kishibe.qmaclone.client.packet.RestrictionType; import tv.dyndns.kishibe.qmaclone.client.testing.TestDataProvider; import tv.dyndns.kishibe.qmaclone.server.PageView; import tv.dyndns.kishibe.qmaclone.server.database.DirectDatabase.WrongAnswerHandler; import tv.dyndns.kishibe.qmaclone.server.testing.QMACloneTestEnv; import tv.dyndns.kishibe.qmaclone.server.util.Normalizer; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Range; import com.google.guiceberry.junit4.GuiceBerryRule; import com.google.inject.Inject; @RunWith(MockitoJUnitRunner.class) public class DatabaseTest { private static final int FAKE_USER_CODE = 12345678; private static final int FAKE_BBS_ID = -98543495; private static final String FAKE_REMOTE_ADDRESS = "1.2.3.4"; private static final int FAKE_SCORE = 11111; private static final String FAKE_THEME = "THEME"; private static final int FAKE_PROBLEM_ID = 11111111; private static final String FAKE_ANSWER = "fake answer"; private static final int FAKE_COUNT = 22222; private static final String FAKE_GOOGLE_PLUS_ID = "fake google plus id"; @Rule public GuiceBerryRule rule = new GuiceBerryRule(QMACloneTestEnv.class); @Inject private CachedDatabase database; @Mock private ResultSet mockResultSet; @Inject private QueryRunner runner; @Inject private WrongAnswerHandler wrongAnswerHandler; @Before public void setUp() { database.clearCache(); } private static boolean contains(String sentence, String query) { sentence = Normalizer.normalize(sentence); query = Normalizer.normalize(query); return sentence.contains(query); } private static boolean equals(String a, String b) { a = Normalizer.normalize(a); b = Normalizer.normalize(b); return a.equals(b); } @Test public void testProblemIdsForReport() throws Exception { database.clearProblemIdFromReport(FAKE_USER_CODE); List<Integer> problemIds = new ArrayList<Integer>(); problemIds.add(23456); problemIds.add(34567); problemIds.add(123456); database.addProblemIdsToReport(FAKE_USER_CODE, problemIds); // 追加した問題IDから問題が引けるか? List<PacketProblem> problems; problems = database.getUserProblemReport(FAKE_USER_CODE); assertNotNull(problems); for (PacketProblem problem : problems) { assertTrue(problemIds.contains(problem.id)); } // 問題の削除が出来るか? database.removeProblemIdFromReport(FAKE_USER_CODE, 123456); problems = database.getUserProblemReport(FAKE_USER_CODE); assertNotNull(problems); for (PacketProblem problem : problems) { assertTrue(problem.id != 123456); } // 問題のクリアが出来るか? database.clearProblemIdFromReport(FAKE_USER_CODE); problems = database.getUserProblemReport(FAKE_USER_CODE); assertNotNull(problems); assertTrue(problems.isEmpty()); } @Test public void testUserData() throws Exception { PacketUserData userData = TestDataProvider.getUserData(); userData.userCode = FAKE_USER_CODE; database.setUserData(userData); PacketUserData userData2 = database.getUserData(FAKE_USER_CODE); assertEquals(userData2.userCode, FAKE_USER_CODE); assertEquals(userData.playerName, userData2.playerName); } @Test public void testUserDataWithGooglePlusId() throws Exception { PacketUserData userData = TestDataProvider.getUserData(); userData.userCode = FAKE_USER_CODE; userData.googlePlusId = FAKE_GOOGLE_PLUS_ID; database.setUserData(userData); assertEquals(ImmutableList.of(userData), database.lookupUserCodeByGooglePlusId(FAKE_GOOGLE_PLUS_ID)); } @Test public void disconnectUserCodeFromGooglePlusShould() throws Exception { PacketUserData userData = TestDataProvider.getUserData(); userData.userCode = FAKE_USER_CODE; userData.googlePlusId = FAKE_GOOGLE_PLUS_ID; database.setUserData(userData); database.clearCache(); database.disconnectUserCodeFromGooglePlus(FAKE_USER_CODE); assertEquals(Lists.<PacketUserData> newArrayList(), database.lookupUserCodeByGooglePlusId(FAKE_GOOGLE_PLUS_ID)); } @Test public void testLoadPageView() throws Exception { PageView pageView = database.loadPageView(); assertNotNull(pageView); pageView.numberOfPageView += 10; pageView.numberOfPlayers += 10; pageView.numberOfSessions += 10; database.savePageView(pageView); PageView pageView2 = database.loadPageView(); assertNotNull(pageView2); assertEquals(pageView.numberOfPageView, pageView2.numberOfPageView); assertEquals(pageView.numberOfPlayers, pageView2.numberOfPlayers); assertEquals(pageView.numberOfSessions, pageView2.numberOfSessions); } /** * 問題を追加した後、取得できるかどうか * * @throws Exception */ @Test public void testGetProblemAfterAddProblem() throws Exception { PacketProblem expected = TestDataProvider.getProblem(); expected.voteGood = 0; expected.voteBad = 0; expected.id = database.addProblem(expected); assertTrue(0 < expected.id); List<PacketProblem> problems = database.getProblem(Arrays.asList(expected.id)); assertNotNull(problems); PacketProblem actual = problems.get(0); assertEquals(expected, actual); } /** * 問題を追加した後、検索できるかどうか * * @throws Exception */ @Test public void testSearchProblemAfterAddProblem() throws Exception { PacketProblem expected = TestDataProvider.getProblem(); expected.id = database.addProblem(expected); assertTrue(0 < expected.id); // http://kishibe.dyndns.tv/qmaclone/wiki/wiki.cgi?page=BugTrack-QMAClone/296 // write直後にreadした場合、reopen()していない場合もここで引っかかる List<PacketProblem> problems = database.searchProblem(expected.sentence, null, false, EnumSet.of(expected.genre), EnumSet.of(expected.type), EnumSet.of(expected.randomFlag)); int foundCount = 0; for (PacketProblem p : problems) { if (p.id == expected.id) { ++foundCount; } } assertEquals(1, foundCount); } /** * 問題を追加、更新した後、取得できるかどうか * * @throws Exception */ @Test public void testGetProblemAfterAddAndUpdateProblem() throws Exception { PacketProblem expected = TestDataProvider.getProblem(); expected.voteGood = 0; expected.voteBad = 0; expected.id = database.addProblem(expected); assertTrue(0 < expected.id); expected.sentence = "ユニットテスト用問題文(更新後)"; database.updateProblem(expected); List<PacketProblem> problems = database.getProblem(Arrays.asList(expected.id)); assertNotNull(problems); PacketProblem actual = problems.get(0); assertEquals(expected, actual); } /** * 問題を追加、更新した後、検索できるかどうか * * @throws Exception */ @Test public void testSearchProblemAfterAddAndUpdateProblem() throws Exception { PacketProblem expected = TestDataProvider.getProblem(); expected.id = database.addProblem(expected); assertTrue(0 < expected.id); expected.sentence = "ユニットテスト用問題文(更新後)"; database.updateProblem(expected); // http://kishibe.dyndns.tv/qmaclone/wiki/wiki.cgi?page=BugTrack-QMAClone/296 List<PacketProblem> problems = database.searchProblem("ユニットテスト用問題文", null, false, EnumSet.of(expected.genre), EnumSet.of(expected.type), EnumSet.of(expected.randomFlag)); int foundCount = 0; for (PacketProblem p : problems) { if (p.id == expected.id) { ++foundCount; } } assertEquals(1, foundCount); } /** * 問題を追加、最小情報のみ更新後、取得できるかどうか * * @throws Exception */ @Test public void testGetProblemAfterAddProblemAndUpdateMinimumProblem() throws Exception { PacketProblem expected = TestDataProvider.getProblem(); expected.voteGood = 0; expected.voteBad = 0; expected.id = database.addProblem(expected); assertTrue(0 < expected.id); // 最小情報の更新ではgood/badしか更新されない点に注意する PacketProblemMinimum expectedMinimum = expected.asMinimum(); expectedMinimum.good = 1234; expectedMinimum.bad = 2345; database.updateMinimumProblem(expectedMinimum); expected.good = 1234; expected.bad = 2345; List<PacketProblem> problems = database.getProblem(Arrays.asList(expected.id)); assertNotNull(problems); PacketProblem actual = problems.get(0); assertEquals(expected, actual); } /** * 問題を追加後、最小情報のみ取得できるかどうか * * @throws Exception */ @Test public void testGetProblemMinimumAfterAddProblem() throws Exception { PacketProblem expected = TestDataProvider.getProblem(); expected.voteGood = 0; expected.voteBad = 0; expected.id = database.addProblem(expected); assertTrue(0 < expected.id); PacketProblemMinimum actualMinimum = database.getProblemMinimum(expected.id); assertEquals(expected.asMinimum(), actualMinimum); } /** * 問題を追加後、最新の問題一覧に追加されるかどうか * * @throws Exception */ @Test public void testGetProblemCreationHistoryAfterAddProblem() throws Exception { PacketProblem expected = TestDataProvider.getProblem(); expected.id = database.addProblem(expected); assertTrue(0 < expected.id); List<PacketProblemCreationLog> logs = database.getProblemCreationHistory(expected.id); for (PacketProblemCreationLog log : logs) { assertEquals(expected.creator, log.name); } } /** * 削除された文章が検索に反映される BugTrack-QMAClone/604 - QMAClone wiki * http://kishibe.dyndns.tv/qmaclone/wiki/wiki.cgi?page=BugTrack%2DQMAClone%2F604 */ @Test public void updateProblemShouldHandleSentenceUpdate() throws Exception { PacketProblem problem = TestDataProvider.getProblem(); problem.sentence = "A%nB%nC%nD"; problem.type = ProblemType.Rensou; problem.id = database.addProblem(problem); assertTrue(0 < problem.id); problem.sentence = "A%w%nB%w%nC%w%nD"; database.updateProblem(problem); List<PacketProblem> problems = database.searchProblem(null, "%n -%w", true, null, null, null); for (PacketProblem p : problems) { assertFalse(p.id == problem.id); } } /** * 問題番号87662の問題作成者に関して BugTrack-QMAClone/606 - QMAClone wiki * http://kishibe.dyndns.tv/qmaclone/wiki/wiki.cgi?page=BugTrack%2DQMAClone%2F606 */ @Test public void updateProblemShouldHandleDifferentCreator() throws Exception { PacketProblem problem = TestDataProvider.getProblem(); problem.creator = "AAAAA"; problem.id = database.addProblem(problem); assertTrue(0 < problem.id); problem.creator = "BBBBB"; database.updateProblem(problem); problem.creator = "AAAAA"; database.updateProblem(problem); List<PacketProblem> problems = database.searchProblem(null, "BBBBB", true, null, null, null); for (PacketProblem p : problems) { assertFalse(p.id == problem.id); } } @Test public void testSearchProblem() throws Exception { List<PacketProblem> problems; problems = database.searchProblem("クイズ", null, false, EnumSet.noneOf(ProblemGenre.class), EnumSet.noneOf(ProblemType.class), EnumSet.noneOf(RandomFlag.class)); assertNotNull(problems); assertFalse(problems.isEmpty()); for (PacketProblem problem : problems) { String searchQuery = problem.getSearchDocument(); assertThat(searchQuery, containsString("クイズ")); } problems = database.searchProblem(null, "チップ", false, EnumSet.noneOf(ProblemGenre.class), EnumSet.noneOf(ProblemType.class), EnumSet.noneOf(RandomFlag.class)); assertNotNull(problems); assertFalse(problems.isEmpty()); for (PacketProblem problem : problems) { assertThat(problem.creator, containsString("チップ")); } problems = database.searchProblem(null, "ノドチップ", true, EnumSet.noneOf(ProblemGenre.class), EnumSet.noneOf(ProblemType.class), EnumSet.noneOf(RandomFlag.class)); assertNotNull(problems); assertFalse(problems.isEmpty()); for (PacketProblem problem : problems) { assertTrue(equals(problem.creator, "ノドチップ")); } problems = database.searchProblem(null, null, false, EnumSet.of(ProblemGenre.Anige), EnumSet.noneOf(ProblemType.class), EnumSet.noneOf(RandomFlag.class)); assertNotNull(problems); assertFalse(problems.isEmpty()); for (PacketProblem problem : problems) { assertEquals(ProblemGenre.Anige, problem.genre); } problems = database.searchProblem(null, null, false, EnumSet.of(ProblemGenre.Anige, ProblemGenre.Geinou), EnumSet.of(ProblemType.Marubatsu, ProblemType.Rensou), EnumSet.of(RandomFlag.Random1, RandomFlag.Random3)); assertNotNull(problems); assertFalse(problems.isEmpty()); for (PacketProblem problem : problems) { assertThat(problem.genre, isOneOf(ProblemGenre.Anige, ProblemGenre.Geinou)); assertThat(problem.type, isOneOf(ProblemType.Marubatsu, ProblemType.Rensou)); assertThat(problem.randomFlag, isOneOf(RandomFlag.Random1, RandomFlag.Random3)); } problems = database.searchProblem("クイズ マジック アカデミー", null, false, EnumSet.noneOf(ProblemGenre.class), EnumSet.noneOf(ProblemType.class), EnumSet.noneOf(RandomFlag.class)); assertNotNull(problems); assertFalse(problems.isEmpty()); for (PacketProblem problem : problems) { String searchQuery = problem.getSearchDocument(); assertThat(searchQuery, containsString("クイズ")); assertThat(searchQuery, containsString("マジック")); assertThat(searchQuery, containsString("アカデミー")); } problems = database.searchProblem("floccinaucinihilipilification", null, false, EnumSet.noneOf(ProblemGenre.class), EnumSet.noneOf(ProblemType.class), EnumSet.noneOf(RandomFlag.class)); assertNotNull(problems); assertTrue(problems.isEmpty()); } @Test public void testSearchProblemNot() throws Exception { List<PacketProblem> problems; // not演算子で期待したもの以上が除外されるバグの回帰テスト // http://kishibe.dyndns.tv/qmaclone/wiki/wiki.cgi?page=BugTrack-QMAClone/325 problems = database.searchProblem("フルメタル・パニック -ノベル", null, false, EnumSet.noneOf(ProblemGenre.class), EnumSet.noneOf(ProblemType.class), EnumSet.noneOf(RandomFlag.class)); assertNotNull(problems); assertFalse(problems.isEmpty()); for (PacketProblem problem : problems) { String searchQuery = problem.getSearchDocument(); assertThat(searchQuery, containsString("フルメタル・パニック")); assertFalse(contains(searchQuery, "ノベル")); } } private Matcher<String> containsString(final String query) { return new BaseMatcher<String>() { private String sentence; @Override public void describeTo(Description arg0) { arg0.appendText(String.format("\"%s\" does not contains \"%s\"", sentence, query)); } @Override public boolean matches(Object arg0) { String sentence = (String) arg0; this.sentence = Normalizer.normalize(sentence); return this.sentence.contains(Normalizer.normalize(query)); } }; } @Test public void testSearchProblemNotCount() throws Exception { List<PacketProblem> problems; // not演算子で除外される問題数 // http://kishibe.dyndns.tv/qmaclone/wiki/wiki.cgi?page=BugTrack-QMAClone/325 problems = database.searchProblem("フルメタル・パニック", null, false, EnumSet.noneOf(ProblemGenre.class), EnumSet.noneOf(ProblemType.class), EnumSet.noneOf(RandomFlag.class)); assertNotNull(problems); assertFalse(problems.isEmpty()); int a = problems.size(); problems = database.searchProblem("フルメタル・パニック 小説", null, false, EnumSet.noneOf(ProblemGenre.class), EnumSet.noneOf(ProblemType.class), EnumSet.noneOf(RandomFlag.class)); assertNotNull(problems); assertFalse(problems.isEmpty()); int b = problems.size(); problems = database.searchProblem("フルメタル・パニック -小説", null, false, EnumSet.noneOf(ProblemGenre.class), EnumSet.noneOf(ProblemType.class), EnumSet.noneOf(RandomFlag.class)); assertNotNull(problems); assertFalse(problems.isEmpty()); int c = problems.size(); assertEquals(a, b + c); } @Ignore @Test public void searchProblemShouldWorkWithEscapeSequences() throws Exception { List<PacketProblem> problems = database.searchProblem("%n -%w", null, false, EnumSet.noneOf(ProblemGenre.class), EnumSet.of(ProblemType.Rensou), EnumSet.noneOf(RandomFlag.class)); assertNotNull(problems); assertFalse(problems.isEmpty()); for (PacketProblem problem : problems) { String searchQuery = problem.getSearchDocument(); assertThat(searchQuery, containsString("%n")); assertFalse(contains(searchQuery, "%w")); assertEquals(ProblemType.Rensou, problem.type); } } @Test public void testSearchSimilarProblem() throws Exception { PacketProblem problem = new PacketProblem(); problem.id = 12345; problem.sentence = "「Google」で2020年完成予定の 人工知能で会話しつつ検索などを行うサービスを 「Google ○○○○○」という? "; problem.answers = new String[] { "BRAIN", "", "", "" }; List<PacketProblem> problems = database.searchSimilarProblemFromDatabase(problem); assertFalse(problems.isEmpty()); // System.out.println("testSearchSimilarProblem()"); // for (PacketProblem p : problems) { // System.out.println(p.toString()); // } } @Test public void testPlayerAnswers() throws Exception { // プレイヤー解答の追加と取得 database.addPlayerAnswers(123456789, ProblemType.Typing, Arrays.asList("テスト")); for (PacketWrongAnswer wrongAnswer : database.getPlayerAnswers(123456789)) { assertEquals(wrongAnswer.answer, "テスト"); } // プレイヤー解答の削除 database.removePlayerAnswers(123456789); assertTrue(database.getPlayerAnswers(123456789).isEmpty()); } @Test public void addPlayerAnswerShouldNormalizeSenmusubiAnswers() throws Exception { database.removePlayerAnswers(FAKE_PROBLEM_ID); database.addPlayerAnswers(FAKE_PROBLEM_ID, ProblemType.Senmusubi, Arrays.asList("\nC<--->c\nB<--->b\nA<--->a\n")); database.addPlayerAnswers(FAKE_PROBLEM_ID, ProblemType.Senmusubi, Arrays.asList("C<--->c\nA<--->a\nB<--->b")); for (PacketWrongAnswer wrongAnswer : database.getPlayerAnswers(FAKE_PROBLEM_ID)) { assertEquals("A<--->a\nB<--->b\nC<--->c", wrongAnswer.answer); assertEquals(2, wrongAnswer.count); } } @Test public void getPlayerAnswersShouldMergeAnswers() throws Exception { database.removePlayerAnswers(FAKE_PROBLEM_ID); database.addPlayerAnswers(FAKE_PROBLEM_ID, ProblemType.Senmusubi, Arrays.asList("\nC---c\nB---b\nA---a\n")); database.addPlayerAnswers(FAKE_PROBLEM_ID, ProblemType.Senmusubi, Arrays.asList("C<--->c\nA<--->a\nB<--->b")); for (PacketWrongAnswer wrongAnswer : database.getPlayerAnswers(FAKE_PROBLEM_ID)) { assertEquals("A<--->a\nB<--->b\nC<--->c", wrongAnswer.answer); assertEquals(2, wrongAnswer.count); } } @Test public void testGetRankingData() throws Exception { List<List<PacketRankingData>> ranking = database.getGeneralRankingData(); assertEquals(6, ranking.size()); } @Test public void testGetThemeModeEditors() throws Exception { List<PacketThemeModeEditor> editors = database.getThemeModeEditors(); assertNotNull(editors); assertFalse(editors.isEmpty()); for (PacketThemeModeEditor editor : editors) { assertThat(editor.userCode, greaterThanOrEqualTo(0)); assertNotNull(editor.name); assertNotNull(editor.themeModeEditorStatus); } } @Test public void testGetThemeModeEditorsStatus() throws Exception { QueryRunner runner = getQueryRunner(); runner.update("REPLACE theme_mode_editor (userCode, status) VALUES (0, 1)"); ThemeModeEditorStatus status = database.getThemeModeEditorsStatus(0); assertNotNull(status); assertEquals(ThemeModeEditorStatus.Accepted, status); } private QueryRunner getQueryRunner() throws Exception { return ((DirectDatabase) ((CachedDatabase) database).database).runner; } @Test public void testAddRemoveIgnoreUserCode() throws Exception { runner.update("DELETE FROM ignore_id WHERE USER_CODE = 111"); database.addIgnoreUserCode(111, 222); assertEquals(1L, (long) runner.query( "SELECT COUNT(*) FROM ignore_id WHERE USER_CODE = 111 AND TARGET_USER_CODE = 222", new ScalarHandler<Long>())); database.removeIgnoreUserCode(111, 222); assertEquals(0L, (long) runner.query( "SELECT COUNT(*) FROM ignore_id WHERE USER_CODE = 111 AND TARGET_USER_CODE = 222", new ScalarHandler<Long>())); } @Test public void testAddGetServerIgnoreUserCode() throws Exception { runner.update("DELETE FROM ignore_id WHERE USER_CODE = 0"); assertEquals(0L, (long) runner.query( "SELECT COUNT(*) FROM ignore_id WHERE USER_CODE = 0 AND TARGET_USER_CODE = 111", new ScalarHandler<Long>())); assertTrue(database.getServerIgnoreUserCode().isEmpty()); database.addServerIgnoreUserCode(111); assertEquals(1L, (long) runner.query( "SELECT COUNT(*) FROM ignore_id WHERE USER_CODE = 0 AND TARGET_USER_CODE = 111", new ScalarHandler<Long>())); assertThat(database.getServerIgnoreUserCode(), hasItem(111)); } @Test public void testAddChatLog() throws Exception { long count = (long) runner.query("SELECT COUNT(*) FROM chat_log", new ScalarHandler<Long>()); database.addChatLog(new PacketChatMessage()); assertEquals(count + 1, (long) runner.query("SELECT COUNT(*) FROM chat_log", new ScalarHandler<Long>())); } @Test public void testGetProblemCreationHistory() throws Exception { long countUserCode = (long) runner.query( "SELECT COUNT(*) FROM creation_log WHERE USER_CODE = 111", new ScalarHandler<Long>()); assertEquals(countUserCode, database.getNumberOfCreationLogWithUserCode(111, 0)); long countMachineIp = (long) runner.query( "SELECT COUNT(*) FROM creation_log WHERE MACHINE_IP = '222'", new ScalarHandler<Long>()); List<PacketProblemCreationLog> log0 = database.getProblemCreationHistory(0); assertEquals(countMachineIp, database.getNumberOfCreationLogWithUserCode(111, 0)); PacketProblem problem = TestDataProvider.getProblem(); problem.id = 0; database.addCreationLog(problem, 111, "222"); List<PacketProblemCreationLog> log1 = database.getProblemCreationHistory(0); assertThat(log1.size()).isIn(Range.closed(log0.size(), log0.size() + 1)); assertEquals(countUserCode + 1, database.getNumberOfCreationLogWithUserCode(111, 0)); assertEquals(countMachineIp + 1, database.getNumberOfCreationLogWithUserCode(111, 0)); } @Test public void testBuildGetBbsThread() throws Exception { long count = runner.query("SELECT COUNT(*) FROM bbs_thread WHERE bbsId = ?", new ScalarHandler<Long>(), FAKE_BBS_ID); assertEquals(count, database.getBbsThreads(FAKE_BBS_ID, 0, Integer.MAX_VALUE).size()); assertEquals(count, database.getNumberOfBbsThread(FAKE_BBS_ID)); PacketBbsThread thread = new PacketBbsThread(); thread.title = "title"; PacketBbsResponse response = new PacketBbsResponse(); response.name = "name"; response.userCode = 123456789; response.remoteAddress = "remote address"; response.dispInfo = 0; response.body = "body"; database.buildBbsThread(FAKE_BBS_ID, thread, response); assertEquals(count + 1, database.getBbsThreads(FAKE_BBS_ID, 0, Integer.MAX_VALUE).size()); assertEquals(count + 1, database.getNumberOfBbsThread(FAKE_BBS_ID)); int threadId = runner.query("SELECT MAX(id) FROM bbs_thread", new ScalarHandler<BigInteger>()) .intValue(); List<PacketBbsResponse> responses = database.getBbsResponses(threadId, 10); assertThat(responses.size(), greaterThan(0)); assertThat(responses.size(), lessThanOrEqualTo(11)); } @Test public void testWriteGetBbsResponses() throws Exception { int count = database.getBbsResponses(0, Integer.MAX_VALUE).size(); PacketBbsResponse response = new PacketBbsResponse(); response.threadId = 0; response.name = ""; response.userCode = 123456789; response.remoteAddress = "remote address"; response.dispInfo = 0; response.body = "body"; database.writeToBbs(response, true); assertEquals(count + 1, database.getBbsResponses(0, Integer.MAX_VALUE).size()); } @Test public void testIsUsedUserCode() throws Exception { runner.update("DELETE FROM player WHERE USER_CODE = 0"); assertFalse(database.isUsedUserCode(0)); database.setUserData(new PacketUserData()); assertTrue(database.isUsedUserCode(0)); runner.update("DELETE FROM player WHERE USER_CODE = 0"); } @Test public void testAddUpdateRemoveGetLinkData() throws Exception { runner.update("DELETE FROM link"); assertTrue(database.getLinkDatas(0, Integer.MAX_VALUE).isEmpty()); assertEquals(0, database.getNumberOfLinkDatas()); PacketLinkData linkData = new PacketLinkData(); linkData.homePageName = "home page name"; linkData.authorName = "author name"; linkData.url = "url"; linkData.bannerUrl = "url"; linkData.description = "description"; database.addLinkData(linkData); assertEquals(1, database.getLinkDatas(0, Integer.MAX_VALUE).size()); assertEquals(1, database.getNumberOfLinkDatas()); linkData.id = database.getLinkDatas(0, Integer.MAX_VALUE).get(0).id; linkData.userCode = 111; database.updateLinkData(linkData); assertEquals(111, database.getLinkDatas(0, Integer.MAX_VALUE).get(0).userCode); assertEquals(1, database.getNumberOfLinkDatas()); database.removeLinkData(linkData.id); assertTrue(database.getLinkDatas(0, Integer.MAX_VALUE).isEmpty()); assertEquals(0, database.getNumberOfLinkDatas()); } @Test public void testGetNumberOfActiveUsers() throws Exception { runner.update("DELETE FROM player WHERE USER_CODE = 111"); database.clearCache(); int count = database.getNumberOfActiveUsers(); PacketUserData data = new PacketUserData(); data.userCode = 111; data.playCount = 100; database.setUserData(data); assertTrue(database.getNumberOfActiveUsers() == count || database.getNumberOfActiveUsers() == count + 1); } @Test public void testGetRatingGroupedByPrefecture() throws Exception { Map<Integer, List<Integer>> rating = database.getRatingGroupedByPrefecture(); for (Entry<Integer, List<Integer>> entry : rating.entrySet()) { assertFalse(entry.getValue().isEmpty()); } } @Test public void testGetAddGetRatingHistory() throws Exception { runner.update("DELETE FROM rating_history WHERE USER_CODE = 111"); assertTrue(database.getRatingHistory(111).isEmpty()); database.addRatingHistory(111, 0); assertEquals(1, database.getRatingHistory(111).size()); } @Test public void testGetWholeRating() throws Exception { assertNotNull(database.getWholeRating()); } @Test public void testGetAddRemoveThemeModeQuery() throws Exception { runner.update("DELETE FROM theme_mode WHERE THEME = 'test'"); assertThat(getThemeModeQueries(), not(hasKey("test"))); database.addThemeModeQuery("test", "query"); assertEquals(ImmutableList.of("query"), getThemeModeQueries().get("test")); database.removeThemeModeQuery("test", "query"); assertThat(getThemeModeQueries(), not(hasKey("test"))); } @Test public void getThemeModeQueriesShouldLimitReturnValues() throws Exception { assertThat(database.getThemeModeQueries(), not(empty())); } @Test public void getNumberOfThemeQueriesShouldReturnProperValue() throws Exception { assertThat(database.getNumberOfThemeQueries(), greaterThan(0)); } private Map<String, List<String>> getThemeModeQueries() throws DatabaseException { Map<String, List<String>> queries = Maps.newHashMap(); for (PacketThemeQuery query : database.getThemeModeQueries()) { if (!queries.containsKey(query.getTheme())) { queries.put(query.getTheme(), new ArrayList<String>()); } queries.get(query.getTheme()).add(query.query); } return queries; } @Test public void addThemeModeQueryShouldAcceptSecondQuery() throws Exception { // テーマモードの編集において、ジャンル(例えば「アニメ&ゲーム」)とサブジャンル(例えば「ランダム1」)と検索ワード(例えば「ノドチップ」)のような組み合わせを複数登録することができない // BugTrack-QMAClone/520 runner.update("DELETE FROM theme_mode WHERE THEME = 'test'"); assertThat(getThemeModeQueries(), not(hasKey("test"))); database.addThemeModeQuery("test", "ジャンル:アニメ&ゲーム ランダム:1 なのは"); assertEquals(ImmutableList.of("ジャンル:アニメ&ゲーム ランダム:1 なのは"), getThemeModeQueries().get("test")); database.addThemeModeQuery("test", "ジャンル:アニメ&ゲーム ランダム:1 まどか"); assertEquals(ImmutableList.of("ジャンル:アニメ&ゲーム ランダム:1 なのは", "ジャンル:アニメ&ゲーム ランダム:1 まどか"), getThemeModeQueries().get("test")); } @Test public void testUpdateThemeModeScore() throws Exception { runner.update("DELETE FROM theme_mode_score WHERE USER_CODE = 111"); database.updateThemeModeScore(111, "test", 0); assertEquals(1L, (long) runner.query( "SELECT COUNT(*) FROM theme_mode_score WHERE USER_CODE = 111", new ScalarHandler<Long>())); } @Test public void testVoteToProblem() throws Exception { long voteGood = (long) MoreObjects.firstNonNull( runner.query("SELECT VOTE_GOOD FROM problem WHERE ID = 1", new ScalarHandler<Long>()), 0L); long voteBad = (long) MoreObjects.firstNonNull( runner.query("SELECT VOTE_BAD FROM problem WHERE ID = 1", new ScalarHandler<Long>()), 0L); database.voteToProblem(1, true, ""); assertEquals(voteGood + 1, (long) MoreObjects.firstNonNull( runner.query("SELECT VOTE_GOOD FROM problem WHERE ID = 1", new ScalarHandler<Long>()), 0L)); assertEquals(voteBad, (long) MoreObjects.firstNonNull( runner.query("SELECT VOTE_BAD FROM problem WHERE ID = 1", new ScalarHandler<Long>()), 0L)); database.voteToProblem(1, false, ""); assertEquals(voteGood + 1, (long) MoreObjects.firstNonNull( runner.query("SELECT VOTE_GOOD FROM problem WHERE ID = 1", new ScalarHandler<Long>()), 0L)); assertEquals(voteBad + 1, (long) MoreObjects.firstNonNull( runner.query("SELECT VOTE_BAD FROM problem WHERE ID = 1", new ScalarHandler<Long>()), 0L)); } @Test public void testResetVote() throws Exception { runner.update("UPDATE problem SET VOTE_GOOD = 123, VOTE_BAD = 456 WHERE ID = 1"); database.resetVote(1); assertEquals(0, (long) MoreObjects.firstNonNull( runner.query("SELECT VOTE_GOOD FROM problem WHERE ID = 1", new ScalarHandler<Long>()), 0L)); assertEquals(0, (long) MoreObjects.firstNonNull( runner.query("SELECT VOTE_BAD FROM problem WHERE ID = 1", new ScalarHandler<Long>()), 0L)); } @Test public void testClearGetProblemFeedback() throws Exception { runner.update("DELETE FROM problem_questionnaire WHERE problemId = 0"); assertTrue(database.getProblemFeedback(0).isEmpty()); database.voteToProblem(0, false, ""); assertEquals(1, database.getProblemFeedback(0).size()); } @Test public void testProcessProblems() throws Exception { final long[] counter = new long[1]; database.processProblems(new ProblemProcessable() { @Override public void process(PacketProblem problem) throws Exception { ++counter[0]; } }); assertEquals((long) runner.query("SELECT COUNT(*) FROM problem", new ScalarHandler<Long>()), counter[0]); } @Test public void testGetLastestProblems() throws Exception { assertNotNull(database.getLastestProblems()); } @Test public void testUpdateGetThemeModeEditorsStatus() throws Exception { database.updateThemeModeEdtorsStatus(111, ThemeModeEditorStatus.Applying); assertEquals(ThemeModeEditorStatus.Applying, database.getThemeModeEditorsStatus(111)); database.updateThemeModeEdtorsStatus(111, ThemeModeEditorStatus.Accepted); assertEquals(ThemeModeEditorStatus.Accepted, database.getThemeModeEditorsStatus(111)); } @Test public void testGetNumberOfChatLog() throws Exception { assertTrue(database.getNumberOfChatLog() > 0); } @Test public void testGetChatLogId() throws Exception { assertThat(database.getChatLogId(2009, 6, 6, 16, 45, 54), isOneOf(1787420, 1788066)); } @Test public void testGetChatLog() throws Exception { List<PacketChatMessage> chatData = database.getChatLog(1787420); assertNotNull(chatData); assertFalse(chatData.isEmpty()); for (int index = 0; index < chatData.size(); ++index) { PacketChatMessage data = chatData.get(index); assertEquals(1787420 + index, data.resId); } } @Test public void testGetNumberOfCreationLogWithUserCode() throws Exception { QueryRunner runner = getQueryRunner(); long date = System.currentTimeMillis(); runner .update( "INSERT creation_log (PROBLEM_ID, USER_CODE, DATE, MACHINE_IP) VALUES (123456, 123456789, ?, '1.2.3.4')", new Timestamp(date)); assertThat(database.getNumberOfCreationLogWithUserCode(123456789, date - 1000), greaterThanOrEqualTo(1)); } @Test public void testGetNumberOfCreationLogWithMachineIp() throws Exception { QueryRunner runner = getQueryRunner(); long date = System.currentTimeMillis(); runner .update( "INSERT creation_log (PROBLEM_ID, USER_CODE, DATE, MACHINE_IP) VALUES (123456, 123456789, ?, '1.2.3.4')", new Timestamp(date)); assertThat(database.getNumberOfCreationLogWithUserCode(123456789, date - 1000), greaterThanOrEqualTo(1)); } @Test public void testUserDataHandlerShouldReturnUserData() throws Exception { expectResultSetReturnsUserData(); when(mockResultSet.getString("CORRECT_COUNT")) .thenReturn( "0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0\n" + "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n" + "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n" + "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n" + "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n" + "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n"); PacketUserData data = DirectDatabase.userDataHandler.handle(mockResultSet).get(0); assertEquals(0, data.correctCount[0][0][0]); assertEquals(1, data.correctCount[0][1][0]); assertEquals(2, data.correctCount[0][2][0]); assertEquals(3, data.correctCount[0][3][0]); assertEquals(4, data.correctCount[0][4][0]); assertEquals(5, data.correctCount[0][5][0]); assertEquals(6, data.correctCount[0][6][0]); assertEquals(7, data.correctCount[0][7][0]); assertEquals(8, data.correctCount[0][8][0]); assertEquals(9, data.correctCount[0][9][0]); assertEquals(10, data.correctCount[0][10][0]); assertEquals(11, data.correctCount[0][11][0]); assertEquals(12, data.correctCount[0][12][0]); assertEquals(13, data.correctCount[0][13][0]); assertEquals(14, data.correctCount[0][14][0]); assertEquals(15, data.correctCount[0][15][0]); assertEquals(16, data.correctCount[0][16][0]); assertEquals(17, data.correctCount[0][17][0]); assertEquals(18, data.correctCount[0][18][0]); assertEquals(19, data.correctCount[0][19][0]); assertEquals(20, data.correctCount[0][20][0]); assertEquals(21, data.correctCount[0][21][0]); } @Test public void testUserDataHandlerShouldUpgradeOldUserData() throws Exception { expectResultSetReturnsUserData(); when(mockResultSet.getString("CORRECT_COUNT")).thenReturn( "0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0\n" + "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n" + "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n" + "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n" + "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n" + "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n"); PacketUserData data = DirectDatabase.userDataHandler.handle(mockResultSet).get(0); assertEquals(0, data.correctCount[0][0][0]); assertEquals(1, data.correctCount[0][1][0]); assertEquals(2, data.correctCount[0][2][0]); assertEquals(3, data.correctCount[0][3][0]); assertEquals(4, data.correctCount[0][4][0]); assertEquals(5, data.correctCount[0][5][0]); assertEquals(6, data.correctCount[0][6][0]); assertEquals(7, data.correctCount[0][7][0]); assertEquals(8, data.correctCount[0][8][0]); assertEquals(9, data.correctCount[0][9][0]); assertEquals(10, data.correctCount[0][10][0]); assertEquals(11, data.correctCount[0][11][0]); assertEquals(12, data.correctCount[0][12][0]); assertEquals(13, data.correctCount[0][13][0]); assertEquals(14, data.correctCount[0][14][0]); assertEquals(15, data.correctCount[0][15][0]); assertEquals(0, data.correctCount[0][16][0]); assertEquals(16, data.correctCount[0][17][0]); assertEquals(17, data.correctCount[0][18][0]); assertEquals(18, data.correctCount[0][19][0]); assertEquals(19, data.correctCount[0][20][0]); assertEquals(20, data.correctCount[0][21][0]); } private void expectResultSetReturnsUserData() throws Exception { PacketUserData expected = TestDataProvider.getUserData(); when(mockResultSet.next()).thenReturn(true).thenReturn(false); when(mockResultSet.getInt("USER_CODE")).thenReturn(expected.userCode); when(mockResultSet.getString("NAME")).thenReturn(expected.playerName); when(mockResultSet.getString("GREETING")).thenReturn(expected.greeting); when(mockResultSet.getInt("HIGH_SCORE")).thenReturn(expected.highScore); when(mockResultSet.getInt("AVERAGE_SCORE")).thenReturn(expected.averageScore); when(mockResultSet.getInt("PLAY_COUNT")).thenReturn(expected.playCount); when(mockResultSet.getInt("VICTORY_POINT")).thenReturn(expected.rating); when(mockResultSet.getInt("LEVEL_NAME")).thenReturn(expected.levelName); when(mockResultSet.getInt("LEVEL_NUMBER")).thenReturn(expected.levelNumber); when(mockResultSet.getFloat("AVERAGE_RANK")).thenReturn(expected.averageRank); when(mockResultSet.getInt("GENRE")).thenReturn(ProblemGenre.toBitFlag(expected.genres)); when(mockResultSet.getInt("TYPE")).thenReturn(ProblemType.toBitFlag(expected.types)); when(mockResultSet.getInt("CLASS_LEVEL")).thenReturn(expected.classLevel); when(mockResultSet.getString("IMAGE_FILE_NAME")).thenReturn(expected.imageFileName); when(mockResultSet.getBoolean("PLAY_SOUND")).thenReturn(expected.playSound); when(mockResultSet.getBoolean("MULTI_GENRE")).thenReturn(expected.multiGenre); when(mockResultSet.getBoolean("MULTI_TYPE")).thenReturn(expected.multiType); when(mockResultSet.getInt("DIFFICULT_SELECT")).thenReturn(expected.difficultSelect); when(mockResultSet.getBoolean("RANKING_MOVE")).thenReturn(expected.rankingMove); when(mockResultSet.getInt("BBS_DISP_INFO")).thenReturn(expected.bbsDispInfo); when(mockResultSet.getBoolean("BBS_AGE")).thenReturn(expected.bbsAge); when(mockResultSet.getInt("TIMER_MODE")).thenReturn(expected.timerMode); when(mockResultSet.getInt("PREFECTURE")).thenReturn(expected.prefecture); when(mockResultSet.getBoolean("CHAT")).thenReturn(expected.chat); when(mockResultSet.getInt("NEW_AND_OLD")).thenReturn(expected.newAndOldProblems.ordinal()); when(mockResultSet.getBoolean("PUBLIC_EVENT")).thenReturn(expected.publicEvent); when(mockResultSet.getBoolean("HIDE_ANSWER")).thenReturn(expected.hideAnswer); when(mockResultSet.getBoolean("SHOW_INFO")).thenReturn(expected.showInfo); when(mockResultSet.getBoolean("REFLECT_EVENT_RESULT")).thenReturn(expected.reflectEventResult); when(mockResultSet.getInt("WEB_SOCKET_USAGE")).thenReturn(expected.webSocketUsage.getIndex()); when(mockResultSet.getInt("VOLATILITY")).thenReturn(expected.volatility); when(mockResultSet.getBoolean("QWERTY_HIRAGANA")).thenReturn(expected.qwertyHiragana); when(mockResultSet.getBoolean("QWERTY_KATAKANA")).thenReturn(expected.qwertyKatakana); when(mockResultSet.getBoolean("QWERTY_ALPHABET")).thenReturn(expected.qwertyAlphabet); when(mockResultSet.getBoolean("REGISTER_CREATED_PROBLEM")).thenReturn( expected.registerCreatedProblem); when(mockResultSet.getBoolean("REGISTER_INDICATED_PROBLEM")).thenReturn( expected.registerIndicatedProblem); when(mockResultSet.getString("THEME")).thenReturn(expected.theme); } @Test public void getIndicatedProblemsShouldReturnIndicatedProblems() throws Exception { List<PacketProblem> indicatedProblems = database.getIndicatedProblems(); assertThat(indicatedProblems, not(empty())); for (PacketProblem problem : indicatedProblems) { assertTrue(problem.indication != null || problem.indicationResolved != null && problem.indicationResolved.compareTo(new Date(System.currentTimeMillis() - 7L * 24 * 60 * 60 * 1000)) == 1); } } @Test public void getNumberOfThemeModeEditLogShouldReturnValue() throws Exception { int expected = (int) (long) runner.query("SELECT COUNT(*) FROM theme_mode_edit_log", new ScalarHandler<Long>()); assertEquals(expected, database.getNumberOfThemeModeEditLog()); } @Test public void addThemeModeEditLogShouldAddRow() throws Exception { int before = database.getNumberOfThemeModeEditLog(); PacketThemeModeEditLog log = new PacketThemeModeEditLog(); log.setUserCode(FAKE_USER_CODE); log.setTimeMs(System.currentTimeMillis()); log.setType("Add"); log.setTheme("THEME"); log.setQuery("query"); database.addThemeModeEditLog(log); int after = database.getNumberOfThemeModeEditLog(); assertEquals(before + 1, after); } @Test public void getThemeModeEditLogShouldReturnLog() throws Exception { int before = database.getNumberOfThemeModeEditLog(); PacketThemeModeEditLog log = new PacketThemeModeEditLog(); log.setUserCode(FAKE_USER_CODE); log.setTimeMs(System.currentTimeMillis()); log.setType("Add"); log.setTheme("THEME"); log.setQuery("query"); database.addThemeModeEditLog(log); assertEquals(ImmutableList.of(log), database.getThemeModeEditLog(before, 1)); } @Test public void testGetAdsenseProblems() throws Exception { List<PacketProblem> problem; problem = database.getAdsenseProblems("オンライン クイズ ゲーム"); assertNotNull(problem); assertFalse(problem.isEmpty()); problem = database.getAdsenseProblems("クイズ"); assertNotNull(problem); assertFalse(problem.isEmpty()); problem = database.getAdsenseProblems("RPG"); assertNotNull(problem); assertFalse(problem.isEmpty()); problem = database.getAdsenseProblems("MMO"); assertNotNull(problem); assertFalse(problem.isEmpty()); for (PacketProblem p : problem) { System.out.println(p); } } @Test public void restrictedUserCodeIntegrationTest() throws Exception { database.addRestrictedUserCode(FAKE_USER_CODE, RestrictionType.CHAT); assertTrue(database.getRestrictedUserCodes(RestrictionType.CHAT).contains(FAKE_USER_CODE)); database.removeRestrictedUserCode(FAKE_USER_CODE, RestrictionType.CHAT); assertFalse(database.getRestrictedUserCodes(RestrictionType.CHAT).contains(FAKE_USER_CODE)); database.addRestrictedUserCode(FAKE_USER_CODE, RestrictionType.CHAT); assertTrue(database.getRestrictedUserCodes(RestrictionType.CHAT).contains(FAKE_USER_CODE)); database.removeRestrictedUserCode(FAKE_USER_CODE, RestrictionType.CHAT); assertFalse(database.getRestrictedUserCodes(RestrictionType.CHAT).contains(FAKE_USER_CODE)); } @Test public void restrictedRemoteAddressIntegrationTest() throws Exception { database.addRestrictedRemoteAddress(FAKE_REMOTE_ADDRESS, RestrictionType.CHAT); assertTrue(database.getRestrictedRemoteAddresses(RestrictionType.CHAT).contains( FAKE_REMOTE_ADDRESS)); database.removeRestrictedRemoteAddress(FAKE_REMOTE_ADDRESS, RestrictionType.CHAT); assertFalse(database.getRestrictedRemoteAddresses(RestrictionType.CHAT).contains( FAKE_REMOTE_ADDRESS)); database.addRestrictedRemoteAddress(FAKE_REMOTE_ADDRESS, RestrictionType.CHAT); assertTrue(database.getRestrictedRemoteAddresses(RestrictionType.CHAT).contains( FAKE_REMOTE_ADDRESS)); database.removeRestrictedRemoteAddress(FAKE_REMOTE_ADDRESS, RestrictionType.CHAT); assertFalse(database.getRestrictedRemoteAddresses(RestrictionType.CHAT).contains( FAKE_REMOTE_ADDRESS)); } @Test public void getThemeRankingOldShouldReturnYearMonthZero() throws Exception { runner.update("DELETE FROM theme_mode_score WHERE USER_CODE = ?", FAKE_USER_CODE); database.updateThemeModeScore(FAKE_USER_CODE, FAKE_THEME, FAKE_SCORE); assertEquals(1, (long) runner.query( "SELECT COUNT(*) FROM theme_mode_score WHERE USER_CODE = ?", new ScalarHandler<Long>(), FAKE_USER_CODE)); assertEquals(0, database.getThemeRankingOld(FAKE_THEME).size()); } @Test public void getThemeRankingAllShouldReturnYearMonthNonZero() throws Exception { runner.update("DELETE FROM theme_mode_score WHERE USER_CODE = ?", FAKE_USER_CODE); database.updateThemeModeScore(FAKE_USER_CODE, FAKE_THEME, FAKE_SCORE); assertEquals(1, (long) runner.query( "SELECT COUNT(*) FROM theme_mode_score WHERE USER_CODE = ?", new ScalarHandler<Long>(), FAKE_USER_CODE)); assertEquals(1, database.getThemeRankingAll(FAKE_THEME).size()); } @Test public void getThemeRankingYearShouldReturnMatchedYearAllMonth() throws Exception { runner.update("DELETE FROM theme_mode_score WHERE USER_CODE = ?", FAKE_USER_CODE); database.updateThemeModeScore(FAKE_USER_CODE, FAKE_THEME, FAKE_SCORE); assertEquals(1, (long) runner.query( "SELECT COUNT(*) FROM theme_mode_score WHERE USER_CODE = ?", new ScalarHandler<Long>(), FAKE_USER_CODE)); DateTime dateTime = new DateTime(); assertEquals(1, database.getThemeRanking(FAKE_THEME, dateTime.getYear()).size()); assertEquals(0, database.getThemeRanking(FAKE_THEME, dateTime.getYear() + 1).size()); } @Test public void getThemeRankingYearMonthShouldReturnMatchedYearAndMonth() throws Exception { runner.update("DELETE FROM theme_mode_score WHERE USER_CODE = ?", FAKE_USER_CODE); database.updateThemeModeScore(FAKE_USER_CODE, FAKE_THEME, FAKE_SCORE); assertEquals(1, (long) runner.query( "SELECT COUNT(*) FROM theme_mode_score WHERE USER_CODE = ?", new ScalarHandler<Long>(), FAKE_USER_CODE)); DateTime dateTime = new DateTime(); assertEquals(1, database.getThemeRanking(FAKE_THEME, dateTime.getYear(), dateTime.getMonthOfYear()).size()); assertEquals(0, database.getThemeRanking(FAKE_THEME, dateTime.getYear() + 1, dateTime.getMonthOfYear()) .size()); assertEquals(0, database.getThemeRanking(FAKE_THEME, dateTime.getYear(), dateTime.getMonthOfYear() + 1) .size()); } @Test public void getThemeRankingDateRangesShouldReturnYearAndMonth() throws Exception { runner.update("DELETE FROM theme_mode_score WHERE USER_CODE = ?", FAKE_USER_CODE); database.updateThemeModeScore(FAKE_USER_CODE, FAKE_THEME, FAKE_SCORE); List<PacketMonth> dateRanges = database.getThemeRankingDateRanges(); DateTime dateTime = new DateTime(); PacketMonth expected = new PacketMonth(); expected.year = dateTime.getYear(); expected.month = dateTime.getMonthOfYear(); assertThat(dateRanges, hasItem(expected)); } @Test public void wrongAnswerHandlerShouldReturnAsIsIfNotSenmusubi() throws Exception { when(mockResultSet.next()).thenReturn(true, false); when(mockResultSet.getString("ANSWER")).thenReturn(FAKE_ANSWER); when(mockResultSet.getInt("COUNT")).thenReturn(FAKE_COUNT); PacketWrongAnswer expected = new PacketWrongAnswer(); expected.answer = FAKE_ANSWER; expected.count = FAKE_COUNT; assertEquals(expected, wrongAnswerHandler.handleRow(mockResultSet)); } @Test public void wrongAnswerHandlerShouldReturnSortAndNormalizeIfSenmusubi() throws Exception { when(mockResultSet.next()).thenReturn(true, false); when(mockResultSet.getString("ANSWER")).thenReturn("C---c\nB---b\nA---a"); when(mockResultSet.getInt("COUNT")).thenReturn(FAKE_COUNT); PacketWrongAnswer expected = new PacketWrongAnswer(); expected.answer = "A<--->a\nB<--->b\nC<--->c"; expected.count = FAKE_COUNT; assertEquals(expected, wrongAnswerHandler.handleRow(mockResultSet)); } }