Tests for join address case preservation

- Fixed one issue where player page showed out of date join address
This commit is contained in:
Aurora Lahtela 2022-09-04 19:06:09 +03:00
parent af24672063
commit 4c2bf7bd52
5 changed files with 61 additions and 16 deletions

View File

@ -114,18 +114,4 @@ public class PerServerMutator {
}
return false;
}
public Optional<String> latestJoinAddress() {
long latest = Long.MIN_VALUE;
String latestJoinAddress = null;
for (DataContainer value : data.values()) {
long registerDate = value.getValue(PerServerKeys.REGISTERED).orElse(Long.MIN_VALUE);
Optional<String> joinAddress = value.getValue(PerServerKeys.JOIN_ADDRESS);
if (registerDate > latest && joinAddress.isPresent()) {
latest = registerDate;
latestJoinAddress = joinAddress.get();
}
}
return Optional.ofNullable(latestJoinAddress);
}
}

View File

@ -32,6 +32,7 @@ import com.djrapitops.plan.gathering.cache.SessionCache;
import com.djrapitops.plan.gathering.domain.GeoInfo;
import com.djrapitops.plan.gathering.domain.PlayerKill;
import com.djrapitops.plan.gathering.domain.WorldTimes;
import com.djrapitops.plan.gathering.domain.event.JoinAddress;
import com.djrapitops.plan.identification.Server;
import com.djrapitops.plan.identification.ServerUUID;
import com.djrapitops.plan.settings.config.PlanConfig;
@ -211,7 +212,10 @@ public class PlayerJSONCreator {
info.put("activity_index", decimals.apply(activityIndex.getValue()));
info.put("activity_index_group", activityIndex.getGroup());
info.put("favorite_server", perServer.favoriteServer().map(favoriteServer -> serverNames.getOrDefault(favoriteServer, favoriteServer.toString())).orElse(locale.getString(GenericLang.UNKNOWN)));
info.put("latest_join_address", perServer.latestJoinAddress().orElse("-"));
info.put("latest_join_address", sessions.latestSession()
.flatMap(session -> session.getExtraData(JoinAddress.class))
.map(JoinAddress::getAddress)
.orElse("-"));
double averagePing = ping.average();
int worstPing = ping.max();
int bestPing = ping.min();

View File

@ -318,7 +318,6 @@ public class LargeStoreQueries {
.filter(Optional::isPresent)
.map(Optional::get)
.map(JoinAddress::getAddress)
// .map(String::toLowerCase)
.filter(address -> !existingJoinAddresses.contains(address))
.distinct()
.forEach(address -> {

View File

@ -32,11 +32,13 @@ import com.djrapitops.plan.settings.config.paths.DataGatheringSettings;
import com.djrapitops.plan.settings.config.paths.ExportSettings;
import com.djrapitops.plan.storage.database.Database;
import com.djrapitops.plan.storage.database.SQLDB;
import com.djrapitops.plan.storage.database.queries.objects.JoinAddressQueries;
import com.djrapitops.plan.storage.database.queries.objects.SessionQueries;
import com.djrapitops.plan.storage.database.queries.objects.UserInfoQueries;
import com.djrapitops.plan.storage.database.sql.tables.JoinAddressTable;
import com.djrapitops.plan.storage.database.transactions.StoreServerInformationTransaction;
import com.djrapitops.plan.storage.database.transactions.commands.RemoveEverythingTransaction;
import com.djrapitops.plan.storage.database.transactions.events.StoreJoinAddressTransaction;
import com.djrapitops.plan.storage.database.transactions.events.StoreServerPlayerTransaction;
import com.djrapitops.plan.storage.database.transactions.events.StoreWorldNameTransaction;
import extension.FullSystemExtension;
@ -90,6 +92,7 @@ class PlayerLeaveEventConsumerTest {
config.set(ExportSettings.PLAYER_PAGES, false);
config.set(ExportSettings.EXPORT_ON_ONLINE_STATUS_CHANGE, false);
config.set(DataGatheringSettings.PRESERVE_JOIN_ADDRESS_CASE, false);
database.executeTransaction(new RemoveEverythingTransaction());
database.executeTransaction(new StoreServerInformationTransaction(new Server(serverUUID, TestConstants.SERVER_NAME, "", TestConstants.VERSION)));
@ -238,4 +241,36 @@ class PlayerLeaveEventConsumerTest {
ExtensionService.getInstance().unregister(extension);
}
}
@Test
void joinAddressCaseIsPreserved(PlanSystem system, PlanConfig config, Database database, ServerUUID serverUUID) {
config.set(DataGatheringSettings.PRESERVE_JOIN_ADDRESS_CASE, true);
SessionCache sessionCache = system.getCacheSystem().getSessionCache();
long sessionStart = System.currentTimeMillis();
ActiveSession activeSession = new ActiveSession(TestConstants.PLAYER_ONE_UUID, serverUUID, sessionStart, "World", GMTimes.SURVIVAL);
activeSession.getExtraData().put(JoinAddress.class, new JoinAddress("PLAY.UPPERCASE.COM"));
sessionCache.cacheSession(TestConstants.PLAYER_ONE_UUID, activeSession);
database.executeTransaction(new StoreJoinAddressTransaction("play.uppercase.com")); // The wrong address
database.executeTransaction(new StoreWorldNameTransaction(serverUUID, "World"));
PlayerLeave leave = createPlayerLeave(createTestPlayer()
.setJoinAddress("PLAY.UPPERCASE.COM"));
underTest.onLeaveGameServer(leave);
waitUntilDatabaseIsDone(database);
List<String> expected = List.of("PLAY.UPPERCASE.COM", "play.uppercase.com", JoinAddressTable.DEFAULT_VALUE_FOR_LOOKUP);
List<String> result = database.query(JoinAddressQueries.allJoinAddresses());
assertEquals(expected, result);
Map<String, Integer> expectedMap = Map.of("PLAY.UPPERCASE.COM", 1);
Map<String, Integer> resultMap = database.query(JoinAddressQueries.latestJoinAddresses(serverUUID));
assertEquals(expectedMap, resultMap);
expectedMap = Map.of("PLAY.UPPERCASE.COM", 1);
resultMap = database.query(JoinAddressQueries.latestJoinAddresses());
assertEquals(expectedMap, resultMap);
}
}

View File

@ -18,6 +18,7 @@ package com.djrapitops.plan.storage.database.queries;
import com.djrapitops.plan.gathering.domain.FinishedSession;
import com.djrapitops.plan.gathering.domain.event.JoinAddress;
import com.djrapitops.plan.settings.config.paths.DataGatheringSettings;
import com.djrapitops.plan.storage.database.DatabaseTestPreparer;
import com.djrapitops.plan.storage.database.queries.objects.BaseUserQueries;
import com.djrapitops.plan.storage.database.queries.objects.JoinAddressQueries;
@ -97,6 +98,26 @@ public interface JoinAddressQueriesTest extends DatabaseTestPreparer {
assertEquals(expected, result);
}
@Test
default void joinAddressPreservesCase() {
joinAddressCanBeUnknown();
config().set(DataGatheringSettings.PRESERVE_JOIN_ADDRESS_CASE, true);
try {
FinishedSession session = RandomData.randomSession(serverUUID(), worlds, playerUUID, player2UUID);
String expectedAddress = "PLAY.UPPERCASE.COM";
session.getExtraData().put(JoinAddress.class, new JoinAddress(expectedAddress));
db().executeTransaction(new StoreSessionTransaction(session));
Map<String, Integer> expected = Map.of(expectedAddress, 1);
Map<String, Integer> result = db().query(JoinAddressQueries.latestJoinAddresses());
assertEquals(expected, result);
} finally {
config().set(DataGatheringSettings.PRESERVE_JOIN_ADDRESS_CASE, false);
}
}
@Test
default void joinAddressUpdateIsUniquePerServer() {
joinAddressCanBeUnknown();