added tests for experience tracking module

refactored some things in experience tracking
changed the paging behaviour for leader board and added check for negative numbers
fixed rank not being correct for further pages
added test-common module to have some common code für tests
fixed command creation
This commit is contained in:
Sheldan
2020-05-30 09:27:41 +02:00
parent 62de5c2255
commit 563564aabe
69 changed files with 2825 additions and 136 deletions

View File

@@ -17,6 +17,14 @@
<artifactId>experience-tracking-int</artifactId> <artifactId>experience-tracking-int</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>dev.sheldan.abstracto</groupId>
<artifactId>test-commons</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -24,7 +24,9 @@ public class DisableExpForRole extends AbstractConditionableCommand {
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
ARole role = (ARole) commandContext.getParameters().getParameters().get(0); checkParameters(commandContext);
List<Object> parameters = commandContext.getParameters().getParameters();
ARole role = (ARole) parameters.get(0);
if(!disabledExpRoleManagementService.isExperienceDisabledForRole(role)) { if(!disabledExpRoleManagementService.isExperienceDisabledForRole(role)) {
disabledExpRoleManagementService.setRoleToBeDisabledForExp(role); disabledExpRoleManagementService.setRoleToBeDisabledForExp(role);
} }

View File

@@ -29,6 +29,7 @@ public class DisableExpGain extends AbstractConditionableCommand {
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
Member para = (Member) commandContext.getParameters().getParameters().get(0); Member para = (Member) commandContext.getParameters().getParameters().get(0);
AUserInAServer userInAServer = userInServerManagementService.loadUser(para); AUserInAServer userInAServer = userInServerManagementService.loadUser(para);
aUserExperienceService.disableExperienceForUser(userInAServer); aUserExperienceService.disableExperienceForUser(userInAServer);

View File

@@ -24,6 +24,7 @@ public class EnableExpForRole extends AbstractConditionableCommand {
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
ARole role = (ARole) commandContext.getParameters().getParameters().get(0); ARole role = (ARole) commandContext.getParameters().getParameters().get(0);
if(disabledExpRoleManagementService.isExperienceDisabledForRole(role)) { if(disabledExpRoleManagementService.isExperienceDisabledForRole(role)) {
disabledExpRoleManagementService.removeRoleToBeDisabledForExp(role); disabledExpRoleManagementService.removeRoleToBeDisabledForExp(role);

View File

@@ -29,6 +29,7 @@ public class EnableExpGain extends AbstractConditionableCommand {
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
Member para = (Member) commandContext.getParameters().getParameters().get(0); Member para = (Member) commandContext.getParameters().getParameters().get(0);
AUserInAServer userInAServer = userInServerManagementService.loadUser(para); AUserInAServer userInAServer = userInServerManagementService.loadUser(para);
aUserExperienceService.enableExperienceForUser(userInAServer); aUserExperienceService.enableExperienceForUser(userInAServer);

View File

@@ -27,6 +27,7 @@ public class ExpScale extends AbstractConditionableCommand {
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
Double scale = (Double) commandContext.getParameters().getParameters().get(0); Double scale = (Double) commandContext.getParameters().getParameters().get(0);
Long guildId = commandContext.getGuild().getIdLong(); Long guildId = commandContext.getGuild().getIdLong();
configService.setDoubleValue(EXP_MULTIPLIER_KEY, guildId, scale); configService.setDoubleValue(EXP_MULTIPLIER_KEY, guildId, scale);

View File

@@ -15,7 +15,6 @@ import dev.sheldan.abstracto.experience.models.LeaderBoard;
import dev.sheldan.abstracto.experience.models.LeaderBoardEntry; import dev.sheldan.abstracto.experience.models.LeaderBoardEntry;
import dev.sheldan.abstracto.experience.models.templates.LeaderBoardModel; import dev.sheldan.abstracto.experience.models.templates.LeaderBoardModel;
import dev.sheldan.abstracto.experience.service.AUserExperienceService; import dev.sheldan.abstracto.experience.service.AUserExperienceService;
import dev.sheldan.abstracto.experience.service.management.UserExperienceManagementService;
import dev.sheldan.abstracto.templating.model.MessageToSend; import dev.sheldan.abstracto.templating.model.MessageToSend;
import dev.sheldan.abstracto.templating.service.TemplateService; import dev.sheldan.abstracto.templating.service.TemplateService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -33,9 +32,6 @@ public class LeaderBoardCommand extends AbstractConditionableCommand {
@Autowired @Autowired
private AUserExperienceService userExperienceService; private AUserExperienceService userExperienceService;
@Autowired
private UserExperienceManagementService userExperienceManagementService;
@Autowired @Autowired
private TemplateService templateService; private TemplateService templateService;
@@ -48,9 +44,10 @@ public class LeaderBoardCommand extends AbstractConditionableCommand {
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
List<Object> parameters = commandContext.getParameters().getParameters(); List<Object> parameters = commandContext.getParameters().getParameters();
// parameter is optional, in case its not present, we default to the 0th page // parameter is optional, in case its not present, we default to the 0th page
Integer page = !parameters.isEmpty() ? (Integer) parameters.get(0) : 0; Integer page = !parameters.isEmpty() ? (Integer) parameters.get(0) : 1;
LeaderBoard leaderBoard = userExperienceService.findLeaderBoardData(commandContext.getUserInitiatedContext().getServer(), page); LeaderBoard leaderBoard = userExperienceService.findLeaderBoardData(commandContext.getUserInitiatedContext().getServer(), page);
LeaderBoardModel leaderBoardModel = (LeaderBoardModel) ContextConverter.fromCommandContext(commandContext, LeaderBoardModel.class); LeaderBoardModel leaderBoardModel = (LeaderBoardModel) ContextConverter.fromCommandContext(commandContext, LeaderBoardModel.class);
leaderBoardModel.setUserExperiences(converter.fromLeaderBoard(leaderBoard)); leaderBoardModel.setUserExperiences(converter.fromLeaderBoard(leaderBoard));

View File

@@ -35,6 +35,7 @@ public class ListDisabledExperienceRoles extends AbstractConditionableCommand {
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
List<ADisabledExpRole> disabledRolesForServer = disabledExpRoleManagementService.getDisabledRolesForServer(commandContext.getUserInitiatedContext().getServer()); List<ADisabledExpRole> disabledRolesForServer = disabledExpRoleManagementService.getDisabledRolesForServer(commandContext.getUserInitiatedContext().getServer());
DisabledExperienceRolesModel disabledExperienceRolesModel = (DisabledExperienceRolesModel) ContextConverter.fromCommandContext(commandContext, DisabledExperienceRolesModel.class); DisabledExperienceRolesModel disabledExperienceRolesModel = (DisabledExperienceRolesModel) ContextConverter.fromCommandContext(commandContext, DisabledExperienceRolesModel.class);
disabledRolesForServer.forEach(aDisabledExpRole -> { disabledRolesForServer.forEach(aDisabledExpRole -> {

View File

@@ -41,11 +41,12 @@ public class Rank extends AbstractConditionableCommand {
private ExperienceLevelService experienceLevelService; private ExperienceLevelService experienceLevelService;
@Autowired @Autowired
protected ChannelService channelService; private ChannelService channelService;
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
RankModel rankModel = (RankModel) ContextConverter.fromCommandContext(commandContext, RankModel.class); RankModel rankModel = (RankModel) ContextConverter.fromCommandContext(commandContext, RankModel.class);
LeaderBoardEntry userRank = userExperienceService.getRankOfUserInServer(commandContext.getUserInitiatedContext().getAUserInAServer()); LeaderBoardEntry userRank = userExperienceService.getRankOfUserInServer(commandContext.getUserInitiatedContext().getAUserInAServer());
rankModel.setRankUser(converter.fromLeaderBoardEntry(userRank)); rankModel.setRankUser(converter.fromLeaderBoardEntry(userRank));

View File

@@ -11,17 +11,14 @@ import dev.sheldan.abstracto.core.exception.RoleNotFoundInGuildException;
import dev.sheldan.abstracto.core.models.database.ARole; import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.RoleService; import dev.sheldan.abstracto.core.service.RoleService;
import dev.sheldan.abstracto.core.service.management.RoleManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeature; import dev.sheldan.abstracto.experience.config.features.ExperienceFeature;
import dev.sheldan.abstracto.experience.service.ExperienceRoleService; import dev.sheldan.abstracto.experience.service.ExperienceRoleService;
import dev.sheldan.abstracto.templating.service.TemplateService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
@Component @Component
@Slf4j @Slf4j
@@ -30,31 +27,21 @@ public class SetExpRole extends AbstractConditionableCommand {
@Autowired @Autowired
private ExperienceRoleService experienceRoleService; private ExperienceRoleService experienceRoleService;
@Autowired
private RoleManagementService roleManagementService;
@Autowired @Autowired
private RoleService roleService; private RoleService roleService;
@Autowired
private TemplateService templateService;
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
Integer level = (Integer) commandContext.getParameters().getParameters().get(0); Integer level = (Integer) commandContext.getParameters().getParameters().get(0);
Long roleId = (Long) commandContext.getParameters().getParameters().get(1); ARole role = (ARole) commandContext.getParameters().getParameters().get(1);
Optional<ARole> roleOpt = roleManagementService.findRole(roleId, commandContext.getUserInitiatedContext().getServer()); AServer server = commandContext.getUserInitiatedContext().getServer();
if(roleOpt.isPresent()) { if(!roleService.isRoleInServer(role)) {
ARole role = roleOpt.get(); throw new RoleNotFoundInGuildException(role.getId(), server.getId());
AServer server = commandContext.getUserInitiatedContext().getServer();
if(!roleService.isRoleInServer(role)) {
throw new RoleNotFoundInGuildException(role.getId(), server.getId());
}
log.info("Setting role {} to be used for level {} on server {}", roleId, level, server.getId());
experienceRoleService.setRoleToLevel(role, level, server, commandContext.getUserInitiatedContext().getChannel());
return CommandResult.fromSuccess();
} }
return CommandResult.fromError(templateService.renderTemplate("could_not_find_role", new Object())); log.info("Setting role {} to be used for level {} on server {}", role.getId(), level, server.getId());
experienceRoleService.setRoleToLevel(role, level, commandContext.getUserInitiatedContext().getChannel());
return CommandResult.fromSuccess();
} }
@Override @Override

View File

@@ -8,7 +8,6 @@ import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.models.database.ARole; import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.service.management.RoleManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeature; import dev.sheldan.abstracto.experience.config.features.ExperienceFeature;
import dev.sheldan.abstracto.experience.service.ExperienceRoleService; import dev.sheldan.abstracto.experience.service.ExperienceRoleService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -20,18 +19,16 @@ import java.util.List;
@Component @Component
public class UnSetExpRole extends AbstractConditionableCommand { public class UnSetExpRole extends AbstractConditionableCommand {
@Autowired
private RoleManagementService roleManagementService;
@Autowired @Autowired
private ExperienceRoleService experienceRoleService; private ExperienceRoleService experienceRoleService;
@Override @Override
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
ARole role = (ARole) commandContext.getParameters().getParameters().get(0); ARole role = (ARole) commandContext.getParameters().getParameters().get(0);
// do not check for the existence of the role, because if the role was deleted, users should be able // do not check for the existence of the role, because if the role was deleted, users should be able
// to get rid of it in the configuration // to get rid of it in the configuration
experienceRoleService.unsetRole(role, commandContext.getUserInitiatedContext().getServer(), commandContext.getUserInitiatedContext().getChannel()); experienceRoleService.unsetRole(role, commandContext.getUserInitiatedContext().getChannel());
return CommandResult.fromSuccess(); return CommandResult.fromSuccess();
} }

View File

@@ -23,7 +23,7 @@ public class ExperienceConfig {
/** /**
* The default multiplier from the properties file. This is used, when the bot joins a new guild. * The default multiplier from the properties file. This is used, when the bot joins a new guild.
*/ */
private Integer expMultiplier; private Double expMultiplier;
/** /**
* The defaul maxLevel from the properties file. This configuration applies globally, as the amount of levels does not depend on the server. * The defaul maxLevel from the properties file. This configuration applies globally, as the amount of levels does not depend on the server.

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.experience.config;
import dev.sheldan.abstracto.core.listener.ServerConfigListener; import dev.sheldan.abstracto.core.listener.ServerConfigListener;
import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.management.ConfigManagementService; import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -24,8 +25,8 @@ public class ExperienceConfigListener implements ServerConfigListener {
@Override @Override
public void updateServerConfig(AServer server) { public void updateServerConfig(AServer server) {
log.info("Setting up experience configuration for server {}.", server.getId()); log.info("Setting up experience configuration for server {}.", server.getId());
service.createIfNotExists(server.getId(), "minExp", experienceConfig.getMinExp().longValue()); service.createIfNotExists(server.getId(), ExperienceFeatureConfig.MIN_EXP_KEY, experienceConfig.getMinExp().longValue());
service.createIfNotExists(server.getId(), "maxExp", experienceConfig.getMaxExp().longValue()); service.createIfNotExists(server.getId(), ExperienceFeatureConfig.MAX_EXP_KEY, experienceConfig.getMaxExp().longValue());
service.createIfNotExists(server.getId(), "expMultiplier", experienceConfig.getExpMultiplier().doubleValue()); service.createIfNotExists(server.getId(), ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, experienceConfig.getExpMultiplier());
} }
} }

View File

@@ -1,12 +1,14 @@
package dev.sheldan.abstracto.experience.config; package dev.sheldan.abstracto.experience.config;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService; import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@Component @Component
public class ExperienceDefaultConfigListener { public class ExperienceDefaultConfigListener {
@@ -19,8 +21,8 @@ public class ExperienceDefaultConfigListener {
@EventListener @EventListener
@Transactional @Transactional
public void handleContextRefreshEvent(ContextRefreshedEvent ctxStartEvt) { public void handleContextRefreshEvent(ContextRefreshedEvent ctxStartEvt) {
defaultConfigManagementService.createDefaultConfig("minExp", experienceConfig.getMinExp().longValue()); defaultConfigManagementService.createDefaultConfig(ExperienceFeatureConfig.MIN_EXP_KEY, experienceConfig.getMinExp().longValue());
defaultConfigManagementService.createDefaultConfig("maxExp", experienceConfig.getMaxExp().longValue()); defaultConfigManagementService.createDefaultConfig(ExperienceFeatureConfig.MAX_EXP_KEY, experienceConfig.getMaxExp().longValue());
defaultConfigManagementService.createDefaultConfig("expMultiplier", experienceConfig.getExpMultiplier().doubleValue()); defaultConfigManagementService.createDefaultConfig(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, experienceConfig.getExpMultiplier());
} }
} }

View File

@@ -12,7 +12,7 @@ import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.Instant; import java.time.Instant;
import java.util.HashMap; import java.util.Map;
import java.util.List; import java.util.List;
@@ -32,7 +32,7 @@ public class ExperiencePersistingJob extends QuartzJobBean {
@Override @Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException { protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
HashMap<Long, List<AServer>> runtimeExperience = userExperienceService.getRuntimeExperience(); Map<Long, List<AServer>> runtimeExperience = userExperienceService.getRuntimeExperience();
log.info("Running experience persisting job."); log.info("Running experience persisting job.");
Long pastMinute = (Instant.now().getEpochSecond() / 60) - 1; Long pastMinute = (Instant.now().getEpochSecond() / 60) - 1;
if(runtimeExperience.containsKey(pastMinute)) { if(runtimeExperience.containsKey(pastMinute)) {

View File

@@ -18,12 +18,11 @@ import java.util.List;
public interface ExperienceRoleRepository extends JpaRepository<AExperienceRole, Long> { public interface ExperienceRoleRepository extends JpaRepository<AExperienceRole, Long> {
/** /**
* Finds the {@link AExperienceRole} of the given {@link AServer} and {@link ARole} * Finds the {@link AExperienceRole} of the given {@link AServer} and {@link ARole}
* @param server The {@link AServer} to retrieve the {@link AExperienceRole} for
* @param role The {@link ARole} to filter for * @param role The {@link ARole} to filter for
* @return The {@link AExperienceRole} found or null if the query did not return any results * @return The {@link AExperienceRole} found or null if the query did not return any results
*/ */
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
AExperienceRole findByRoleServerAndRole(AServer server, ARole role); AExperienceRole findByRole(ARole role);
/** /**
* Finds a list of {@link AExperienceRole} (if there are multiple ones, because of misconfiguration) of the given * Finds a list of {@link AExperienceRole} (if there are multiple ones, because of misconfiguration) of the given

View File

@@ -1,6 +1,5 @@
package dev.sheldan.abstracto.experience.service; package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.ARole; import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.AServer;
@@ -9,6 +8,7 @@ import dev.sheldan.abstracto.core.service.BotService;
import dev.sheldan.abstracto.core.service.ConfigService; import dev.sheldan.abstracto.core.service.ConfigService;
import dev.sheldan.abstracto.core.service.MessageService; import dev.sheldan.abstracto.core.service.MessageService;
import dev.sheldan.abstracto.core.service.RoleService; import dev.sheldan.abstracto.core.service.RoleService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import dev.sheldan.abstracto.experience.models.database.*; import dev.sheldan.abstracto.experience.models.database.*;
import dev.sheldan.abstracto.experience.models.LeaderBoard; import dev.sheldan.abstracto.experience.models.LeaderBoard;
import dev.sheldan.abstracto.experience.models.LeaderBoardEntry; import dev.sheldan.abstracto.experience.models.LeaderBoardEntry;
@@ -36,7 +36,6 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
public class AUserExperienceServiceBean implements AUserExperienceService { public class AUserExperienceServiceBean implements AUserExperienceService {
private HashMap<Long, List<AServer>> runtimeExperience = new HashMap<>();
@Autowired @Autowired
private UserExperienceManagementService userExperienceManagementService; private UserExperienceManagementService userExperienceManagementService;
@@ -68,6 +67,9 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
@Autowired @Autowired
private BotService botService; private BotService botService;
@Autowired
private RunTimeExperienceService runTimeExperienceService;
/** /**
* Creates the user in the runtime experience, if the user was not in yet. Also creates an entry for the minute, if necessary. * Creates the user in the runtime experience, if the user was not in yet. Also creates an entry for the minute, if necessary.
* @param userInAServer The {@link AUserInAServer} to be added to the list of users gaining experience * @param userInAServer The {@link AUserInAServer} to be added to the list of users gaining experience
@@ -75,6 +77,7 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
@Override @Override
public void addExperience(AUserInAServer userInAServer) { public void addExperience(AUserInAServer userInAServer) {
Long second = Instant.now().getEpochSecond() / 60; Long second = Instant.now().getEpochSecond() / 60;
Map<Long, List<AServer>> runtimeExperience = runTimeExperienceService.getRuntimeExperience();
if(runtimeExperience.containsKey(second)) { if(runtimeExperience.containsKey(second)) {
List<AServer> existing = runtimeExperience.get(second); List<AServer> existing = runtimeExperience.get(second);
existing.forEach(server -> { existing.forEach(server -> {
@@ -94,39 +97,40 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
} }
@Override @Override
public HashMap<Long, List<AServer>> getRuntimeExperience() { public Map<Long, List<AServer>> getRuntimeExperience() {
return runtimeExperience; return runTimeExperienceService.getRuntimeExperience();
} }
/** /**
* Calculates the level of the given {@link AUserExperience} accoring to the given {@link AExperienceLevel} list * Calculates the level of the given {@link AUserExperience} accoring to the given {@link AExperienceLevel} list
* @param experience The {@link AUserExperience} to calculate the level for * @param experience The {@link AUserExperience} to calculate the level for
* @param levels The list of {@link AExperienceLevel} representing the level configuration * @param levels The list of {@link AExperienceLevel} representing the level configuration, this must include the initial level 0
* * This level will be taken as the initial value, and if no other level qualifies, this will be taken.
* The levels must be ordered.
* @return The appropriate level according to the level config * @return The appropriate level according to the level config
*/ */
@Override @Override
public Integer calculateLevel(AUserExperience experience, List<AExperienceLevel> levels) { public AExperienceLevel calculateLevel(AUserExperience experience, List<AExperienceLevel> levels) {
AExperienceLevel lastLevel = levels.get(0); AExperienceLevel lastLevel = levels.get(0);
for (AExperienceLevel level : levels) { for (AExperienceLevel level : levels) {
if(level.getExperienceNeeded() >= experience.getExperience()) { if(level.getExperienceNeeded() >= experience.getExperience()) {
return lastLevel.getLevel(); return lastLevel;
} else { } else {
lastLevel = level; lastLevel = level;
} }
} }
return lastLevel.getLevel(); return lastLevel;
} }
@Override @Override
public boolean updateUserlevel(AUserExperience userExperience, List<AExperienceLevel> levels) { public boolean updateUserLevel(AUserExperience userExperience, List<AExperienceLevel> levels) {
AUserInAServer user = userExperience.getUser(); AUserInAServer user = userExperience.getUser();
Integer correctLevel = calculateLevel(userExperience, levels); AExperienceLevel correctLevel = calculateLevel(userExperience, levels);
Integer currentLevel = userExperience.getCurrentLevel() != null ? userExperience.getCurrentLevel().getLevel() : 0; Integer currentLevel = userExperience.getCurrentLevel() != null ? userExperience.getCurrentLevel().getLevel() : 0;
if(!correctLevel.equals(currentLevel)) { if(!correctLevel.getLevel().equals(currentLevel)) {
log.info("User {} leveled from {} to {}", user.getUserReference().getId(), currentLevel, correctLevel); log.info("User {} leveled from {} to {}", user.getUserReference().getId(), currentLevel, correctLevel.getLevel());
AExperienceLevel currentLevel1 = experienceLevelManagementService.getLevel(correctLevel) userExperience.setCurrentLevel(correctLevel);
.orElseThrow(() -> new AbstractoRunTimeException(String.format("Could not find level %s", correctLevel)));
userExperience.setCurrentLevel(currentLevel1);
return true; return true;
} }
return false; return false;
@@ -145,9 +149,9 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
public void handleExperienceGain(List<AServer> servers) { public void handleExperienceGain(List<AServer> servers) {
servers.forEach(serverExp -> { servers.forEach(serverExp -> {
log.trace("Handling experience for server {}", serverExp.getId()); log.trace("Handling experience for server {}", serverExp.getId());
int minExp = configService.getLongValue("minExp", serverExp.getId()).intValue(); int minExp = configService.getLongValue(ExperienceFeatureConfig.MIN_EXP_KEY, serverExp.getId()).intValue();
int maxExp = configService.getLongValue("maxExp", serverExp.getId()).intValue(); int maxExp = configService.getLongValue(ExperienceFeatureConfig.MAX_EXP_KEY, serverExp.getId()).intValue();
Double multiplier = configService.getDoubleValue("expMultiplier", serverExp.getId()); Double multiplier = configService.getDoubleValue(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, serverExp.getId());
PrimitiveIterator.OfInt iterator = new Random().ints(serverExp.getUsers().size(), minExp, maxExp + 1).iterator(); PrimitiveIterator.OfInt iterator = new Random().ints(serverExp.getUsers().size(), minExp, maxExp + 1).iterator();
List<AExperienceLevel> levels = experienceLevelManagementService.getLevelConfig(); List<AExperienceLevel> levels = experienceLevelManagementService.getLevelConfig();
levels.sort(Comparator.comparing(AExperienceLevel::getExperienceNeeded)); levels.sort(Comparator.comparing(AExperienceLevel::getExperienceNeeded));
@@ -163,7 +167,7 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
log.trace("Handling {}. The user gains {}", userInAServer.getUserReference().getId(), gainedExperience); log.trace("Handling {}. The user gains {}", userInAServer.getUserReference().getId(), gainedExperience);
AUserExperience aUserExperience = userExperienceManagementService.incrementExpForUser(userInAServer, gainedExperience.longValue(), 1L); AUserExperience aUserExperience = userExperienceManagementService.incrementExpForUser(userInAServer, gainedExperience.longValue(), 1L);
if(Boolean.FALSE.equals(aUserExperience.getExperienceGainDisabled())) { if(Boolean.FALSE.equals(aUserExperience.getExperienceGainDisabled())) {
updateUserlevel(aUserExperience, levels); updateUserLevel(aUserExperience, levels);
updateUserRole(aUserExperience, roles); updateUserRole(aUserExperience, roles);
userExperienceManagementService.saveUser(aUserExperience); userExperienceManagementService.saveUser(aUserExperience);
} else { } else {
@@ -299,11 +303,16 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
*/ */
@Override @Override
public LeaderBoard findLeaderBoardData(AServer server, Integer page) { public LeaderBoard findLeaderBoardData(AServer server, Integer page) {
List<AUserExperience> experiences = userExperienceManagementService.findLeaderboardUsersPaginated(server, page * 10, (page +1) * 10); if(page <= 0) {
throw new IllegalArgumentException("Page needs to be >= 1");
}
page--;
int pageSize = 10;
List<AUserExperience> experiences = userExperienceManagementService.findLeaderboardUsersPaginated(server, page * pageSize, (page + 1) * pageSize);
List<LeaderBoardEntry> entries = new ArrayList<>(); List<LeaderBoardEntry> entries = new ArrayList<>();
for (int i = 0; i < experiences.size(); i++) { for (int i = 0; i < experiences.size(); i++) {
AUserExperience userExperience = experiences.get(i); AUserExperience userExperience = experiences.get(i);
entries.add(LeaderBoardEntry.builder().experience(userExperience).rank(i + 1).build()); entries.add(LeaderBoardEntry.builder().experience(userExperience).rank((page * pageSize) + i + 1).build());
} }
return LeaderBoard.builder().entries(entries).build(); return LeaderBoard.builder().entries(entries).build();
} }
@@ -316,19 +325,15 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
@Override @Override
public LeaderBoardEntry getRankOfUserInServer(AUserInAServer userInAServer) { public LeaderBoardEntry getRankOfUserInServer(AUserInAServer userInAServer) {
log.info("Retrieving rank for {}", userInAServer.getUserReference().getId()); log.info("Retrieving rank for {}", userInAServer.getUserReference().getId());
AUserExperience experience = userExperienceManagementService.findUserInServer(userInAServer); AUserExperience aUserExperience = userExperienceManagementService.findUserInServer(userInAServer);
LeaderBoardEntryResult rankOfUserInServer = userExperienceManagementService.getRankOfUserInServer(experience); Integer rank = 0;
AExperienceLevel currentLevel = experienceLevelManagementService.getLevel(rankOfUserInServer.getLevel()) if(aUserExperience != null) {
.orElseThrow(() -> new AbstractoRunTimeException(String.format("Could not find level %s", rankOfUserInServer.getLevel()))); LeaderBoardEntryResult rankOfUserInServer = userExperienceManagementService.getRankOfUserInServer(aUserExperience);
AUserExperience aUserExperience = AUserExperience if(rankOfUserInServer != null) {
.builder() rank = rankOfUserInServer.getRank();
.experience(rankOfUserInServer.getExperience()) }
.user(userInAServer) }
.messageCount(rankOfUserInServer.getMessageCount()) return LeaderBoardEntry.builder().experience(aUserExperience).rank(rank).build();
.id(userInAServer.getUserInServerId())
.currentLevel(currentLevel)
.build();
return LeaderBoardEntry.builder().experience(aUserExperience).rank(rankOfUserInServer.getRank()).build();
} }
} }

View File

@@ -41,7 +41,10 @@ public class ExperienceLevelServiceBean implements ExperienceLevelService {
* @param level The level to calculate the experience amount for * @param level The level to calculate the experience amount for
* @return The needed experience to reach this level, if the user already has the level below the passed one * @return The needed experience to reach this level, if the user already has the level below the passed one
*/ */
private Long calculateExperienceForLevel(Integer level) { public Long calculateExperienceForLevel(Integer level) {
if(level < 0) {
throw new IllegalArgumentException("Level should not be less to 0.");
}
return 5L * (level * level) + 50 * level + 100; return 5L * (level * level) + 50 * level + 100;
} }

View File

@@ -1,6 +1,5 @@
package dev.sheldan.abstracto.experience.service; package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.ARole; import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.AServer;
@@ -35,14 +34,13 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService {
* in the given {@link AServer} * in the given {@link AServer}
* @param role The {@link ARole} to set the level to * @param role The {@link ARole} to set the level to
* @param level The level the {@link ARole} should be awareded at * @param level The level the {@link ARole} should be awareded at
* @param server The {@link AServer} for which this configuration should be done
*/ */
@Override @Override
public void setRoleToLevel(ARole role, Integer level, AServer server, AChannel feedbackChannel) { public void setRoleToLevel(ARole role, Integer level, AChannel feedbackChannel) {
AExperienceLevel experienceLevel = experienceLevelService.getLevel(level).orElseThrow(() -> new AbstractoRunTimeException(String.format("Could not find level %s", level))); AExperienceLevel experienceLevel = experienceLevelService.getLevel(level).orElseThrow(() -> new IllegalArgumentException(String.format("Could not find level %s", level)));
unsetRole(role, server, feedbackChannel); unsetRole(role, feedbackChannel);
experienceRoleManagementService.removeAllRoleAssignmentsForLevelInServer(experienceLevel, server); experienceRoleManagementService.removeAllRoleAssignmentsForLevelInServer(experienceLevel, role.getServer());
experienceRoleManagementService.setLevelToRole(experienceLevel, role, server); experienceRoleManagementService.setLevelToRole(experienceLevel, role);
} }
/** /**
@@ -50,15 +48,14 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService {
* {@link net.dv8tion.jda.api.entities.Role}. * {@link net.dv8tion.jda.api.entities.Role}.
* @param role The {@link ARole} to remove from the {@link dev.sheldan.abstracto.experience.models.database.AExperienceRole} * @param role The {@link ARole} to remove from the {@link dev.sheldan.abstracto.experience.models.database.AExperienceRole}
* configuration * configuration
* @param server The {@link AServer} for which the {@link ARole} should be removed from the configuration
*/ */
@Override @Override
public void unsetRole(ARole role, AServer server, AChannel feedbackChannel) { public void unsetRole(ARole role, AChannel feedbackChannel) {
AExperienceRole roleInServer = experienceRoleManagementService.getRoleInServer(role, server); AExperienceRole roleInServer = experienceRoleManagementService.getRoleInServer(role);
if(roleInServer != null) { if(roleInServer != null) {
if(!roleInServer.getUsers().isEmpty()) { if(!roleInServer.getUsers().isEmpty()) {
log.info("Recalculating the roles for {} users, because their current role was removed from experience tracking.", roleInServer.getUsers().size()); log.info("Recalculating the roles for {} users, because their current role was removed from experience tracking.", roleInServer.getUsers().size());
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRolesForServer(server); List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRolesForServer(role.getServer());
roles.removeIf(role1 -> role1.getId().equals(roleInServer.getId())); roles.removeIf(role1 -> role1.getId().equals(roleInServer.getId()));
userExperienceService.executeActionOnUserExperiencesWithFeedBack(roleInServer.getUsers(), feedbackChannel, userExperienceService.executeActionOnUserExperiencesWithFeedBack(roleInServer.getUsers(), feedbackChannel,
@@ -93,7 +90,7 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService {
@Override @Override
public AExperienceLevel getLevelOfNextRole(AExperienceLevel startLevel, AServer server) { public AExperienceLevel getLevelOfNextRole(AExperienceLevel startLevel, AServer server) {
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRolesForServer(server); List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRolesForServer(server);
roles = roles.stream().filter(role -> role.getLevel().getLevel() < startLevel.getLevel()).collect(Collectors.toList()); roles = roles.stream().filter(role -> role.getLevel().getLevel() > startLevel.getLevel()).collect(Collectors.toList());
roles.sort(Comparator.comparing(role -> role.getLevel().getLevel())); roles.sort(Comparator.comparing(role -> role.getLevel().getLevel()));
AExperienceRole aExperienceRole = roles.stream().findFirst().orElse(null); AExperienceRole aExperienceRole = roles.stream().findFirst().orElse(null);
return aExperienceRole != null ? aExperienceRole.getLevel() : AExperienceLevel.builder().level(200).build(); return aExperienceRole != null ? aExperienceRole.getLevel() : AExperienceLevel.builder().level(200).build();

View File

@@ -0,0 +1,18 @@
package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.core.models.database.AServer;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class RunTimeExperienceService {
private Map<Long, List<AServer>> runtimeExperience = new HashMap<>();
public Map<Long, List<AServer>> getRuntimeExperience() {
return runtimeExperience;
}
}

View File

@@ -22,8 +22,7 @@ public class DisabledExpRoleManagementServiceBean implements DisabledExpRoleMana
.role(role) .role(role)
.build(); .build();
disabledExpRoleRepository.save(newRole); return disabledExpRoleRepository.save(newRole);
return newRole;
} }
@Override @Override

View File

@@ -21,8 +21,7 @@ public class ExperienceLevelManagementServiceBean implements ExperienceLevelMana
.experienceNeeded(neededExperience) .experienceNeeded(neededExperience)
.level(level) .level(level)
.build(); .build();
experienceLevelRepository.save(experienceLevel); return experienceLevelRepository.save(experienceLevel);
return experienceLevel;
} }
@Override @Override

View File

@@ -36,8 +36,8 @@ public class ExperienceRoleManagementServiceBean implements ExperienceRoleManage
} }
@Override @Override
public AExperienceRole getRoleInServer(ARole role, AServer server) { public AExperienceRole getRoleInServer(ARole role) {
return experienceRoleRepository.findByRoleServerAndRole(server, role); return experienceRoleRepository.findByRole(role);
} }
@Override @Override
@@ -46,18 +46,19 @@ public class ExperienceRoleManagementServiceBean implements ExperienceRoleManage
} }
@Override @Override
public void setLevelToRole(AExperienceLevel level, ARole role, AServer server) { public AExperienceRole setLevelToRole(AExperienceLevel level, ARole role) {
AExperienceRole byRoleServerAndRole = experienceRoleRepository.findByRoleServerAndRole(server, role); AExperienceRole byRoleServerAndRole = experienceRoleRepository.findByRole(role);
if(byRoleServerAndRole != null) { if(byRoleServerAndRole != null) {
byRoleServerAndRole.setLevel(level); byRoleServerAndRole.setLevel(level);
} else { } else {
byRoleServerAndRole = AExperienceRole byRoleServerAndRole = AExperienceRole
.builder() .builder()
.level(level) .level(level)
.roleServer(server) .roleServer(role.getServer())
.role(role) .role(role)
.build(); .build();
byRoleServerAndRole = experienceRoleRepository.save(byRoleServerAndRole);
} }
experienceRoleRepository.save(byRoleServerAndRole); return byRoleServerAndRole;
} }
} }

View File

@@ -90,8 +90,8 @@ public class UserExperienceManagementServiceBean implements UserExperienceManage
} }
@Override @Override
public void saveUser(AUserExperience userExperience) { public AUserExperience saveUser(AUserExperience userExperience) {
repository.save(userExperience); return repository.save(userExperience);
} }
} }

View File

@@ -0,0 +1,59 @@
package dev.sheldan.abstracto.experience;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.models.database.AExperienceRole;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import dev.sheldan.abstracto.test.MockUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public abstract class ExperienceRelatedTest {
protected List<AUserExperience> getUserExperiences(int count, AServer server) {
List<AUserExperience> experiences = new ArrayList<>();
for (int i = 0; i < count; i++) {
experiences.add(getUserExperienceObject(server, i));
}
return experiences;
}
protected AUserExperience getUserExperienceObject(AServer server, int i) {
AUserInAServer userObject = MockUtils.getUserObject((long)i, server);
AExperienceLevel level = AExperienceLevel
.builder()
.level(i)
.experienceNeeded((long) i * 100)
.build();
return AUserExperience
.builder()
.user(userObject)
.experience((long) i)
.currentLevel(level)
.build();
}
protected List<AExperienceLevel> getLevelConfiguration() {
AExperienceLevel level0 = AExperienceLevel.builder().experienceNeeded(0L).level(0).build();
AExperienceLevel level1 = AExperienceLevel.builder().experienceNeeded(100L).level(1).build();
AExperienceLevel level2 = AExperienceLevel.builder().experienceNeeded(200L).level(2).build();
AExperienceLevel level3 = AExperienceLevel.builder().experienceNeeded(300L).level(3).build();
return new ArrayList<>(Arrays.asList(level0, level1, level2, level3));
}
protected List<AExperienceRole> getExperienceRoles(List<AExperienceLevel> levelsWithRoles, AServer server) {
List<AExperienceRole> roles = new ArrayList<>();
for (int i = 0; i < levelsWithRoles.size(); i++) {
AExperienceLevel level = levelsWithRoles.get(i);
ARole role = ARole.builder().id((long)i).server(server).build();
roles.add(AExperienceRole.builder().level(level).roleServer(server).role(role).build());
}
return roles;
}
}

View File

@@ -0,0 +1,62 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.exception.IncorrectParameter;
import dev.sheldan.abstracto.core.command.exception.InsufficientParameters;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.experience.service.management.DisabledExpRoleManagementService;
import dev.sheldan.abstracto.test.MockUtils;
import dev.sheldan.abstracto.test.command.CommandTestUtilities;
import net.dv8tion.jda.internal.JDAImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class DisableExpForRoleTest {
@InjectMocks
private DisableExpForRole testUnit;
@Mock
private DisabledExpRoleManagementService disabledExpRoleManagementService;
@Mock
private JDAImpl jda;
@Test(expected = InsufficientParameters.class)
public void testTooLittleParameters() {
CommandTestUtilities.executeNoParametersTest(testUnit, jda);
}
@Test(expected = IncorrectParameter.class)
public void testIncorrectParameterType() {
CommandTestUtilities.executeWrongParametersTest(testUnit, jda);
}
@Test
public void testExecuteCommandForNotDisabledRole() {
executeDisableExpForRoleTest(false, 1);
}
@Test
public void testExecuteCommandForDisabledRole() {
executeDisableExpForRoleTest(true, 0);
}
private void executeDisableExpForRoleTest(boolean value, int wantedNumberOfInvocations) {
ARole disabledRole = MockUtils.getRole(1L, MockUtils.getServer());
CommandContext context = CommandTestUtilities.getWithParameters(jda, Arrays.asList(disabledRole));
when(disabledExpRoleManagementService.isExperienceDisabledForRole(disabledRole)).thenReturn(value);
CommandResult result = testUnit.execute(context);
verify(disabledExpRoleManagementService, times(wantedNumberOfInvocations)).setRoleToBeDisabledForExp(disabledRole);
CommandTestUtilities.checkSuccessfulCompletion(result);
}
}

View File

@@ -0,0 +1,61 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.exception.IncorrectParameter;
import dev.sheldan.abstracto.core.command.exception.InsufficientParameters;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.experience.service.AUserExperienceService;
import dev.sheldan.abstracto.test.MockUtils;
import dev.sheldan.abstracto.test.command.CommandTestUtilities;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.internal.JDAImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.*;
import java.util.Arrays;
@RunWith(MockitoJUnitRunner.class)
public class DisableExpGainTest {
@InjectMocks
private DisableExpGain testUnit;
@Mock
private AUserExperienceService aUserExperienceService;
@Mock
private UserInServerManagementService userInServerManagementService;
@Mock
private JDAImpl jda;
@Test(expected = InsufficientParameters.class)
public void testTooLittleParameters() {
CommandTestUtilities.executeNoParametersTest(testUnit, jda);
}
@Test(expected = IncorrectParameter.class)
public void testIncorrectParameterType() {
CommandTestUtilities.executeWrongParametersTest(testUnit, jda);
}
@Test
public void testDisableExpForMember() {
CommandContext noParameters = CommandTestUtilities.getNoParameters(jda);
AUserInAServer parameterUser = MockUtils.getUserObject(4L, noParameters.getUserInitiatedContext().getServer());
Member member = MockUtils.getMockedMember(noParameters.getUserInitiatedContext().getServer(), parameterUser, jda);
CommandContext context = CommandTestUtilities.enhanceWithParameters(noParameters, Arrays.asList(member));
when(userInServerManagementService.loadUser(member)).thenReturn(parameterUser);
CommandResult result = testUnit.execute(context);
verify(aUserExperienceService, times(1)).disableExperienceForUser(parameterUser);
CommandTestUtilities.checkSuccessfulCompletion(result);
}
}

View File

@@ -0,0 +1,62 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.exception.IncorrectParameter;
import dev.sheldan.abstracto.core.command.exception.InsufficientParameters;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.experience.service.management.DisabledExpRoleManagementService;
import dev.sheldan.abstracto.test.MockUtils;
import dev.sheldan.abstracto.test.command.CommandTestUtilities;
import net.dv8tion.jda.internal.JDAImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class EnableExpForRoleTest {
@InjectMocks
private EnableExpForRole testUnit;
@Mock
private DisabledExpRoleManagementService disabledExpRoleManagementService;
@Mock
private JDAImpl jda;
@Test(expected = InsufficientParameters.class)
public void testTooLittleParameters() {
CommandTestUtilities.executeNoParametersTest(testUnit, jda);
}
@Test(expected = IncorrectParameter.class)
public void testIncorrectParameterType() {
CommandTestUtilities.executeWrongParametersTest(testUnit, jda);
}
@Test
public void testExecuteCommandForNotDisabledRole() {
executeEnableExpForRoleTest(false, 0);
}
@Test
public void testExecuteCommandForDisabledRole() {
executeEnableExpForRoleTest(true, 1);
}
private void executeEnableExpForRoleTest(boolean value, int wantedNumberOfInvocations) {
ARole disabledRole = MockUtils.getRole(1L, MockUtils.getServer());
CommandContext context = CommandTestUtilities.getWithParameters(jda, Arrays.asList(disabledRole));
when(disabledExpRoleManagementService.isExperienceDisabledForRole(disabledRole)).thenReturn(value);
CommandResult result = testUnit.execute(context);
verify(disabledExpRoleManagementService, times(wantedNumberOfInvocations)).removeRoleToBeDisabledForExp(disabledRole);
CommandTestUtilities.checkSuccessfulCompletion(result);
}
}

View File

@@ -0,0 +1,61 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.exception.IncorrectParameter;
import dev.sheldan.abstracto.core.command.exception.InsufficientParameters;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.experience.service.AUserExperienceService;
import dev.sheldan.abstracto.test.MockUtils;
import dev.sheldan.abstracto.test.command.CommandTestUtilities;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.internal.JDAImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class EnableExpGainTest {
@InjectMocks
private EnableExpGain testUnit;
@Mock
private AUserExperienceService aUserExperienceService;
@Mock
private UserInServerManagementService userInServerManagementService;
@Mock
private JDAImpl jda;
@Test(expected = InsufficientParameters.class)
public void testTooLittleParameters() {
CommandTestUtilities.executeNoParametersTest(testUnit, jda);
}
@Test(expected = IncorrectParameter.class)
public void testIncorrectParameterType() {
CommandTestUtilities.executeWrongParametersTest(testUnit, jda);
}
@Test
public void testEnableExpForMember() {
CommandContext noParameters = CommandTestUtilities.getNoParameters(jda);
AUserInAServer parameterUser = MockUtils.getUserObject(4L, noParameters.getUserInitiatedContext().getServer());
Member member = MockUtils.getMockedMember(noParameters.getUserInitiatedContext().getServer(), parameterUser, jda);
CommandContext context = CommandTestUtilities.enhanceWithParameters(noParameters, Arrays.asList(member));
when(userInServerManagementService.loadUser(member)).thenReturn(parameterUser);
CommandResult result = testUnit.execute(context);
verify(aUserExperienceService, times(1)).enableExperienceForUser(parameterUser);
CommandTestUtilities.checkSuccessfulCompletion(result);
}
}

View File

@@ -0,0 +1,51 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.exception.IncorrectParameter;
import dev.sheldan.abstracto.core.command.exception.InsufficientParameters;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.service.ConfigService;
import dev.sheldan.abstracto.test.command.CommandTestUtilities;
import net.dv8tion.jda.internal.JDAImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ExpScaleTest {
@InjectMocks
private ExpScale testUnit;
@Mock
private ConfigService configService;
@Mock
private JDAImpl jda;
@Test(expected = InsufficientParameters.class)
public void testTooLittleParameters() {
CommandTestUtilities.executeNoParametersTest(testUnit, jda);
}
@Test(expected = IncorrectParameter.class)
public void testIncorrectParameterType() {
CommandTestUtilities.executeWrongParametersTest(testUnit, jda);
}
@Test
public void testSetExpScaleForGuild() {
double newScale = 4.5;
CommandContext context = CommandTestUtilities.getWithParameters(jda, Arrays.asList(newScale));
CommandResult result = testUnit.execute(context);
CommandTestUtilities.checkSuccessfulCompletion(result);
verify(configService, times(1)).setDoubleValue(ExpScale.EXP_MULTIPLIER_KEY, context.getGuild().getIdLong(), newScale);
}
}

View File

@@ -0,0 +1,78 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.exception.IncorrectParameter;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.service.ChannelService;
import dev.sheldan.abstracto.experience.converter.LeaderBoardModelConverter;
import dev.sheldan.abstracto.experience.models.LeaderBoard;
import dev.sheldan.abstracto.experience.models.LeaderBoardEntry;
import dev.sheldan.abstracto.experience.models.templates.LeaderBoardEntryModel;
import dev.sheldan.abstracto.experience.models.templates.LeaderBoardModel;
import dev.sheldan.abstracto.experience.service.AUserExperienceService;
import dev.sheldan.abstracto.templating.model.MessageToSend;
import dev.sheldan.abstracto.templating.service.TemplateService;
import dev.sheldan.abstracto.test.command.CommandTestUtilities;
import net.dv8tion.jda.internal.JDAImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.Arrays;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class LeaderBoardCommandTest {
@InjectMocks
private LeaderBoardCommand testUnit;
@Mock
private AUserExperienceService userExperienceService;
@Mock
private TemplateService templateService;
@Mock
private ChannelService channelService;
@Mock
private LeaderBoardModelConverter converter;
@Mock
private JDAImpl jda;
@Test(expected = IncorrectParameter.class)
public void testIncorrectParameterType() {
CommandTestUtilities.executeWrongParametersTest(testUnit, jda);
}
@Test
public void testLeaderBoardWithNoParameter() {
testLeaderBoardCommand(CommandTestUtilities.getNoParameters(jda), 1);
}
@Test
public void testLeaderBoardWithPageParameter() {
testLeaderBoardCommand(CommandTestUtilities.getWithParameters(jda, Arrays.asList(5)), 5);
}
private void testLeaderBoardCommand(CommandContext context, int expectedPage) {
LeaderBoard leaderBoard = LeaderBoard.builder().build();
when(userExperienceService.findLeaderBoardData(context.getUserInitiatedContext().getServer(), expectedPage)).thenReturn(leaderBoard);
when(converter.fromLeaderBoard(leaderBoard)).thenReturn(new ArrayList<>());
LeaderBoardEntry executingUserRank = LeaderBoardEntry.builder().build();
when(userExperienceService.getRankOfUserInServer(context.getUserInitiatedContext().getAUserInAServer())).thenReturn(executingUserRank);
LeaderBoardEntryModel leaderBoardEntryModel = LeaderBoardEntryModel.builder().build();
when(converter.fromLeaderBoardEntry(executingUserRank)).thenReturn(leaderBoardEntryModel);
MessageToSend messageToSend = MessageToSend.builder().build();
when(templateService.renderEmbedTemplate(eq(LeaderBoardCommand.LEADERBOARD_POST_EMBED_TEMPLATE), any(LeaderBoardModel.class))).thenReturn(messageToSend);
CommandResult result = testUnit.execute(context);
verify(channelService, times(1)).sendMessageToSendToChannel(messageToSend, context.getChannel());
CommandTestUtilities.checkSuccessfulCompletion(result);
}
}

View File

@@ -0,0 +1,69 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.ChannelService;
import dev.sheldan.abstracto.core.service.RoleService;
import dev.sheldan.abstracto.experience.models.database.ADisabledExpRole;
import dev.sheldan.abstracto.experience.models.templates.DisabledExperienceRolesModel;
import dev.sheldan.abstracto.experience.service.management.DisabledExpRoleManagementService;
import dev.sheldan.abstracto.test.MockUtils;
import dev.sheldan.abstracto.test.command.CommandTestUtilities;
import net.dv8tion.jda.internal.JDAImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.Arrays;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ListDisabledExperienceRolesTest {
@InjectMocks
private ListDisabledExperienceRoles testUnit;
@Mock
private DisabledExpRoleManagementService disabledExpRoleManagementService;
@Mock
private RoleService roleService;
@Mock
private ChannelService channelService;
@Mock
private JDAImpl jda;
@Test
public void testCommandExecutionNoRolesFound() {
CommandContext context = CommandTestUtilities.getNoParameters(jda);
AServer server = context.getUserInitiatedContext().getServer();
when(disabledExpRoleManagementService.getDisabledRolesForServer(server)).thenReturn(new ArrayList<>());
CommandResult result = testUnit.execute(context);
CommandTestUtilities.checkSuccessfulCompletion(result);
verify(roleService, times(0)).getRoleFromGuild(any(ARole.class));
verify(channelService, times(1)).sendEmbedTemplateInChannel(eq("list_disabled_experience_roles"),
any(DisabledExperienceRolesModel.class), eq(context.getChannel()));
}
@Test
public void testCommandExecutionRolesFound() {
CommandContext context = CommandTestUtilities.getNoParameters(jda);
AServer server = context.getUserInitiatedContext().getServer();
ADisabledExpRole disabledExpRole1 = ADisabledExpRole.builder().role(MockUtils.getRole(4L, server)).build();
ADisabledExpRole disabledExpRole2 = ADisabledExpRole.builder().role(MockUtils.getRole(6L, server)).build();
when(disabledExpRoleManagementService.getDisabledRolesForServer(server)).thenReturn(Arrays.asList(disabledExpRole1, disabledExpRole2));
CommandResult result = testUnit.execute(context);
CommandTestUtilities.checkSuccessfulCompletion(result);
verify(roleService, times(2)).getRoleFromGuild(any(ARole.class));
verify(channelService, times(1)).sendEmbedTemplateInChannel(eq("list_disabled_experience_roles"),
any(DisabledExperienceRolesModel.class), eq(context.getChannel()));
}
}

View File

@@ -0,0 +1,69 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.service.ChannelService;
import dev.sheldan.abstracto.experience.converter.LeaderBoardModelConverter;
import dev.sheldan.abstracto.experience.models.LeaderBoardEntry;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import dev.sheldan.abstracto.experience.models.templates.LeaderBoardEntryModel;
import dev.sheldan.abstracto.experience.models.templates.RankModel;
import dev.sheldan.abstracto.experience.service.AUserExperienceService;
import dev.sheldan.abstracto.experience.service.ExperienceLevelService;
import dev.sheldan.abstracto.templating.model.MessageToSend;
import dev.sheldan.abstracto.templating.service.TemplateService;
import dev.sheldan.abstracto.test.command.CommandTestUtilities;
import net.dv8tion.jda.internal.JDAImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class RankTest {
@InjectMocks
private Rank testUnit;
@Mock
private LeaderBoardModelConverter converter;
@Mock
private TemplateService templateService;
@Mock
private AUserExperienceService userExperienceService;
@Mock
private ExperienceLevelService experienceLevelService;
@Mock
private ChannelService channelService;
@Mock
private JDAImpl jda;
@Test
public void testRankExecution() {
int currentLevelValue = 50;
long currentExperience = 50L;
CommandContext context = CommandTestUtilities.getNoParameters(jda);
AExperienceLevel currentLevel = AExperienceLevel.builder().level(currentLevelValue).build();
AUserExperience aUserExperience = AUserExperience.builder().experience(currentExperience).currentLevel(currentLevel).build();
LeaderBoardEntry leaderBoardEntry = LeaderBoardEntry.builder().experience(aUserExperience).build();
when(userExperienceService.getRankOfUserInServer(context.getUserInitiatedContext().getAUserInAServer())).thenReturn(leaderBoardEntry);
LeaderBoardEntryModel leaderBoardEntryModel = LeaderBoardEntryModel.builder().build();
when(converter.fromLeaderBoardEntry(leaderBoardEntry)).thenReturn(leaderBoardEntryModel);
when(experienceLevelService.calculateExperienceToNextLevel(currentLevelValue, currentExperience)).thenReturn(140L);
MessageToSend messageToSend = MessageToSend.builder().build();
when(templateService.renderEmbedTemplate(eq(Rank.RANK_POST_EMBED_TEMPLATE), any(RankModel.class))).thenReturn(messageToSend);
CommandResult result = testUnit.execute(context);
verify(channelService, Mockito.times(1)).sendMessageToSendToChannel(messageToSend, context.getChannel());
CommandTestUtilities.checkSuccessfulCompletion(result);
}
}

View File

@@ -0,0 +1,82 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.exception.IncorrectParameter;
import dev.sheldan.abstracto.core.command.exception.InsufficientParameters;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.exception.RoleNotFoundInGuildException;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.service.RoleService;
import dev.sheldan.abstracto.experience.service.ExperienceRoleService;
import dev.sheldan.abstracto.test.MockUtils;
import dev.sheldan.abstracto.test.command.CommandTestUtilities;
import net.dv8tion.jda.internal.JDAImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class SetExpRoleTest {
@InjectMocks
private SetExpRole testUnit;
@Mock
private ExperienceRoleService experienceRoleService;
@Mock
private RoleService roleService;
@Mock
private JDAImpl jda;
@Test(expected = InsufficientParameters.class)
public void testTooLittleParameters() {
CommandTestUtilities.executeNoParametersTest(testUnit, jda);
}
@Test(expected = InsufficientParameters.class)
public void testRoleMissing() {
CommandContext context = CommandTestUtilities.getWithParameters(jda, Arrays.asList(4));
testUnit.execute(context);
}
@Test(expected = IncorrectParameter.class)
public void testIncorrectParameterType() {
CommandTestUtilities.executeWrongParametersTest(testUnit, jda);
}
@Test(expected = IncorrectParameter.class)
public void testLevelProvidedButNotRole() {
CommandContext context = CommandTestUtilities.getWithParameters(jda, Arrays.asList(4, ""));
testUnit.execute(context);
}
@Test
public void setExpRole() {
CommandContext noParameters = CommandTestUtilities.getNoParameters(jda);
ARole changedRole = MockUtils.getRole(4L, noParameters.getUserInitiatedContext().getServer());
Integer levelToSetTo = 4;
CommandContext context = CommandTestUtilities.enhanceWithParameters(noParameters, Arrays.asList(levelToSetTo, changedRole));
when(roleService.isRoleInServer(changedRole)).thenReturn(true);
CommandResult result = testUnit.execute(context);
CommandTestUtilities.checkSuccessfulCompletion(result);
verify(experienceRoleService, times(1)).setRoleToLevel(changedRole, levelToSetTo, context.getUserInitiatedContext().getChannel());
}
@Test(expected = RoleNotFoundInGuildException.class)
public void setExpRoleNotExistingOnServer() {
CommandContext noParameters = CommandTestUtilities.getNoParameters(jda);
ARole changedRole = MockUtils.getRole(4L, noParameters.getUserInitiatedContext().getServer());
Integer levelToSetTo = 4;
CommandContext context = CommandTestUtilities.enhanceWithParameters(noParameters, Arrays.asList(levelToSetTo, changedRole));
when(roleService.isRoleInServer(changedRole)).thenReturn(false);
testUnit.execute(context);
}
}

View File

@@ -0,0 +1,39 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.experience.service.AUserExperienceService;
import dev.sheldan.abstracto.test.command.CommandTestUtilities;
import net.dv8tion.jda.internal.JDAImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class SyncRolesTest {
@InjectMocks
private SyncRoles testUnit;
@Mock
private AUserExperienceService userExperienceService;
@Mock
private JDAImpl jda;
@Test
public void executeCommand() {
CommandContext context = CommandTestUtilities.getNoParameters(jda);
CommandResult result = testUnit.execute(context);
AServer server = context.getUserInitiatedContext().getServer();
AChannel channel = context.getUserInitiatedContext().getChannel();
verify(userExperienceService, times(1)).syncUserRolesWithFeedback(server, channel);
CommandTestUtilities.checkSuccessfulCompletion(result);
}
}

View File

@@ -0,0 +1,54 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.exception.IncorrectParameter;
import dev.sheldan.abstracto.core.command.exception.InsufficientParameters;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.experience.service.ExperienceRoleService;
import dev.sheldan.abstracto.test.MockUtils;
import dev.sheldan.abstracto.test.command.CommandTestUtilities;
import net.dv8tion.jda.internal.JDAImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@RunWith(MockitoJUnitRunner.class)
public class UnSetExpRoleTest {
@InjectMocks
private UnSetExpRole testUnit;
@Mock
private ExperienceRoleService experienceRoleService;
@Mock
private JDAImpl jda;
@Test(expected = InsufficientParameters.class)
public void testTooLittleParameters() {
CommandTestUtilities.executeNoParametersTest(testUnit, jda);
}
@Test(expected = IncorrectParameter.class)
public void testIncorrectParameterType() {
CommandTestUtilities.executeWrongParametersTest(testUnit, jda);
}
@Test
public void setUnSetExpRole() {
CommandContext noParameters = CommandTestUtilities.getNoParameters(jda);
ARole changedRole = MockUtils.getRole(4L, noParameters.getUserInitiatedContext().getServer());
CommandContext context = CommandTestUtilities.enhanceWithParameters(noParameters, Arrays.asList(changedRole));
CommandResult result = testUnit.execute(context);
CommandTestUtilities.checkSuccessfulCompletion(result);
verify(experienceRoleService, times(1)).unsetRole(changedRole, context.getUserInitiatedContext().getChannel());
}
}

View File

@@ -0,0 +1,57 @@
package dev.sheldan.abstracto.experience.config;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import dev.sheldan.abstracto.test.MockUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.List;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ExperienceConfigListenerTest {
@InjectMocks
private ExperienceConfigListener testUnit;
@Mock
private ExperienceConfig experienceConfig;
@Mock
private ConfigManagementService service;
@Captor
private ArgumentCaptor<Long> configValueCaptor;
@Captor
private ArgumentCaptor<String> configKeyCaptor;
@Test
public void setSettingUp() {
int minExp = 4;
int maxExp = 10;
double expMultiplier = 2;
when(experienceConfig.getMinExp()).thenReturn(minExp);
when(experienceConfig.getMaxExp()).thenReturn(maxExp);
when(experienceConfig.getExpMultiplier()).thenReturn(expMultiplier);
AServer server = MockUtils.getServer();
testUnit.updateServerConfig(server);
verify(service, times(2)).createIfNotExists(eq(server.getId()), configKeyCaptor.capture(), configValueCaptor.capture());
verify(service, times(1)).createIfNotExists(server.getId(), ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, expMultiplier);
List<String> configKeys = configKeyCaptor.getAllValues();
List<Long> configValues = configValueCaptor.getAllValues();
Assert.assertEquals(ExperienceFeatureConfig.MIN_EXP_KEY, configKeys.get(0));
Assert.assertEquals(minExp, configValues.get(0).intValue());
Assert.assertEquals(ExperienceFeatureConfig.MAX_EXP_KEY, configKeys.get(1));
Assert.assertEquals(maxExp, configValues.get(1).intValue());
}
}

View File

@@ -0,0 +1,54 @@
package dev.sheldan.abstracto.experience.config;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.List;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ExperienceDefaultConfigListenerTest {
@InjectMocks
private ExperienceDefaultConfigListener testUnit;
@Mock
private ExperienceConfig experienceConfig;
@Mock
private DefaultConfigManagementService service;
@Captor
private ArgumentCaptor<Long> configValueCaptor;
@Captor
private ArgumentCaptor<String> configKeyCaptor;
@Test
public void setSettingUp() {
int minExp = 4;
int maxExp = 10;
double expMultiplier = 2;
when(experienceConfig.getMinExp()).thenReturn(minExp);
when(experienceConfig.getMaxExp()).thenReturn(maxExp);
when(experienceConfig.getExpMultiplier()).thenReturn(expMultiplier);
testUnit.handleContextRefreshEvent(null);
verify(service, times(2)).createDefaultConfig(configKeyCaptor.capture(), configValueCaptor.capture());
verify(service, times(1)).createDefaultConfig(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, expMultiplier);
List<String> configKeys = configKeyCaptor.getAllValues();
List<Long> configValues = configValueCaptor.getAllValues();
Assert.assertEquals(ExperienceFeatureConfig.MIN_EXP_KEY, configKeys.get(0));
Assert.assertEquals(minExp, configValues.get(0).intValue());
Assert.assertEquals(ExperienceFeatureConfig.MAX_EXP_KEY, configKeys.get(1));
Assert.assertEquals(maxExp, configValues.get(1).intValue());
}
}

View File

@@ -0,0 +1,75 @@
package dev.sheldan.abstracto.experience.converter;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.BotService;
import dev.sheldan.abstracto.experience.ExperienceRelatedTest;
import dev.sheldan.abstracto.experience.models.LeaderBoard;
import dev.sheldan.abstracto.experience.models.LeaderBoardEntry;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import dev.sheldan.abstracto.experience.models.templates.LeaderBoardEntryModel;
import dev.sheldan.abstracto.test.MockUtils;
import net.dv8tion.jda.internal.JDAImpl;
import net.dv8tion.jda.internal.entities.MemberImpl;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
import java.util.List;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class LeaderBoardModelConverterTest extends ExperienceRelatedTest {
@InjectMocks
public LeaderBoardModelConverter testUnit;
@Mock
private BotService botService;
@Mock
private JDAImpl jda;
@Test
public void testFromLeaderBoard() {
AServer server = MockUtils.getServer();
int firstRank = 1;
int firstExperience = 1;
LeaderBoardEntry entry = getEntry(server, firstExperience, firstRank);
int secondRank = 2;
int secondExperience = 2;
LeaderBoardEntry entry2 = getEntry(server, secondExperience, secondRank);
List<LeaderBoardEntry> entries = Arrays.asList(entry, entry2);
LeaderBoard leaderBoard = LeaderBoard.builder().entries(entries).build();
List<LeaderBoardEntryModel> leaderBoardEntryModels = testUnit.fromLeaderBoard(leaderBoard);
LeaderBoardEntryModel firstEntry = leaderBoardEntryModels.get(0);
Assert.assertEquals(firstRank, firstEntry.getRank().intValue());
Assert.assertEquals(firstExperience, firstEntry.getExperience().getExperience().longValue());
LeaderBoardEntryModel secondEntry = leaderBoardEntryModels.get(1);
Assert.assertEquals(secondRank, secondEntry.getRank().intValue());
Assert.assertEquals(secondExperience, secondEntry.getExperience().getExperience().longValue());
Assert.assertEquals(entries.size(), leaderBoardEntryModels.size());
}
@Test
public void testFromEntry() {
AServer server = MockUtils.getServer();
AUserExperience experience = getUserExperienceObject(server, 3);
LeaderBoardEntry entry = LeaderBoardEntry.builder().experience(experience).rank(1).build();
MemberImpl member = MockUtils.getMockedMember(server, experience.getUser(), jda);
when(botService.getMemberInServer(server.getId(), experience.getUser().getUserReference().getId())).thenReturn(member);
LeaderBoardEntryModel leaderBoardEntryModel = testUnit.fromLeaderBoardEntry(entry);
Assert.assertEquals(1, leaderBoardEntryModel.getRank().intValue());
Assert.assertEquals(experience.getUser().getUserReference().getId(), leaderBoardEntryModel.getExperience().getUser().getUserReference().getId());
Assert.assertEquals(experience.getUser().getUserReference().getId().longValue(), leaderBoardEntryModel.getMember().getUser().getIdLong());
}
private LeaderBoardEntry getEntry(AServer server, Integer experienceParameter, Integer rank) {
AUserExperience firstExperience = getUserExperienceObject(server, experienceParameter);
return LeaderBoardEntry.builder().rank(rank).experience(firstExperience).build();
}
}

View File

@@ -0,0 +1,47 @@
package dev.sheldan.abstracto.experience.listener;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.experience.ExperienceRelatedTest;
import dev.sheldan.abstracto.experience.service.AUserExperienceService;
import dev.sheldan.abstracto.test.MockUtils;
import net.dv8tion.jda.internal.JDAImpl;
import net.dv8tion.jda.internal.entities.MemberImpl;
import net.dv8tion.jda.internal.entities.ReceivedMessage;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ExperienceTrackerListenerTest extends ExperienceRelatedTest {
@InjectMocks
public ExperienceTrackerListener testUnit;
@Mock
private AUserExperienceService userExperienceService;
@Mock
private UserInServerManagementService userInServerManagementService;
@Mock
private JDAImpl jda;
@Test
public void testExperienceTracking() {
AServer server = AServer.builder().id(3L).build();
AUser user = AUser.builder().id(4L).build();
AUserInAServer userInAServer = AUserInAServer.builder().userReference(user).serverReference(server).build();
MemberImpl member = MockUtils.getMockedMember(server, userInAServer, jda);
ReceivedMessage mockedMessage = MockUtils.buildMockedMessage(1L, "text", member);
when(userInServerManagementService.loadUser(member)).thenReturn(userInAServer);
testUnit.execute(mockedMessage);
verify(userExperienceService, times(1)).addExperience(userInAServer);
}
}

View File

@@ -0,0 +1,63 @@
package dev.sheldan.abstracto.experience.listener;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.experience.ExperienceRelatedTest;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import dev.sheldan.abstracto.experience.service.AUserExperienceService;
import dev.sheldan.abstracto.experience.service.management.UserExperienceManagementService;
import dev.sheldan.abstracto.test.MockUtils;
import net.dv8tion.jda.internal.JDAImpl;
import net.dv8tion.jda.internal.entities.GuildImpl;
import net.dv8tion.jda.internal.entities.MemberImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class JoiningUserRoleListenerTest extends ExperienceRelatedTest {
@InjectMocks
private JoiningUserRoleListener testUnit;
@Mock
private UserExperienceManagementService userExperienceManagementService;
@Mock
private AUserExperienceService userExperienceService;
@Mock
private JDAImpl jda;
@Test
public void testUserWithExperienceRejoining() {
AServer server = AServer.builder().id(3L).build();
AUser user = AUser.builder().id(1L).build();
AUserInAServer aUserInAServer = AUserInAServer.builder().userInServerId(2L).userReference(user).build();
MemberImpl member = MockUtils.getMockedMember(server, aUserInAServer, jda);
GuildImpl guild = MockUtils.getGuild(server, jda);
AUserExperience experience = AUserExperience.builder().experience(3L).user(aUserInAServer).build();
when(userExperienceManagementService.findUserInServer(aUserInAServer)).thenReturn(experience);
testUnit.execute(member, guild, aUserInAServer);
verify(userExperienceService, times(1)).syncForSingleUser(experience);
}
@Test
public void testUserWithOutExperienceRejoining() {
AServer server = AServer.builder().id(3L).build();
AUser user = AUser.builder().id(1L).build();
AUserInAServer aUserInAServer = AUserInAServer.builder().userInServerId(2L).userReference(user).build();
MemberImpl member = MockUtils.getMockedMember(server, aUserInAServer, jda);
GuildImpl guild = MockUtils.getGuild(server, jda);
AUserExperience experience = AUserExperience.builder().experience(3L).user(aUserInAServer).build();
when(userExperienceManagementService.findUserInServer(aUserInAServer)).thenReturn(null);
testUnit.execute(member, guild, aUserInAServer);
verify(userExperienceService, times(0)).syncForSingleUser(experience);
}
}

View File

@@ -0,0 +1,662 @@
package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.models.database.*;
import dev.sheldan.abstracto.core.service.BotService;
import dev.sheldan.abstracto.core.service.ConfigService;
import dev.sheldan.abstracto.core.service.MessageService;
import dev.sheldan.abstracto.core.service.RoleService;
import dev.sheldan.abstracto.experience.ExperienceRelatedTest;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import dev.sheldan.abstracto.experience.models.LeaderBoard;
import dev.sheldan.abstracto.experience.models.LeaderBoardEntry;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.models.database.AExperienceRole;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import dev.sheldan.abstracto.experience.models.templates.UserSyncStatusModel;
import dev.sheldan.abstracto.experience.service.management.DisabledExpRoleManagementService;
import dev.sheldan.abstracto.experience.service.management.ExperienceLevelManagementService;
import dev.sheldan.abstracto.experience.service.management.ExperienceRoleManagementService;
import dev.sheldan.abstracto.experience.service.management.UserExperienceManagementService;
import dev.sheldan.abstracto.templating.model.MessageToSend;
import dev.sheldan.abstracto.templating.service.TemplateService;
import dev.sheldan.abstracto.test.MockUtils;
import net.dv8tion.jda.internal.JDAImpl;
import net.dv8tion.jda.internal.entities.*;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.*;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
@RunWith(MockitoJUnitRunner.class)
public class AUserExperienceServiceBeanTest extends ExperienceRelatedTest {
@InjectMocks
private AUserExperienceServiceBean testUnit;
@Mock
private UserExperienceManagementService userExperienceManagementService;
@Mock
private ExperienceRoleService experienceRoleService;
@Mock
private ExperienceLevelManagementService experienceLevelManagementService;
@Mock
private ExperienceRoleManagementService experienceRoleManagementService;
@Mock
private ConfigService configService;
@Mock
private RoleService roleService;
@Mock
private MessageService messageService;
@Mock
private TemplateService templateService;
@Mock
private DisabledExpRoleManagementService disabledExpRoleManagementService;
@Mock
private BotService botService;
@Mock
private JDAImpl jda;
@Mock
private RunTimeExperienceService runTimeExperienceService;
@Captor
private ArgumentCaptor<AUserExperience> aUserExperienceArgumentCaptor;
@Test
public void testCalculateLevelTooLow() {
AUserExperience experienceToCalculate = AUserExperience.builder().experience(50L).build();
List<AExperienceLevel> levels = getLevelConfiguration();
AExperienceLevel calculatedLevel = testUnit.calculateLevel(experienceToCalculate, levels);
Assert.assertEquals(0, calculatedLevel.getLevel().intValue());
}
@Test
public void testCalculateLevelBetweenLevels() {
AUserExperience experienceToCalculate = AUserExperience.builder().experience(250L).build();
List<AExperienceLevel> levels = getLevelConfiguration();
AExperienceLevel calculatedLevel = testUnit.calculateLevel(experienceToCalculate, levels);
Assert.assertEquals(2, calculatedLevel.getLevel().intValue());
}
@Test
public void testCalculateLevelTooHigh() {
AUserExperience experienceToCalculate = AUserExperience.builder().experience(500L).build();
List<AExperienceLevel> levels = getLevelConfiguration();
AExperienceLevel calculatedLevel = testUnit.calculateLevel(experienceToCalculate, levels);
Assert.assertEquals(3, calculatedLevel.getLevel().intValue());
}
@Test
public void testUpdateUserExperienceLevelChanged() {
List<AExperienceLevel> levels = getLevelConfiguration();
AUserInAServer userObject = MockUtils.getUserObject(2L, MockUtils.getServer());
AUserExperience experienceToCalculate = AUserExperience.builder().user(userObject).currentLevel(levels.get(1)).experience(250L).build();
Assert.assertTrue(testUnit.updateUserLevel(experienceToCalculate, levels));
}
@Test
public void testUpdateUserExperienceLevelNotChanged() {
List<AExperienceLevel> levels = getLevelConfiguration();
AUserInAServer userObject = MockUtils.getUserObject(2L, MockUtils.getServer());
AUserExperience experienceToCalculate = AUserExperience.builder().user(userObject).currentLevel(levels.get(2)).experience(250L).build();
Assert.assertFalse(testUnit.updateUserLevel(experienceToCalculate, levels));
}
@Test
public void testGainExpSingleUserLvlUpOneServerWithoutRole() {
List<AExperienceLevel> levels = getLevelConfiguration();
List<AServer> servers = getOneServerWithOneUser();
AServer serverToUse = servers.get(0);
List<AExperienceRole> experienceRoles = getExperienceRoles(levels, serverToUse);
AUserInAServer userToUse = serverToUse.getUsers().get(0);
AExperienceRole previousExperienceRole = experienceRoles.get(1);
when(botService.isUserInGuild(userToUse)).thenReturn(true);
AExperienceRole newAwardedRole = testRoleRelatedScenario(false, levels, servers, serverToUse, experienceRoles, userToUse, previousExperienceRole);
verify(roleService, times(1)).addRoleToUser(userToUse, newAwardedRole.getRole());
verify(roleService, times(1)).removeRoleFromUser(userToUse, previousExperienceRole.getRole());
}
@Test
public void testLevelUpGainingNewRoleButUserAlreadyHasRole() {
List<AExperienceLevel> levels = getLevelConfiguration();
List<AServer> servers = getOneServerWithOneUser();
AServer serverToUse = servers.get(0);
List<AExperienceRole> experienceRoles = getExperienceRoles(levels, serverToUse);
AUserInAServer userToUse = serverToUse.getUsers().get(0);
AExperienceRole previousExperienceRole = experienceRoles.get(1);
AExperienceRole newAwardedRole = testRoleRelatedScenario(true, levels, servers, serverToUse, experienceRoles, userToUse, previousExperienceRole);
verify(roleService, times(0)).addRoleToUser(userToUse, newAwardedRole.getRole());
verify(roleService, times(0)).removeRoleFromUser(userToUse, previousExperienceRole.getRole());
}
@Test
public void testLevelUpNotGainingNewRole() {
List<AExperienceLevel> levels = getLevelConfiguration();
List<AServer> servers = getOneServerWithOneUser();
AServer serverToUse = servers.get(0);
List<AExperienceRole> experienceRoles = getExperienceRoles(levels, serverToUse);
levels.add(AExperienceLevel.builder().level(4).experienceNeeded(400L).build());
mockSimpleServer(levels, experienceRoles, serverToUse);
AUserInAServer userToUse = serverToUse.getUsers().get(0);
MemberImpl jdaMember = MockUtils.getMockedMember(serverToUse, userToUse, jda);
when(botService.getMemberInServer(serverToUse, userToUse.getUserReference())).thenReturn(jdaMember);
AExperienceRole previousExperienceRole = experienceRoles.get(3);
AUserExperience newUserExperience = mockServerWithSingleUser(levels, serverToUse, 401L, 3, previousExperienceRole, false);
AExperienceRole newAwardedRole = experienceRoles.get(3);
when(experienceRoleService.calculateRole(newUserExperience, experienceRoles)).thenReturn(newAwardedRole);
when(roleService.memberHasRole(jdaMember, newAwardedRole.getRole())).thenReturn(true);
testUnit.handleExperienceGain(servers);
verify(userExperienceManagementService, times(1)).saveUser(eq(newUserExperience));
verify(roleService, times(0)).removeRoleFromUser(userToUse, previousExperienceRole.getRole());
verify(roleService, times(0)).addRoleToUser(userToUse, newAwardedRole.getRole());
Assert.assertEquals(4, newUserExperience.getCurrentLevel().getLevel().intValue());
Assert.assertEquals(3L, newUserExperience.getCurrentExperienceRole().getRole().getId().longValue());
}
@Test
public void testHandleExperienceForUserNotLevelingUpWithoutExistingRole() {
List<AExperienceLevel> levels = getLevelConfiguration();
List<AServer> servers = getOneServerWithOneUser();
AServer serverToUse = servers.get(0);
List<AExperienceRole> experienceRoles = getExperienceRoles(levels, serverToUse);
mockSimpleServer(levels, experienceRoles, serverToUse);
AUserInAServer userToUse = serverToUse.getUsers().get(0);
MemberImpl jdaMember = MockUtils.getMockedMember(serverToUse, userToUse, jda);
when(botService.getMemberInServer(serverToUse, userToUse.getUserReference())).thenReturn(jdaMember);
AUserExperience newUserExperience = mockServerWithSingleUser(levels, serverToUse, 101L, 1, null, false);
when(experienceRoleService.calculateRole(newUserExperience, experienceRoles)).thenReturn(experienceRoles.get(1));
testUnit.handleExperienceGain(servers);
verify(userExperienceManagementService, times(1)).saveUser(eq(newUserExperience));
Assert.assertEquals(1, newUserExperience.getCurrentLevel().getLevel().intValue());
Assert.assertEquals(1L, newUserExperience.getCurrentExperienceRole().getRole().getId().longValue());
}
@Test
public void handleExpGainWithTooLittleForRole() {
List<AExperienceLevel> levels = getLevelConfiguration();
List<AServer> servers = getOneServerWithOneUser();
AServer serverToUse = servers.get(0);
List<AExperienceRole> experienceRoles = getExperienceRoles(levels, serverToUse);
mockSimpleServer(levels, experienceRoles, serverToUse);
AUserInAServer userToUse = serverToUse.getUsers().get(0);
MemberImpl jdaMember = MockUtils.getMockedMember(serverToUse, userToUse, jda);
when(botService.getMemberInServer(serverToUse, userToUse.getUserReference())).thenReturn(jdaMember);
AUserExperience newUserExperience = mockServerWithSingleUser(levels, serverToUse, 50L, 0, null, false);
when(experienceRoleService.calculateRole(newUserExperience, experienceRoles)).thenReturn(null);
testUnit.handleExperienceGain(servers);
verify(userExperienceManagementService, times(1)).saveUser(eq(newUserExperience));
Assert.assertEquals(0, newUserExperience.getCurrentLevel().getLevel().intValue());
Assert.assertNull(newUserExperience.getCurrentExperienceRole());
}
@Test
public void testUserHasExperienceRoleButNotAnymore() {
List<AExperienceLevel> levels = getLevelConfiguration();
List<AServer> servers = getOneServerWithOneUser();
AServer serverToUse = servers.get(0);
List<AExperienceRole> experienceRoles = getExperienceRoles(levels, serverToUse);
mockSimpleServer(levels, experienceRoles, serverToUse);
AUserInAServer userToUse = serverToUse.getUsers().get(0);
MemberImpl jdaMember = MockUtils.getMockedMember(serverToUse, userToUse, jda);
when(botService.getMemberInServer(serverToUse, userToUse.getUserReference())).thenReturn(jdaMember);
AUserExperience newUserExperience = mockServerWithSingleUser(levels, serverToUse, 50L, 0, experienceRoles.get(0), false);
when(experienceRoleService.calculateRole(newUserExperience, experienceRoles)).thenReturn(null);
when(botService.isUserInGuild(userToUse)).thenReturn(true);
testUnit.handleExperienceGain(servers);
verify(userExperienceManagementService, times(1)).saveUser(eq(newUserExperience));
verify(roleService, times(1)).removeRoleFromUser(userToUse, experienceRoles.get(0).getRole());
verify(roleService, times(0)).addRoleToUser(eq(userToUse), any(ARole.class));
Assert.assertEquals(0, newUserExperience.getCurrentLevel().getLevel().intValue());
Assert.assertNull(newUserExperience.getCurrentExperienceRole());
}
@Test
public void testHandleExperienceGainForGainDisabledForUser() {
List<AExperienceLevel> levels = getLevelConfiguration();
List<AServer> servers = getOneServerWithOneUser();
AServer serverToUse = servers.get(0);
List<AExperienceRole> experienceRoles = getExperienceRoles(levels, serverToUse);
mockSimpleServer(levels, experienceRoles, serverToUse);
AUserInAServer userToUse = serverToUse.getUsers().get(0);
MockUtils.getMockedMember(serverToUse, userToUse, jda);
AUserExperience newUserExperience = mockServerWithSingleUser(levels, serverToUse, 50L, 0, experienceRoles.get(0), true);
testUnit.handleExperienceGain(servers);
verify(userExperienceManagementService, times(0)).saveUser(eq(newUserExperience));
verify(roleService, times(0)).removeRoleFromUser(userToUse, experienceRoles.get(0).getRole());
verify(roleService, times(0)).addRoleToUser(eq(userToUse), any(ARole.class));
Assert.assertEquals(0, newUserExperience.getCurrentLevel().getLevel().intValue());
Assert.assertEquals(experienceRoles.get(0).getRole().getId(), newUserExperience.getCurrentExperienceRole().getRole().getId());
}
@Test
public void testHandleExperienceGainForGainDisabledForRole() {
List<AExperienceLevel> levels = getLevelConfiguration();
List<AServer> servers = getOneServerWithOneUser();
AServer serverToUse = servers.get(0);
List<AExperienceRole> experienceRoles = getExperienceRoles(levels, serverToUse);
mockSimpleServer(levels, experienceRoles, serverToUse);
AUserInAServer userToUse = serverToUse.getUsers().get(0);
MemberImpl jdaMember = MockUtils.getMockedMember(serverToUse, userToUse, jda);
AUserExperience newUserExperience = mockServerWithSingleUser(levels, serverToUse, 50L, 0, experienceRoles.get(0), false);
when(botService.getMemberInServer(userToUse)).thenReturn(jdaMember);
when(roleService.hasAnyOfTheRoles(eq(jdaMember), anyList())).thenReturn(true);
testUnit.handleExperienceGain(servers);
verify(userExperienceManagementService, times(0)).saveUser(eq(newUserExperience));
verify(roleService, times(0)).removeRoleFromUser(userToUse, experienceRoles.get(0).getRole());
verify(roleService, times(0)).addRoleToUser(eq(userToUse), any(ARole.class));
Assert.assertEquals(0, newUserExperience.getCurrentLevel().getLevel().intValue());
Assert.assertEquals(experienceRoles.get(0).getRole().getId(), newUserExperience.getCurrentExperienceRole().getRole().getId());
}
@Test
public void testHandleExperienceForUserNotLevelingUpWithExistingRole() {
List<AExperienceLevel> levels = getLevelConfiguration();
List<AServer> servers = getOneServerWithOneUser();
AServer serverToUse = servers.get(0);
List<AExperienceRole> experienceRoles = getExperienceRoles(levels, serverToUse);
mockSimpleServer(levels, experienceRoles, serverToUse);
AUserInAServer userToUse = serverToUse.getUsers().get(0);
MemberImpl jdaMember = MockUtils.getMockedMember(serverToUse, userToUse, jda);
when(botService.getMemberInServer(serverToUse, userToUse.getUserReference())).thenReturn(jdaMember);
AUserExperience newUserExperience = mockServerWithSingleUser(levels, serverToUse, 101L, 1, experienceRoles.get(1), false);
when(experienceRoleService.calculateRole(newUserExperience, experienceRoles)).thenReturn(experienceRoles.get(1));
testUnit.handleExperienceGain(servers);
verify(userExperienceManagementService, times(1)).saveUser(eq(newUserExperience));
verify(roleService, times(0)).removeRoleFromUser(userToUse, experienceRoles.get(0).getRole());
verify(roleService, times(0)).addRoleToUser(eq(userToUse), any(ARole.class));
Assert.assertEquals(1, newUserExperience.getCurrentLevel().getLevel().intValue());
Assert.assertEquals(experienceRoles.get(1).getRole().getId(), newUserExperience.getCurrentExperienceRole().getRole().getId());
}
@Test
public void testSingleUserInMultipleServers() {
// The user levels in one server, and does not level in another one
List<AExperienceLevel> levels = getLevelConfiguration();
List<AServer> servers = getServersWithUserExperience();
List<AUserExperience> userExperiences = new ArrayList<>();
List<List<AExperienceRole>> allExperienceRoles = new ArrayList<>();
List<Integer> userLevels = Arrays.asList(1,2);
List<Long> userExperienceValues = Arrays.asList(101L,301L);
List<Integer> experienceRoleIndices = Arrays.asList(1, 2);
for (int i = 0; i < servers.size(); i++) {
AServer aServer = servers.get(i);
Integer level = userLevels.get(i);
Long experienceValues = userExperienceValues.get(i);
List<AExperienceRole> experienceRoles = getExperienceRoles(levels, aServer);
mockSimpleServer(levels, experienceRoles, aServer);
AUserInAServer userToUse = aServer.getUsers().get(0);
MemberImpl jdaMember = MockUtils.getMockedMember(aServer, userToUse, jda);
when(botService.getMemberInServer(aServer, userToUse.getUserReference())).thenReturn(jdaMember);
AExperienceRole role = experienceRoles.get(experienceRoleIndices.get(i));
AUserExperience newUserExperience = mockServerWithSingleUser(levels, aServer, experienceValues, level, role, false);
when(experienceRoleService.calculateRole(newUserExperience, experienceRoles)).thenReturn(role);
userExperiences.add(newUserExperience);
allExperienceRoles.add(experienceRoles);
}
testUnit.handleExperienceGain(servers);
List<Integer> newLevels = Arrays.asList(1,3);
List<Integer> newExperienceRoleIndices = Arrays.asList(1, 2);
for (int i = 0; i < servers.size(); i++) {
AServer server = servers.get(i);
AUserExperience newUserExperience = userExperiences.get(i);
AUserInAServer userToUse = server.getUsers().get(0);
List<AExperienceRole> experienceRoles = allExperienceRoles.get(i);
verify(userExperienceManagementService, times(2)).saveUser(aUserExperienceArgumentCaptor.capture());
verify(roleService, times(0)).removeRoleFromUser(userToUse, experienceRoles.get(0).getRole());
verify(roleService, times(0)).addRoleToUser(eq(userToUse), any(ARole.class));
Assert.assertEquals(newLevels.get(i).intValue(), newUserExperience.getCurrentLevel().getLevel().intValue());
Assert.assertEquals(experienceRoles.get(newExperienceRoleIndices.get(i)).getRole().getId(), newUserExperience.getCurrentExperienceRole().getRole().getId());
}
}
@Test
public void testSyncNoRoleUserGettingRole() {
AServer server = MockUtils.getServer(2L);
List<AExperienceRole> usedExperienceRoles = getExperienceRoles(getLevelConfiguration(), server);
AExperienceRole previousRole = null;
AExperienceRole afterRole = usedExperienceRoles.get(0);
Integer removals = 0;
Integer adds = 1;
executeSyncSingleUserTest(server, usedExperienceRoles, previousRole, afterRole, removals, adds);
}
@Test
public void testSyncUserLosingRole() {
AServer server = MockUtils.getServer(2L);
List<AExperienceRole> usedExperienceRoles = getExperienceRoles(getLevelConfiguration(), server);
AExperienceRole previousRole = usedExperienceRoles.get(0);
AExperienceRole afterRole = null;
Integer removals = 1;
Integer adds = 0;
executeSyncSingleUserTest(server, usedExperienceRoles, previousRole, afterRole, removals, adds);
}
@Test
public void testSyncUserKeepRole() {
AServer server = MockUtils.getServer(2L);
List<AExperienceRole> usedExperienceRoles = getExperienceRoles(getLevelConfiguration(), server);
AExperienceRole previousRole = usedExperienceRoles.get(0);
AExperienceRole afterRole = usedExperienceRoles.get(0);
Integer removals = 0;
Integer adds = 0;
executeSyncSingleUserTest(server, usedExperienceRoles, previousRole, afterRole, removals, adds);
}
@Test
public void testSyncUserChangingRole() {
AServer server = MockUtils.getServer(2L);
List<AExperienceRole> usedExperienceRoles = getExperienceRoles(getLevelConfiguration(), server);
AExperienceRole previousRole = usedExperienceRoles.get(0);
AExperienceRole afterRole = usedExperienceRoles.get(1);
Integer removals = 1;
Integer adds = 1;
executeSyncSingleUserTest(server, usedExperienceRoles, previousRole, afterRole, removals, adds);
}
@Test
public void testDisablingExperienceForUser() {
AServer server = MockUtils.getServer(1L);
AUserInAServer userObject = MockUtils.getUserObject(2L, server);
AUserExperience experience = AUserExperience.builder().user(userObject).experienceGainDisabled(false).build();
when(userExperienceManagementService.findUserInServer(userObject)).thenReturn(experience);
testUnit.disableExperienceForUser(userObject);
Assert.assertTrue(experience.getExperienceGainDisabled());
}
@Test
public void testDisablingExpForUserWhichHasItDisabled() {
AServer server = MockUtils.getServer(1L);
AUserInAServer userObject = MockUtils.getUserObject(2L, server);
AUserExperience experience = AUserExperience.builder().user(userObject).experienceGainDisabled(true).build();
when(userExperienceManagementService.findUserInServer(userObject)).thenReturn(experience);
testUnit.disableExperienceForUser(userObject);
Assert.assertTrue(experience.getExperienceGainDisabled());
}
@Test
public void testEnablingExperienceForEnabledUser() {
AServer server = MockUtils.getServer(1L);
AUserInAServer userObject = MockUtils.getUserObject(2L, server);
AUserExperience experience = AUserExperience.builder().user(userObject).experienceGainDisabled(false).build();
when(userExperienceManagementService.findUserInServer(userObject)).thenReturn(experience);
testUnit.enableExperienceForUser(userObject);
Assert.assertFalse(experience.getExperienceGainDisabled());
}
@Test
public void testEnablingExpForUserWhichHasItDisabled() {
AServer server = MockUtils.getServer(1L);
AUserInAServer userObject = MockUtils.getUserObject(2L, server);
AUserExperience experience = AUserExperience.builder().user(userObject).experienceGainDisabled(true).build();
when(userExperienceManagementService.findUserInServer(userObject)).thenReturn(experience);
testUnit.enableExperienceForUser(userObject);
Assert.assertFalse(experience.getExperienceGainDisabled());
}
@Test
public void testFindLeaderBoardData() {
AServer server = MockUtils.getServer(1L);
executeLeaderBoardTest(server, 1);
}
@Test
public void testFindLeaderBoardDataSecondPage() {
AServer server = MockUtils.getServer(1L);
executeLeaderBoardTest(server, 2);
}
@Test(expected = IllegalArgumentException.class)
public void testIllegalLeaderBoardPage() {
testUnit.findLeaderBoardData(MockUtils.getServer(1L), -1);
}
@Test
public void testSyncAllUsers() {
AServer server = MockUtils.getServer(2L);
List<AExperienceRole> usedExperienceRoles = getExperienceRoles(getLevelConfiguration(), server);
AExperienceRole firstPreviousRole = null;
AExperienceRole firstAfterRole = usedExperienceRoles.get(0);
AExperienceRole secondPreviousRole = null;
AExperienceRole secondAfterRole = null;
AExperienceLevel level0 = AExperienceLevel.builder().level(0).build();
AUserExperience experience = AUserExperience.builder().experience(40L).user(MockUtils.getUserObject(3L, server)).currentLevel(level0).build();
AUserExperience experience2 = AUserExperience.builder().experience(201L).user(MockUtils.getUserObject(4L, server)).currentLevel(level0).build();
List<AUserExperience> experiences = Arrays.asList(experience, experience2);
List<AUserInAServer> users = experiences.stream().map(AUserExperience::getUser).collect(Collectors.toList());
MemberImpl firstMember = MockUtils.getMockedMember(server, users.get(0), jda);
when(botService.getMemberInServer(server, users.get(0).getUserReference())).thenReturn(firstMember);
MemberImpl secondMember = MockUtils.getMockedMember(server, users.get(1), jda);
when(botService.getMemberInServer(server, users.get(1).getUserReference())).thenReturn(secondMember);
experience.setCurrentExperienceRole(firstPreviousRole);
experience2.setCurrentExperienceRole(secondPreviousRole);
when(userExperienceManagementService.loadAllUsers(server)).thenReturn(experiences);
when(experienceRoleManagementService.getExperienceRolesForServer(server)).thenReturn(usedExperienceRoles);
when(experienceRoleService.calculateRole(experience, usedExperienceRoles)).thenReturn(firstAfterRole);
when(experienceRoleService.calculateRole(experience2, usedExperienceRoles)).thenReturn(secondAfterRole);
when(botService.getMemberInServer(server, experience.getUser().getUserReference())).thenReturn(firstMember);
when(botService.getMemberInServer(server, experience2.getUser().getUserReference())).thenReturn(secondMember);
when(roleService.memberHasRole(firstMember, firstAfterRole.getRole())).thenReturn(false);
testUnit.syncUserRoles(server);
Assert.assertNull(experience2.getCurrentExperienceRole());
Assert.assertEquals(usedExperienceRoles.get(0).getRole().getId(), experience.getCurrentExperienceRole().getRole().getId());
verify(roleService, times(1)).addRoleToUser(users.get(0), usedExperienceRoles.get(0).getRole());
}
@Test
public void testGetRankForUser() {
long experience = 1L;
int level = 1;
long messageCount = 1L;
int rank = 1;
AServer server = MockUtils.getServer(2L);
AUserInAServer userInAServer = MockUtils.getUserObject(1L, server);
AExperienceLevel level0 = AExperienceLevel.builder().experienceNeeded(200L).level(level).build();
AUserExperience experienceObj = AUserExperience.builder().experience(experience).user(MockUtils.getUserObject(3L, server)).currentLevel(level0).build();
when(userExperienceManagementService.findUserInServer(userInAServer)).thenReturn(experienceObj);
LeaderBoardEntryTestImpl leaderBoardEntryTest = LeaderBoardEntryTestImpl
.builder()
.experience(experience)
.id(1L)
.level(level)
.messageCount(messageCount)
.rank(rank)
.userInServerId(1L)
.build();
when(userExperienceManagementService.getRankOfUserInServer(experienceObj)).thenReturn(leaderBoardEntryTest);
LeaderBoardEntry rankOfUserInServer = testUnit.getRankOfUserInServer(userInAServer);
Assert.assertEquals(experience, rankOfUserInServer.getExperience().getExperience().longValue());
Assert.assertEquals(level, rankOfUserInServer.getExperience().getCurrentLevel().getLevel().intValue());
Assert.assertEquals(rank, rankOfUserInServer.getRank().intValue());
}
@Test
public void testGetRankForUserNotExisting() {
AServer server = MockUtils.getServer(2L);
AUserInAServer userInAServer = MockUtils.getUserObject(1L, server);
when(userExperienceManagementService.findUserInServer(userInAServer)).thenReturn(null);
LeaderBoardEntry rankOfUserInServer = testUnit.getRankOfUserInServer(userInAServer);
Assert.assertNull(rankOfUserInServer.getExperience());
Assert.assertEquals(0, rankOfUserInServer.getRank().intValue());
}
@Test
public void testGetRankWhenRankReturnsNull() {
long experience = 1L;
int level = 1;
long messageCount = 1L;
AServer server = MockUtils.getServer(2L);
AUserInAServer userInAServer = MockUtils.getUserObject(1L, server);
AExperienceLevel level0 = AExperienceLevel.builder().experienceNeeded(200L).level(level).build();
AUserExperience experienceObj = AUserExperience.builder().experience(experience).user(MockUtils.getUserObject(3L, server)).messageCount(messageCount).currentLevel(level0).build();
when(userExperienceManagementService.findUserInServer(userInAServer)).thenReturn(experienceObj);
when(userExperienceManagementService.getRankOfUserInServer(experienceObj)).thenReturn(null);
LeaderBoardEntry rankOfUserInServer = testUnit.getRankOfUserInServer(userInAServer);
Assert.assertEquals(experience, rankOfUserInServer.getExperience().getExperience().longValue());
Assert.assertEquals(level, rankOfUserInServer.getExperience().getCurrentLevel().getLevel().intValue());
Assert.assertEquals(messageCount, rankOfUserInServer.getExperience().getMessageCount().longValue());
Assert.assertEquals(0, rankOfUserInServer.getRank().intValue());
}
@Test
public void testSyncRolesWithFeedBack() {
AServer server = MockUtils.getServer(1L);
AChannel channel = AChannel.builder().id(2L).build();
List<AUserExperience> experiences = getUserExperiences(25, server);
checkStatusMessages(server, channel, experiences, 13);
}
@Test
public void testSyncRolesWithNoUsers() {
AServer server = MockUtils.getServer(1L);
AChannel channel = AChannel.builder().id(2L).build();
List<AUserExperience> experiences = new ArrayList<>();
checkStatusMessages(server, channel, experiences, 1);
}
private void checkStatusMessages(AServer server, AChannel channel, List<AUserExperience> experiences, int messageCount) {
when(userExperienceManagementService.loadAllUsers(server)).thenReturn(experiences);
MessageToSend statusMessage = MessageToSend.builder().message("text").build();
when(templateService.renderEmbedTemplate(eq("user_sync_status_message"), any(UserSyncStatusModel.class))).thenReturn(statusMessage);
long messageId = 5L;
ReceivedMessage statusMessageJDA = MockUtils.buildMockedMessage(messageId, "text", null);
when(messageService.createStatusMessage(statusMessage, channel)).thenReturn(CompletableFuture.completedFuture(statusMessageJDA));
testUnit.syncUserRolesWithFeedback(server, channel);
verify(messageService, times(messageCount)).updateStatusMessage(channel, messageId, statusMessage);
}
private void executeSyncSingleUserTest(AServer server, List<AExperienceRole> usedExperienceRoles, AExperienceRole previousRole, AExperienceRole afterRole, Integer removals, Integer adds) {
AExperienceLevel level0 = AExperienceLevel.builder().level(0).build();
AUserExperience experience = AUserExperience.builder().experience(40L).user(MockUtils.getUserObject(3L, server)).currentLevel(level0).build();
List<AUserExperience> experiences = Arrays.asList(experience);
List<AUserInAServer> users = experiences.stream().map(AUserExperience::getUser).collect(Collectors.toList());
MemberImpl firstMember = MockUtils.getMockedMember(server, users.get(0), jda);
when(botService.getMemberInServer(server, users.get(0).getUserReference())).thenReturn(firstMember);
experience.setCurrentExperienceRole(previousRole);
when(experienceRoleManagementService.getExperienceRolesForServer(server)).thenReturn(usedExperienceRoles);
when(experienceRoleService.calculateRole(experience, usedExperienceRoles)).thenReturn(afterRole);
when(botService.getMemberInServer(server, experience.getUser().getUserReference())).thenReturn(firstMember);
if(removals > 0) {
users.forEach(aUserInAServer -> when(botService.isUserInGuild(aUserInAServer)).thenReturn(true));
}
if(afterRole != null && previousRole != null) {
boolean sameRole = previousRole.getRole().getId().equals(afterRole.getRole().getId());
when(roleService.memberHasRole(firstMember, afterRole.getRole())).thenReturn(sameRole);
}
testUnit.syncForSingleUser(experience);
if(afterRole != null) {
Assert.assertEquals(afterRole.getRole().getId(), experience.getCurrentExperienceRole().getRole().getId());
} else {
Assert.assertNull(experience.getCurrentExperienceRole());
}
if(previousRole != null) {
verify(roleService, times(removals)).removeRoleFromUser(experience.getUser(), previousRole.getRole());
}
if(afterRole != null) {
verify(roleService, times(adds)).addRoleToUser(experience.getUser(), afterRole.getRole());
}
}
private void executeLeaderBoardTest(AServer server, Integer page) {
int pageSize = 10;
List<AUserExperience> experiences = getUserExperiences(pageSize, server);
when(userExperienceManagementService.findLeaderboardUsersPaginated(server, (page - 1) * pageSize, page * pageSize)).thenReturn(experiences);
LeaderBoard leaderBoardData = testUnit.findLeaderBoardData(server, page);
page--;
List<LeaderBoardEntry> entries = leaderBoardData.getEntries();
for (int i = 0; i < entries.size(); i++) {
LeaderBoardEntry entry = entries.get(i);
Assert.assertEquals(i, entry.getExperience().getExperience().longValue());
Assert.assertEquals(i, entry.getExperience().getCurrentLevel().getLevel().intValue());
Assert.assertEquals(i, entry.getExperience().getUser().getUserReference().getId().longValue());
Assert.assertEquals((page * pageSize) + i + 1, entry.getRank().intValue());
}
Assert.assertEquals(pageSize, entries.size());
}
private AExperienceRole testRoleRelatedScenario(boolean shouldHaveRole, List<AExperienceLevel> levels, List<AServer> servers, AServer serverToUse, List<AExperienceRole> experienceRoles, AUserInAServer userToUse, AExperienceRole previousExperienceRole) {
mockSimpleServer(levels, experienceRoles, serverToUse);
MemberImpl jdaMember = MockUtils.getMockedMember(serverToUse, userToUse, jda);
when(botService.getMemberInServer(serverToUse, userToUse.getUserReference())).thenReturn(jdaMember);
AUserExperience newUserExperience = mockServerWithSingleUser(levels, serverToUse, 301L, 1, previousExperienceRole, false);
AExperienceRole newAwardedRole = experienceRoles.get(3);
when(experienceRoleService.calculateRole(newUserExperience, experienceRoles)).thenReturn(newAwardedRole);
when(roleService.memberHasRole(jdaMember, newAwardedRole.getRole())).thenReturn(shouldHaveRole);
testUnit.handleExperienceGain(servers);
verify(userExperienceManagementService, times(1)).saveUser(eq(newUserExperience));
Assert.assertEquals(3, newUserExperience.getCurrentLevel().getLevel().intValue());
Assert.assertEquals(3L, newUserExperience.getCurrentExperienceRole().getRole().getId().longValue());
return newAwardedRole;
}
private AUserExperience mockServerWithSingleUser(List<AExperienceLevel> levels, AServer serverToUse, Long experience, Integer currentLevelValue, AExperienceRole role, boolean hasExpDisabled) {
Optional<AExperienceLevel> first = levels.stream().filter(level -> level.getLevel().equals(currentLevelValue)).findFirst();
if(first.isPresent()) {
AExperienceLevel currentLevel = first.get();
AUserInAServer firstUser = serverToUse.getUsers().get(0);
return mockUser(experience, currentLevel, firstUser, hasExpDisabled, role);
}
throw new AbstractoRunTimeException("No level found");
}
private AUserExperience mockUser(Long experience, AExperienceLevel currentLevel, AUserInAServer firstUser, boolean hasExpDisabled, AExperienceRole currentRole) {
AUserExperience newUserExperience = AUserExperience.builder().currentLevel(currentLevel).experience(experience).user(firstUser).experienceGainDisabled(hasExpDisabled).currentExperienceRole(currentRole).build();
when(userExperienceManagementService.incrementExpForUser(eq(firstUser), anyLong(), anyLong())).thenReturn(newUserExperience);
return newUserExperience;
}
private void mockSimpleServer(List<AExperienceLevel> levels, List<AExperienceRole> experienceRoles, AServer server) {
when(configService.getLongValue(ExperienceFeatureConfig.MIN_EXP_KEY, server.getId())).thenReturn(20L);
when(configService.getLongValue(ExperienceFeatureConfig.MAX_EXP_KEY, server.getId())).thenReturn(50L);
when(configService.getDoubleValue(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, server.getId())).thenReturn(1.2);
when(experienceLevelManagementService.getLevelConfig()).thenReturn(levels);
when(experienceRoleManagementService.getExperienceRolesForServer(server)).thenReturn(experienceRoles);
when(disabledExpRoleManagementService.getDisabledRolesForServer(server)).thenReturn(new ArrayList<>());
}
private List<AServer> getOneServerWithOneUser() {
AServer server = MockUtils.getServer(3L);
MockUtils.getUserObject(3L, server);
return Arrays.asList(server);
}
private List<AServer> getServersWithUserExperience() {
AServer server = MockUtils.getServer(3L);
AServer otherServer = MockUtils.getServer(3L);
MockUtils.getUserObject(3L, server);
MockUtils.getUserObject(4L, otherServer);
return Arrays.asList(server, otherServer);
}
}

View File

@@ -0,0 +1,61 @@
package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.experience.ExperienceRelatedTest;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.service.management.ExperienceLevelManagementService;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Optional;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ExperienceLevelServiceBeanTest extends ExperienceRelatedTest {
@InjectMocks
private ExperienceLevelServiceBean testingUnit;
@Mock
private ExperienceLevelManagementService experienceLevelManagementService;
@Test
public void createAFewLevels() {
Integer levelCount = 10;
Integer existingLevelCount = levelCount - 5;
for (int i = 0; i < levelCount; i++) {
when(experienceLevelManagementService.levelExists(i)).thenReturn(i < existingLevelCount);
}
testingUnit.createLevelsUntil(levelCount);
verify(experienceLevelManagementService, times(levelCount - existingLevelCount)).createExperienceLevel(anyInt(), anyLong());
}
@Test
public void testExperienceToNextLevelCalculation() {
when(experienceLevelManagementService.getLevel(51)).thenReturn(Optional.of(AExperienceLevel.builder().level(51).experienceNeeded(15L).build()));
Long experience = testingUnit.calculateExperienceToNextLevel(50, 10L);
Assert.assertEquals(5L, experience.longValue());
}
@Test
public void testRequiredExperienceCalculation() {
Assert.assertEquals(15100L, testingUnit.calculateExperienceForLevel(50).longValue());
}
@Test(expected = IllegalArgumentException.class)
public void testRequiredExperienceCalculationIllegalLevel() {
testingUnit.calculateExperienceForLevel(-1);
}
@Test(expected = AbstractoRunTimeException.class)
public void testExperienceToNextLevelCalculationOverExistingLevel() {
when(experienceLevelManagementService.getLevel(51)).thenReturn(Optional.empty());
testingUnit.calculateExperienceToNextLevel(50, 10L);
}
}

View File

@@ -0,0 +1,162 @@
package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AChannelType;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.experience.ExperienceRelatedTest;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.models.database.AExperienceRole;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import dev.sheldan.abstracto.experience.service.management.ExperienceLevelManagementService;
import dev.sheldan.abstracto.experience.service.management.ExperienceRoleManagementService;
import dev.sheldan.abstracto.test.MockUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ExperienceRoleServiceBeanTest extends ExperienceRelatedTest {
@InjectMocks
private ExperienceRoleServiceBean testingUnit;
@Mock
private ExperienceRoleManagementService experienceRoleManagementService;
@Mock
private ExperienceLevelManagementService experienceLevelService;
@Mock
private AUserExperienceService userExperienceService;
@Test
public void testSettingRoleToLevelWithoutOldUsers() {
AServer server = MockUtils.getServer();
Integer levelCount = 10;
AExperienceLevel level = AExperienceLevel.builder().experienceNeeded(10L).level(levelCount).build();
ARole roleToChange = getRole(1L, server);
AExperienceRole previousExperienceRole = AExperienceRole.builder().role(roleToChange).roleServer(server).level(level).build();
when(experienceRoleManagementService.getRoleInServer(roleToChange)).thenReturn(previousExperienceRole);
when(experienceLevelService.getLevel(levelCount)).thenReturn(Optional.of(level));
testingUnit.setRoleToLevel(roleToChange, levelCount, getFeedbackChannel(server));
verify(experienceRoleManagementService, times(1)).unsetRole(previousExperienceRole);
verify(experienceRoleManagementService, times(1)).removeAllRoleAssignmentsForLevelInServer(level, server);
verify(experienceRoleManagementService, times(1)).setLevelToRole(level, roleToChange);
verify(experienceRoleManagementService, times(0)).getExperienceRolesForServer(server);
}
@Test
public void testSettingRoleToLevelExistingUsers() {
AServer server = MockUtils.getServer();
Integer levelCount = 10;
AExperienceLevel level = AExperienceLevel.builder().experienceNeeded(10L).level(levelCount).build();
ARole roleToChange = getRole(1L, server);
ARole newRoleToAward = getRole(2L, server);
AUserExperience firstUser = AUserExperience.builder().build();
AUserExperience secondUser = AUserExperience.builder().build();
List<AUserExperience> users = Arrays.asList(firstUser, secondUser);
AExperienceRole previousExperienceRole = AExperienceRole.builder().role(roleToChange).id(roleToChange.getId()).roleServer(server).level(level).users(users).build();
AExperienceRole newExperienceRole = AExperienceRole.builder().role(newRoleToAward).id(newRoleToAward.getId()).roleServer(server).level(level).build();
when(experienceRoleManagementService.getRoleInServer(roleToChange)).thenReturn(previousExperienceRole);
when(experienceLevelService.getLevel(levelCount)).thenReturn(Optional.of(level));
when(experienceRoleManagementService.getExperienceRolesForServer(server)).thenReturn(new ArrayList<>(Arrays.asList(newExperienceRole, previousExperienceRole)));
AChannel feedBackChannel = getFeedbackChannel(server);
testingUnit.setRoleToLevel(roleToChange, levelCount, feedBackChannel);
verify(experienceRoleManagementService, times(1)).unsetRole(previousExperienceRole);
verify(experienceRoleManagementService, times(1)).removeAllRoleAssignmentsForLevelInServer(level, server);
verify(experienceRoleManagementService, times(1)).setLevelToRole(level, roleToChange);
verify(experienceRoleManagementService, times(1)).getExperienceRolesForServer(server);
verify(userExperienceService, times(1)).executeActionOnUserExperiencesWithFeedBack(eq(users), eq(feedBackChannel), any());
}
@Test
public void testCalculateRoleForLevelInBetween() {
List<AExperienceRole> roles = getExperienceRoles();
AUserExperience userExperience = AUserExperience.builder().currentLevel(AExperienceLevel.builder().level(6).build()).build();
AExperienceRole aExperienceRole = testingUnit.calculateRole(userExperience, roles);
Assert.assertEquals(aExperienceRole.getLevel().getLevel().intValue(), 5);
}
@Test
public void testCalculateRoleForLevelBelow() {
List<AExperienceRole> roles = getExperienceRoles();
AUserExperience userExperience = AUserExperience.builder().currentLevel(AExperienceLevel.builder().level(4).build()).build();
AExperienceRole aExperienceRole = testingUnit.calculateRole(userExperience, roles);
Assert.assertNull(aExperienceRole);
}
@Test
public void testCalculateRoleForLevelOver() {
List<AExperienceRole> roles = getExperienceRoles();
AUserExperience userExperience = AUserExperience.builder().currentLevel(AExperienceLevel.builder().level(11).build()).build();
AExperienceRole aExperienceRole = testingUnit.calculateRole(userExperience, roles);
Assert.assertEquals(aExperienceRole.getLevel().getLevel().intValue(), 10);
}
@Test
public void testCalculateRoleForLevelExact() {
List<AExperienceRole> roles = getExperienceRoles();
AUserExperience userExperience = AUserExperience.builder().currentLevel(AExperienceLevel.builder().level(10).build()).build();
AExperienceRole aExperienceRole = testingUnit.calculateRole(userExperience, roles);
Assert.assertEquals(aExperienceRole.getLevel().getLevel().intValue(), 10);
}
@Test
public void testCalculateRoleForNoRoleConfigFound() {
List<AExperienceRole> roles = new ArrayList<>();
AUserExperience userExperience = AUserExperience.builder().currentLevel(AExperienceLevel.builder().level(6).build()).build();
AExperienceRole aExperienceRole = testingUnit.calculateRole(userExperience, roles);
Assert.assertNull(aExperienceRole);
}
@Test
public void testCalculatingLevelOfNextRole() {
AServer server = MockUtils.getServer();
when(experienceRoleManagementService.getExperienceRolesForServer(server)).thenReturn(getExperienceRoles());
AExperienceLevel levelToCheckFor = AExperienceLevel.builder().level(7).build();
AExperienceLevel levelOfNextRole = testingUnit.getLevelOfNextRole(levelToCheckFor, server);
Assert.assertEquals(10, levelOfNextRole.getLevel().intValue());
}
@Test
public void testCalculatingLevelOfNextRoleIfThereIsNone() {
AServer server = MockUtils.getServer();
when(experienceRoleManagementService.getExperienceRolesForServer(server)).thenReturn(getExperienceRoles());
AExperienceLevel levelToCheckFor = AExperienceLevel.builder().level(15).build();
AExperienceLevel levelOfNextRole = testingUnit.getLevelOfNextRole(levelToCheckFor, server);
Assert.assertEquals(200, levelOfNextRole.getLevel().intValue());
}
private List<AExperienceRole> getExperienceRoles() {
AExperienceRole level5ExperienceRole = getExperienceRoleForLevel(5);
AExperienceRole level10ExperienceRole = getExperienceRoleForLevel(10);
return Arrays.asList(level5ExperienceRole, level10ExperienceRole);
}
private AExperienceRole getExperienceRoleForLevel(int levelToBuild) {
AExperienceLevel firstLevel = AExperienceLevel.builder().level(levelToBuild).build();
return AExperienceRole.builder().level(firstLevel).build();
}
private ARole getRole(Long id, AServer server) {
return ARole.builder().id(id).server(server).deleted(false).build();
}
private AChannel getFeedbackChannel(AServer server) {
return AChannel.builder().id(1L).server(server).type(AChannelType.TEXT).build();
}
}

View File

@@ -0,0 +1,17 @@
package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.experience.models.database.LeaderBoardEntryResult;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class LeaderBoardEntryTestImpl implements LeaderBoardEntryResult {
private Long id;
private Long userInServerId;
private Long experience;
private Integer level;
private Long messageCount;
private Integer rank;
}

View File

@@ -0,0 +1,66 @@
package dev.sheldan.abstracto.experience.service.management;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.experience.ExperienceRelatedTest;
import dev.sheldan.abstracto.experience.models.database.ADisabledExpRole;
import dev.sheldan.abstracto.experience.repository.DisabledExpRoleRepository;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class DisabledExpRoleManagementServiceBeanTest extends ExperienceRelatedTest {
@InjectMocks
private DisabledExpRoleManagementServiceBean testUnit;
@Mock
private DisabledExpRoleRepository disabledExpRoleRepository;
@Test
public void testRoleToSetDisabled() {
ARole role = getARole();
ADisabledExpRole createdDisabledRole = getDisabledRole(role);
when(disabledExpRoleRepository.save(any(ADisabledExpRole.class))).thenReturn(createdDisabledRole);
ADisabledExpRole aDisabledExpRole = testUnit.setRoleToBeDisabledForExp(role);
Assert.assertEquals(role.getId(), aDisabledExpRole.getRole().getId());
Assert.assertEquals(createdDisabledRole.getId(), aDisabledExpRole.getId());
}
@Test
public void testIfRoleIsDisabled() {
ARole aRole = getARole();
when(disabledExpRoleRepository.existsByRole(aRole)).thenReturn(true);
boolean experienceDisabledForRole = testUnit.isExperienceDisabledForRole(aRole);
Assert.assertTrue(experienceDisabledForRole);
verify(disabledExpRoleRepository, times(1)).existsByRole(aRole);
}
@Test
public void testRemoveRoleFromDisabled() {
ARole aRole = getARole();
testUnit.removeRoleToBeDisabledForExp(aRole);
verify(disabledExpRoleRepository, times(1)).deleteByRole(aRole);
}
@Test
public void testRetrieveAllDisabledRolesForServer() {
AServer server = AServer.builder().id(1L).build();
testUnit.getDisabledRolesForServer(server);
verify(disabledExpRoleRepository, times(1)).getByRole_Server(server);
}
private ADisabledExpRole getDisabledRole(ARole role) {
return ADisabledExpRole.builder().role(role).id(2L).build();
}
private ARole getARole() {
return ARole.builder().id(1L).build();
}
}

View File

@@ -0,0 +1,95 @@
package dev.sheldan.abstracto.experience.service.management;
import dev.sheldan.abstracto.experience.ExperienceRelatedTest;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.repository.ExperienceLevelRepository;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class ExperienceLevelManagementServiceBeanTest extends ExperienceRelatedTest {
@InjectMocks
private ExperienceLevelManagementServiceBean testUnit;
@Mock
private ExperienceLevelRepository experienceLevelRepository;
@Test
public void testCreateExperienceLevel() {
Integer level = 1;
Long neededExperience = 100L;
AExperienceLevel createdLevel = getLevel(level, neededExperience);
when(experienceLevelRepository.save(any(AExperienceLevel.class))).thenReturn(createdLevel);
AExperienceLevel experienceLevel = testUnit.createExperienceLevel(level, neededExperience);
Assert.assertEquals(experienceLevel.getLevel(), createdLevel.getLevel());
Assert.assertEquals(experienceLevel.getExperienceNeeded(), createdLevel.getExperienceNeeded());
}
@Test
public void testLevelExists() {
int levelValue = 1;
when(experienceLevelRepository.existsById(levelValue)).thenReturn(true);
Assert.assertTrue(testUnit.levelExists(levelValue));
}
@Test
public void testFindLevel() {
int levelValue = 1;
long experienceAmount = 100L;
Optional<AExperienceLevel> level = Optional.of(getLevel(levelValue, experienceAmount));
when(experienceLevelRepository.findById(levelValue)).thenReturn(level);
Optional<AExperienceLevel> foundLevelOptional = testUnit.getLevel(levelValue);
Assert.assertTrue(foundLevelOptional.isPresent());
if(foundLevelOptional.isPresent()) {
AExperienceLevel foundLevel = foundLevelOptional.get();
Assert.assertEquals(experienceAmount, foundLevel.getExperienceNeeded().longValue());
Assert.assertEquals(levelValue, foundLevel.getLevel().intValue());
} else {
Assert.fail();
}
}
@Test
public void testFindLevelAndNoLevelFound() {
int levelValue = 1;
Optional<AExperienceLevel> level = Optional.empty();
when(experienceLevelRepository.findById(levelValue)).thenReturn(level);
Optional<AExperienceLevel> foundLevelOptional = testUnit.getLevel(levelValue);
Assert.assertFalse(foundLevelOptional.isPresent());
}
@Test
public void findAllLevelConfigurations() {
AExperienceLevel availableLevel = getLevel(1, 100L);
AExperienceLevel availableLevel2 = getLevel(2, 200L);
List<AExperienceLevel> levelConfig = Arrays.asList(availableLevel, availableLevel2);
when(experienceLevelRepository.findAll()).thenReturn(levelConfig);
List<AExperienceLevel> foundLevelConfig = testUnit.getLevelConfig();
AExperienceLevel firstLevelConfig = foundLevelConfig.get(0);
Assert.assertEquals(100L, firstLevelConfig.getExperienceNeeded().longValue());
Assert.assertEquals(1, firstLevelConfig.getLevel().intValue());
AExperienceLevel secondLevelConfig = foundLevelConfig.get(1);
Assert.assertEquals(200L, secondLevelConfig.getExperienceNeeded().longValue());
Assert.assertEquals(2, secondLevelConfig.getLevel().intValue());
}
private AExperienceLevel getLevel(Integer level, Long neededExperience) {
return AExperienceLevel
.builder()
.level(level)
.experienceNeeded(neededExperience)
.build();
}
}

View File

@@ -0,0 +1,145 @@
package dev.sheldan.abstracto.experience.service.management;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.experience.ExperienceRelatedTest;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.models.database.AExperienceRole;
import dev.sheldan.abstracto.experience.repository.ExperienceRoleRepository;
import dev.sheldan.abstracto.test.MockUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ExperienceRoleManagementServiceBeanTest extends ExperienceRelatedTest {
@InjectMocks
private ExperienceRoleManagementServiceBean testUnit;
@Mock
private ExperienceRoleRepository experienceRoleRepository;
@Captor
private ArgumentCaptor<AExperienceRole> roleArgumentCaptor;
@Test
public void testRemovingAllRoleAssignmentsForLevel() {
AServer server = MockUtils.getServer();
AExperienceLevel level = getLevel(10, 100L);
List<AExperienceRole> experienceRoles = getExperienceRoles();
when(experienceRoleRepository.findByLevelAndRoleServer(level, server)).thenReturn(experienceRoles);
testUnit.removeAllRoleAssignmentsForLevelInServer(level, server);
verify(experienceRoleRepository, times(1)).findByLevelAndRoleServer(level, server);
verify(experienceRoleRepository, times(experienceRoles.size())).delete(roleArgumentCaptor.capture());
List<AExperienceRole> allValues = roleArgumentCaptor.getAllValues();
for (int i = 0; i < allValues.size(); i++) {
AExperienceRole role = allValues.get(i);
AExperienceRole innerRole = experienceRoles.get(i);
Assert.assertEquals(innerRole.getLevel().getLevel(), role.getLevel().getLevel());
Assert.assertEquals(innerRole.getRole().getId(), role.getRole().getId());
}
Assert.assertEquals(2, allValues.size());
}
@Test
public void removeRoleAssignmentsForLevelWithoutAny() {
AServer server = MockUtils.getServer();
AExperienceLevel level = getLevel(10, 100L);
List<AExperienceRole> experienceRoles = new ArrayList<>();
when(experienceRoleRepository.findByLevelAndRoleServer(level, server)).thenReturn(experienceRoles);
testUnit.removeAllRoleAssignmentsForLevelInServer(level, server);
verify(experienceRoleRepository, times(1)).findByLevelAndRoleServer(level, server);
verify(experienceRoleRepository, times(experienceRoles.size())).delete(roleArgumentCaptor.capture());
List<AExperienceRole> allValues = roleArgumentCaptor.getAllValues();
Assert.assertEquals(0, allValues.size());
}
@Test
public void testUnsetRole() {
AExperienceRole role = getExperienceRoleForLevel(37);
testUnit.unsetRole(role);
verify(experienceRoleRepository, times(1)).delete(role);
}
@Test
public void testFindExperienceRoleForRoleInServer() {
AExperienceRole expRole = getExperienceRoleForLevel(37);
when((experienceRoleRepository.findByRole(expRole.getRole()))).thenReturn(expRole);
AExperienceRole roleInServer = testUnit.getRoleInServer(expRole.getRole());
Assert.assertEquals(expRole.getRole().getId(), roleInServer.getRole().getId());
verify(experienceRoleRepository, times(1)).findByRole(expRole.getRole());
}
@Test
public void testFindExperienceRolesForServer() {
AServer server = MockUtils.getServer();
List<AExperienceRole> experienceRoles = getExperienceRoles();
when(experienceRoleRepository.findByRoleServer(server)).thenReturn(experienceRoles);
List<AExperienceRole> experienceRolesForServer = testUnit.getExperienceRolesForServer(server);
verify(experienceRoleRepository, times(1)).findByRoleServer(server);
for (int i = 0; i < experienceRolesForServer.size(); i++) {
AExperienceRole role = experienceRolesForServer.get(i);
AExperienceRole innerRole = experienceRoles.get(i);
Assert.assertEquals(innerRole.getLevel().getLevel(), role.getLevel().getLevel());
Assert.assertEquals(innerRole.getRole().getId(), role.getRole().getId());
}
Assert.assertEquals(2, experienceRolesForServer.size());
}
@Test
public void setLevelToRoleWhichHasAnExistingMapping() {
int level = 5;
AExperienceRole experienceRole = getExperienceRoleForLevel(level);
when(experienceRoleRepository.findByRole(experienceRole.getRole())).thenReturn(experienceRole);
AExperienceLevel newLevel = AExperienceLevel.builder().level(8).build();
AExperienceRole updatedExperienceRole = testUnit.setLevelToRole(newLevel, experienceRole.getRole());
verify(experienceRoleRepository, times(1)).findByRole(experienceRole.getRole());
Assert.assertEquals(newLevel.getLevel(), updatedExperienceRole.getLevel().getLevel());
}
@Test
public void setLevelToRoleWithoutAMappingExistingPreviously() {
int level = 5;
AExperienceRole experienceRole = getExperienceRoleForLevel(level);
when(experienceRoleRepository.findByRole(experienceRole.getRole())).thenReturn(null);
when(experienceRoleRepository.save(any(AExperienceRole.class))).thenReturn(experienceRole);
AExperienceLevel newLevel = AExperienceLevel.builder().level(8).build();
AExperienceRole updatedExperienceRole = testUnit.setLevelToRole(newLevel, experienceRole.getRole());
verify(experienceRoleRepository, times(1)).findByRole(experienceRole.getRole());
Assert.assertEquals(experienceRole.getLevel().getLevel(), updatedExperienceRole.getLevel().getLevel());
}
private List<AExperienceRole> getExperienceRoles() {
AExperienceRole level5ExperienceRole = getExperienceRoleForLevel(7);
AExperienceRole level10ExperienceRole = getExperienceRoleForLevel(25);
return Arrays.asList(level5ExperienceRole, level10ExperienceRole);
}
private AExperienceRole getExperienceRoleForLevel(int levelToBuild) {
AExperienceLevel firstLevel = AExperienceLevel.builder().level(levelToBuild).build();
return AExperienceRole.builder().role(ARole.builder().id((long) levelToBuild).build()).level(firstLevel).build();
}
private AExperienceLevel getLevel(Integer level, Long neededExperience) {
return AExperienceLevel
.builder()
.level(level)
.experienceNeeded(neededExperience)
.build();
}
}

View File

@@ -0,0 +1,175 @@
package dev.sheldan.abstracto.experience.service.management;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.experience.ExperienceRelatedTest;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import dev.sheldan.abstracto.experience.models.database.LeaderBoardEntryResult;
import dev.sheldan.abstracto.experience.repository.UserExperienceRepository;
import dev.sheldan.abstracto.experience.service.LeaderBoardEntryTestImpl;
import dev.sheldan.abstracto.test.MockUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.data.domain.PageRequest;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class UserExperienceManagementServiceBeanTest extends ExperienceRelatedTest {
@InjectMocks
private UserExperienceManagementServiceBean testUnit;
@Mock
private UserExperienceRepository repository;
@Mock
private ExperienceLevelManagementService experienceLevelManagementService;
@Test
public void testFindUserInServer() {
AUserInAServer user = AUserInAServer.builder().userInServerId(1L).userReference(AUser.builder().id(2L).build()).build();
AUserExperience experience = AUserExperience.builder().user(user).experience(2L).build();
when(repository.findById(user.getUserInServerId())).thenReturn(Optional.of(experience));
AUserExperience userInServer = testUnit.findUserInServer(user);
Assert.assertEquals(experience.getExperience(), userInServer.getExperience());
}
@Test
public void testNoUserCreateNewWhenSearching() {
AUserInAServer user = AUserInAServer.builder().userInServerId(1L).userReference(AUser.builder().id(2L).build()).build();
when(repository.findById(user.getUserInServerId())).thenReturn(Optional.empty());
AExperienceLevel startLevel = mockInitialLevel();
AUserExperience userInServer = testUnit.findUserInServer(user);
Assert.assertEquals(0L, userInServer.getExperience().longValue());
Assert.assertEquals(0L, userInServer.getMessageCount().longValue());
Assert.assertFalse(userInServer.getExperienceGainDisabled());
Assert.assertEquals(startLevel.getLevel(), userInServer.getCurrentLevel().getLevel());
}
@Test
public void testCreatingUserExperience() {
AUserInAServer user = AUserInAServer.builder().userInServerId(1L).userReference(AUser.builder().id(2L).build()).build();
AExperienceLevel startLevel = mockInitialLevel();
AUserExperience userInServer = testUnit.createUserInServer(user);
Assert.assertEquals(0L, userInServer.getExperience().longValue());
Assert.assertEquals(0L, userInServer.getMessageCount().longValue());
Assert.assertFalse(userInServer.getExperienceGainDisabled());
Assert.assertEquals(startLevel.getLevel(), userInServer.getCurrentLevel().getLevel());
}
@Test
public void testLoadAllUsers() {
AServer server = MockUtils.getServer();
List<AUserExperience> experiences = getUserExperiences();
when(repository.findByUser_ServerReference(server)).thenReturn(experiences);
List<AUserExperience> loadedExperiences = testUnit.loadAllUsers(server);
Assert.assertEquals(experiences.size(), loadedExperiences.size());
Assert.assertEquals(experiences.get(0).getExperience(), loadedExperiences.get(0).getExperience());
Assert.assertEquals(experiences.get(1).getExperience(), loadedExperiences.get(1).getExperience());
}
@Test
public void testLoadPaginated() {
AServer server = MockUtils.getServer();
int endIndex = 20;
int startIndex = 11;
List<AUserExperience> userExperiences = getUserExperiences();
when(repository.findTop10ByUser_ServerReferenceOrderByExperienceDesc(server, PageRequest.of(startIndex, endIndex))).thenReturn(userExperiences);
List<AUserExperience> leaderboardUsersPaginated = testUnit.findLeaderboardUsersPaginated(server, startIndex, endIndex);
Assert.assertEquals(userExperiences.size(), leaderboardUsersPaginated.size());
for (int i = 0; i < userExperiences.size(); i++) {
Assert.assertEquals(userExperiences.get(i).getExperience(), leaderboardUsersPaginated.get(i).getExperience());
}
}
@Test
public void testLoadRankOfUser() {
long experienceValue = 2L;
AUserExperience experience = AUserExperience.builder().experience(experienceValue).id(3L).build();
LeaderBoardEntryTestImpl leaderBoardEntryTest = LeaderBoardEntryTestImpl
.builder()
.experience(experienceValue)
.build();
when(repository.getRankOfUserInServer(experience.getId())).thenReturn(leaderBoardEntryTest);
LeaderBoardEntryResult rankOfUserInServer = testUnit.getRankOfUserInServer(experience);
Assert.assertEquals(experienceValue, rankOfUserInServer.getExperience().longValue());
}
@Test
public void testIncrementExpForUser() {
executeTestForExperienceGain(false);
}
@Test
public void testIncrementExpForUserWithDisabledExp() {
executeTestForExperienceGain(true);
}
@Test
public void testIncrementForNonExistingUser() {
long addedExperience = 15L;
long addedMessages = 1L;
AUserInAServer user = AUserInAServer.builder().userInServerId(1L).userReference(AUser.builder().id(2L).build()).build();
when(repository.findById(user.getUserInServerId())).thenReturn(Optional.empty());
mockInitialLevel();
AUserExperience userExperience = testUnit.incrementExpForUser(user, addedExperience, addedMessages);
Assert.assertEquals(addedExperience, userExperience.getExperience().longValue());
Assert.assertEquals(addedMessages, userExperience.getMessageCount().longValue());
}
@Test
public void testSaveUser() {
AUserInAServer user = AUserInAServer.builder().userInServerId(1L).userReference(AUser.builder().id(2L).build()).build();
AUserExperience experience = AUserExperience.builder().user(user).experience(2L).build();
when(repository.save(experience)).thenReturn(experience);
AUserExperience createdInstance = testUnit.saveUser(experience);
Assert.assertEquals(experience.getExperience(), createdInstance.getExperience());
Assert.assertEquals(experience.getUser().getUserReference().getId(), createdInstance.getUser().getUserReference().getId());
}
private AExperienceLevel mockInitialLevel() {
AExperienceLevel startLevel = AExperienceLevel.builder().level(0).experienceNeeded(0L).build();
when(experienceLevelManagementService.getLevel(startLevel.getLevel())).thenReturn(Optional.of(startLevel));
return startLevel;
}
private void executeTestForExperienceGain(boolean experienceGainDisabled) {
long oldExperience = 20L;
long oldMessageCount = 25L;
long addedExperience = 15L;
long addedMessages = 1L;
AUserInAServer user = AUserInAServer.builder().userInServerId(1L).userReference(AUser.builder().id(2L).build()).build();
AUserExperience experience = AUserExperience.builder().user(user).experienceGainDisabled(experienceGainDisabled).experience(oldExperience).messageCount(oldMessageCount).id(3L).build();
when(repository.findById(user.getUserInServerId())).thenReturn(Optional.of(experience));
AUserExperience userExperience = testUnit.incrementExpForUser(user, addedExperience, addedMessages);
long wantedExperience;
long wantedMessageCount;
if(experienceGainDisabled) {
wantedExperience = oldExperience;
wantedMessageCount = oldMessageCount;
} else {
wantedExperience = oldExperience + addedExperience;
wantedMessageCount = oldMessageCount + addedMessages;
}
Assert.assertEquals(wantedExperience, userExperience.getExperience().longValue());
Assert.assertEquals(wantedMessageCount, userExperience.getMessageCount().longValue());
}
private List<AUserExperience> getUserExperiences() {
AUserExperience experience = AUserExperience.builder().experience(2L).build();
AUserExperience experience2 = AUserExperience.builder().experience(2L).build();
return Arrays.asList(experience, experience2);
}
}

View File

@@ -10,6 +10,10 @@ import java.util.List;
@Component @Component
public class ExperienceFeatureConfig implements FeatureConfig { public class ExperienceFeatureConfig implements FeatureConfig {
public static final String MIN_EXP_KEY = "minExp";
public static final String MAX_EXP_KEY = "maxExp";
public static final String EXP_MULTIPLIER_KEY = "expMultiplier";
@Override @Override
public FeatureEnum getFeature() { public FeatureEnum getFeature() {
return ExperienceFeature.EXPERIENCE; return ExperienceFeature.EXPERIENCE;
@@ -17,6 +21,6 @@ public class ExperienceFeatureConfig implements FeatureConfig {
@Override @Override
public List<String> getRequiredSystemConfigKeys() { public List<String> getRequiredSystemConfigKeys() {
return Arrays.asList("expMultiplier", "minExp", "maxExp"); return Arrays.asList(EXP_MULTIPLIER_KEY, MIN_EXP_KEY, MAX_EXP_KEY);
} }
} }

View File

@@ -9,7 +9,7 @@ import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.models.database.AExperienceRole; import dev.sheldan.abstracto.experience.models.database.AExperienceRole;
import dev.sheldan.abstracto.experience.models.database.AUserExperience; import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import java.util.HashMap; import java.util.Map;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -27,20 +27,21 @@ public interface AUserExperienceService {
void addExperience(AUserInAServer userInAServer); void addExperience(AUserInAServer userInAServer);
/** /**
* The current representation of the run time epxerience. Basically a HashMap of minutes to a list of {@link AServer} * The current representation of the run time experience. Basically a HashMap of minutes to a list of {@link AServer}
* containing a list of {@link AUserInAServer} which should gain experience in the minute used as key in the HashMap * containing a list of {@link AUserInAServer} which should gain experience in the minute used as key in the HashMap
* @return * @return
*/ */
HashMap<Long, List<AServer>> getRuntimeExperience(); Map<Long, List<AServer>> getRuntimeExperience();
/** /**
* Calculates the appropriate level of the given {@link AUserExperience} according to the given {@link AExperienceLevel} * Calculates the appropriate level of the given {@link AUserExperience} according to the given {@link AExperienceLevel}
* configuration. * configuration.
* @param experience The {@link AUserExperience} to calculate the level for * @param experience The {@link AUserExperience} to calculate the level for
* @param levels The list of {@link AExperienceLevel} representing the level configuration * @param levels The list of {@link AExperienceLevel} representing the level configuration, this must include the initial level 0
* This level will be taken as the initial value, and if no other level qualifies, this will be taken. The levels must be ordered.
* @return The appropriate level of {@link AUserExperience} according to the provided {@link AExperienceLevel} configuration * @return The appropriate level of {@link AUserExperience} according to the provided {@link AExperienceLevel} configuration
*/ */
Integer calculateLevel(AUserExperience experience, List<AExperienceLevel> levels); AExperienceLevel calculateLevel(AUserExperience experience, List<AExperienceLevel> levels);
/** /**
* Increases the experience of the provided {@link AUserExperience} object and and calculates the new level according * Increases the experience of the provided {@link AUserExperience} object and and calculates the new level according
@@ -49,7 +50,7 @@ public interface AUserExperienceService {
* @param levels The list of {@link AExperienceLevel} to be used as level configuration * @param levels The list of {@link AExperienceLevel} to be used as level configuration
* @return Whether or not the user changed level * @return Whether or not the user changed level
*/ */
boolean updateUserlevel(AUserExperience userExperience, List<AExperienceLevel> levels); boolean updateUserLevel(AUserExperience userExperience, List<AExperienceLevel> levels);
/** /**
* Iterates through the given list of {@link AServer} and increases the experience of the users contained in the * Iterates through the given list of {@link AServer} and increases the experience of the users contained in the

View File

@@ -20,4 +20,12 @@ public interface ExperienceLevelService {
* @return The amount of experience required necessary to get to one level higher as currently. * @return The amount of experience required necessary to get to one level higher as currently.
*/ */
Long calculateExperienceToNextLevel(Integer level, Long currentExperience); Long calculateExperienceToNextLevel(Integer level, Long currentExperience);
/**
* Calculates the required experience to reach this level. This calculated experience is relative, in the sense
* the returned experience is the increment from the experience requirement from the level before.
* @param level The level to calculate the experience amount for
* @return The needed experience to reach this level, if the user already has the level below the passed one
*/
Long calculateExperienceForLevel(Integer level);
} }

View File

@@ -17,18 +17,16 @@ public interface ExperienceRoleService {
* Creates an {@link dev.sheldan.abstracto.experience.models.database.AExperienceRole} according to the given * Creates an {@link dev.sheldan.abstracto.experience.models.database.AExperienceRole} according to the given
* parameters * parameters
* @param role The {@link ARole} to set the level to * @param role The {@link ARole} to set the level to
* @param level The level the {@link ARole} should be awareded at * @param level The level the {@link ARole} should be awarded at
* @param server The {@link AServer} for which this configuration should be done
*/ */
void setRoleToLevel(ARole role, Integer level, AServer server, AChannel channel); void setRoleToLevel(ARole role, Integer level, AChannel channel);
/** /**
* Removes the role from the {@link dev.sheldan.abstracto.experience.models.database.AExperienceRole} configuration * Removes the role from the {@link dev.sheldan.abstracto.experience.models.database.AExperienceRole} configuration
* @param role The {@link ARole} to remove from the {@link dev.sheldan.abstracto.experience.models.database.AExperienceRole} * @param role The {@link ARole} to remove from the {@link dev.sheldan.abstracto.experience.models.database.AExperienceRole}
* configuration * configuration
* @param server The {@link AServer} for which the {@link ARole} should be removed from the configuration
*/ */
void unsetRole(ARole role, AServer server, AChannel feedbackChannel); void unsetRole(ARole role, AChannel feedbackChannel);
/** /**
* Calculates the appropriate {@link AExperienceRole} based on the provided list of {@link AExperienceRole} * Calculates the appropriate {@link AExperienceRole} based on the provided list of {@link AExperienceRole}

View File

@@ -19,9 +19,9 @@ public interface ExperienceRoleManagementService {
* the new level. * the new level.
* @param level The {@link AExperienceLevel} to set the role for * @param level The {@link AExperienceLevel} to set the role for
* @param role The {@link ARole} to set to * @param role The {@link ARole} to set to
* @param server The {@link AServer} in which this should happen. * @return the created or updated {@link AExperienceRole}
*/ */
void setLevelToRole(AExperienceLevel level, ARole role, AServer server); AExperienceRole setLevelToRole(AExperienceLevel level, ARole role);
/** /**
* Deletes *all* (if there are multiple by some chance) roles which were set to be given at the provided {@link AExperienceLevel} in the {@link AServer} * Deletes *all* (if there are multiple by some chance) roles which were set to be given at the provided {@link AExperienceLevel} in the {@link AServer}
@@ -39,10 +39,9 @@ public interface ExperienceRoleManagementService {
/** /**
* Retrieves the {@link AExperienceRole} which uses the given {@link ARole} in the {@link AServer} * Retrieves the {@link AExperienceRole} which uses the given {@link ARole} in the {@link AServer}
* @param role The {@link ARole} to search for * @param role The {@link ARole} to search for
* @param server The {@link AServer} in which to search in * @return the {@link AExperienceRole} which uses the given {@link ARole}
* @return
*/ */
AExperienceRole getRoleInServer(ARole role, AServer server); AExperienceRole getRoleInServer(ARole role);
/** /**
* Retrives all {@link AExperienceRole} configured in the given {@link AServer} * Retrives all {@link AExperienceRole} configured in the given {@link AServer}

View File

@@ -63,6 +63,7 @@ public interface UserExperienceManagementService {
/** /**
* Persists the {@link AUserExperience} in the database. Required when creating it * Persists the {@link AUserExperience} in the database. Required when creating it
* @param userExperience The {@link AUserExperience} to persist * @param userExperience The {@link AUserExperience} to persist
* @return The persisted {@link AUserExperience} instance
*/ */
void saveUser(AUserExperience userExperience); AUserExperience saveUser(AUserExperience userExperience);
} }

View File

@@ -208,7 +208,7 @@ public class CommandReceivedHandler extends ListenerAdapter {
} }
} }
} catch (NoSuchElementException e) { } catch (NoSuchElementException e) {
throw new IncorrectParameter("The passed parameters did not have the correct type.", command, param.getType(), param.getName()); throw new IncorrectParameter(command, param.getType(), param.getName());
} }
} }

View File

@@ -44,7 +44,7 @@ public class CommandCreationListener {
log.warn("Command {} has null configuration.", command); log.warn("Command {} has null configuration.", command);
return; return;
} }
if(commandService.doesCommandExist(command.getConfiguration().getName())) { if(!commandService.doesCommandExist(command.getConfiguration().getName())) {
commandService.createCommand(command.getConfiguration().getName(), command.getConfiguration().getModule(), command.getFeature()); commandService.createCommand(command.getConfiguration().getName(), command.getConfiguration().getModule(), command.getFeature());
} }
}); });

View File

@@ -3,11 +3,15 @@ package dev.sheldan.abstracto.core.command.repository;
import dev.sheldan.abstracto.core.command.models.database.ACommand; import dev.sheldan.abstracto.core.command.models.database.ACommand;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.QueryHints; import org.springframework.data.jpa.repository.QueryHints;
import org.springframework.stereotype.Repository;
import javax.persistence.QueryHint; import javax.persistence.QueryHint;
@Repository
public interface CommandRepository extends JpaRepository<ACommand, Long> { public interface CommandRepository extends JpaRepository<ACommand, Long> {
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
ACommand findByName(String name); ACommand findByName(String name);
boolean existsByName(String name);
} }

View File

@@ -45,7 +45,7 @@ public class CommandManager implements CommandRegistry {
boolean hasRemainderParameter = commandConfiguration.getParameters().stream().anyMatch(Parameter::isRemainder); boolean hasRemainderParameter = commandConfiguration.getParameters().stream().anyMatch(Parameter::isRemainder);
if(unParsedCommandParameter.getParameters().size() < commandConfiguration.getNecessaryParameterCount()) { if(unParsedCommandParameter.getParameters().size() < commandConfiguration.getNecessaryParameterCount()) {
String nextParameterName = commandConfiguration.getParameters().get(commandConfiguration.getNecessaryParameterCount() - 1).getName(); String nextParameterName = commandConfiguration.getParameters().get(commandConfiguration.getNecessaryParameterCount() - 1).getName();
throw new InsufficientParameters("Insufficient parameters", o, nextParameterName); throw new InsufficientParameters(o, nextParameterName);
} }
parameterFit = paramCountFits || hasRemainderParameter; parameterFit = paramCountFits || hasRemainderParameter;
} else { } else {

View File

@@ -45,7 +45,7 @@ public class CommandManagementServiceBean implements CommandManagementService {
@Override @Override
public boolean doesCommandExist(String name) { public boolean doesCommandExist(String name) {
return findCommandByName(name) != null; return commandRepository.existsByName(name.toLowerCase());
} }
} }

View File

@@ -1,5 +1,9 @@
package dev.sheldan.abstracto.core.command.condition; package dev.sheldan.abstracto.core.command.condition;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.exception.IncorrectParameter;
import dev.sheldan.abstracto.core.command.exception.InsufficientParameters;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -30,4 +34,35 @@ public abstract class AbstractConditionableCommand implements ConditionalCommand
public List<CommandCondition> getConditions() { public List<CommandCondition> getConditions() {
return new ArrayList<>(Arrays.asList(featureEnabledCondition, commandDisabledCondition, commandDisallowedCondition, featureModeCondition)); return new ArrayList<>(Arrays.asList(featureEnabledCondition, commandDisabledCondition, commandDisallowedCondition, featureModeCondition));
} }
protected void checkParameters(CommandContext context) {
List<Parameter> parameters = getConfiguration().getParameters();
for (int i = 0; i < parameters.size(); i++) {
Parameter parameter = parameters.get(i);
Class desiredType = parameter.getType();
if(!parameter.isOptional()) {
checkMandatoryExp(context, i, parameter, desiredType);
} else {
checkOptionalParameter(context, i, parameter, desiredType);
}
}
}
private void checkOptionalParameter(CommandContext context, int i, Parameter parameter, Class desiredType) {
if(context.getParameters() != null && context.getParameters().getParameters() != null && context.getParameters().getParameters().size() >= i) {
boolean parameterIsPresent = i < context.getParameters().getParameters().size();
if(parameterIsPresent && !desiredType.isInstance(context.getParameters().getParameters().get(i))) {
throw new IncorrectParameter(this, desiredType, parameter.getName());
}
}
}
private void checkMandatoryExp(CommandContext context, int i, Parameter parameter, Class desiredType) {
if(context.getParameters() == null || context.getParameters().getParameters() == null || context.getParameters().getParameters().isEmpty() || i >= context.getParameters().getParameters().size()) {
throw new InsufficientParameters(this, parameter.getName());
}
if(!desiredType.isInstance(context.getParameters().getParameters().get(i))) {
throw new IncorrectParameter(this, desiredType, parameter.getName());
}
}
} }

View File

@@ -12,8 +12,8 @@ public class IncorrectParameter extends AbstractoRunTimeException implements Tem
private final String parameterName; private final String parameterName;
private final Class clazz; private final Class clazz;
public IncorrectParameter(String s, Command command, Class expected, String parameterName) { public IncorrectParameter(Command command, Class expected, String parameterName) {
super(s); super("");
this.command = command; this.command = command;
this.parameterName = parameterName; this.parameterName = parameterName;
this.clazz = expected; this.clazz = expected;

View File

@@ -13,8 +13,8 @@ public class InsufficientParameters extends AbstractoRunTimeException implements
private final transient Command command; private final transient Command command;
private final String parameterName; private final String parameterName;
public InsufficientParameters(String s, Command command, String parameterName) { public InsufficientParameters(Command command, String parameterName) {
super(s); super("");
this.command = command; this.command = command;
this.parameterName = parameterName; this.parameterName = parameterName;
} }

View File

@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.command.config.Parameters;
import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext; import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
@@ -12,6 +13,7 @@ import net.dv8tion.jda.api.entities.TextChannel;
@Builder @Builder
@Getter @Getter
@Setter
public class CommandContext { public class CommandContext {
private TextChannel channel; private TextChannel channel;
private Guild guild; private Guild guild;

View File

@@ -94,16 +94,11 @@ public class AServer implements SnowFlake, Serializable {
if (o == null || getClass() != o.getClass()) return false; if (o == null || getClass() != o.getClass()) return false;
AServer aServer = (AServer) o; AServer aServer = (AServer) o;
return Objects.equals(id, aServer.id) && return Objects.equals(id, aServer.id) &&
Objects.equals(name, aServer.name) && Objects.equals(name, aServer.name);
Objects.equals(roles, aServer.roles) &&
Objects.equals(channels, aServer.channels) &&
Objects.equals(channelGroups, aServer.channelGroups) &&
Objects.equals(users, aServer.users) &&
Objects.equals(emotes, aServer.emotes);
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(id, name, roles, channels, channelGroups, users, emotes); return Objects.hash(id, name);
} }
} }

View File

@@ -15,6 +15,7 @@
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<modules> <modules>
<module>test-commons</module>
<module>core</module> <module>core</module>
<module>executable</module> <module>executable</module>
<module>templating</module> <module>templating</module>

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>abstracto-application</artifactId>
<groupId>dev.sheldan.abstracto</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>test-commons</artifactId>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>dev.sheldan.abstracto.core</groupId>
<artifactId>core-impl</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,65 @@
package dev.sheldan.abstracto.test;
import dev.sheldan.abstracto.core.models.database.*;
import net.dv8tion.jda.api.entities.MessageType;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.internal.JDAImpl;
import net.dv8tion.jda.internal.entities.*;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
public class MockUtils {
private MockUtils() {
}
public static AUserInAServer getUserObject(Long id, AServer server) {
AUser user = AUser.builder().id(id).build();
AUserInAServer createdUser = AUserInAServer.builder().userReference(user).serverReference(server).build();
server.getUsers().add(createdUser);
return createdUser;
}
public static AServer getServer(Long id){
return AServer.builder().id(id).build();
}
public static AServer getServer() {
return getServer(2L);
}
public static GuildImpl getGuild(AServer serverToUse, JDAImpl jda) {
return new GuildImpl(jda, serverToUse.getId());
}
public static MemberImpl getMockedMember(AServer serverToUse, AUserInAServer user, JDAImpl jda) {
UserImpl jdaUser = new UserImpl(user.getUserReference().getId(), jda);
GuildImpl jdaGuild = new GuildImpl(jda, serverToUse.getId());
return new MemberImpl(jdaGuild, jdaUser);
}
public static AChannel getTextChannel(AServer server, Long id) {
return AChannel.builder().id(id).server(server).deleted(false).type(AChannelType.TEXT).build();
}
public static TextChannelImpl getMockedTextChannel(Long id, GuildImpl guild) {
return new TextChannelImpl(id, guild);
}
public static ARole getRole(Long id, AServer server) {
return ARole.builder().server(server).id(id).build();
}
public static ReceivedMessage buildMockedMessage(long messageId, String text, MemberImpl member) {
Instant dateObj = Instant.ofEpochSecond(1590615937);
OffsetDateTime messageDate = OffsetDateTime.ofInstant(dateObj, ZoneId.systemDefault());
User user = member != null ? member.getUser() : null;
return new ReceivedMessage(messageId, null, MessageType.DEFAULT, false, false
, null, null, false, false, text, "nonce", user, member, null, messageDate,
new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), 0);
}
}

View File

@@ -0,0 +1,88 @@
package dev.sheldan.abstracto.test.command;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.config.Parameters;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.command.execution.ResultState;
import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.test.MockUtils;
import net.dv8tion.jda.internal.JDAImpl;
import net.dv8tion.jda.internal.entities.GuildImpl;
import net.dv8tion.jda.internal.entities.MemberImpl;
import net.dv8tion.jda.internal.entities.TextChannelImpl;
import org.junit.Assert;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CommandTestUtilities {
private CommandTestUtilities() {
}
public static void executeNoParametersTest(Command com, JDAImpl jda) {
CommandContext context = CommandTestUtilities.getNoParameters(jda);
com.execute(context);
}
public static void executeWrongParametersTest(Command com, JDAImpl jda) {
executeWrongParametersTest(com, jda, "");
}
public static void executeWrongParametersTest(Command com, JDAImpl jda, Object value) {
CommandContext context = CommandTestUtilities.getWithParameters(jda, Arrays.asList(value));
com.execute(context);
}
public static CommandContext getNoParameters(JDAImpl jda) {
AServer server = MockUtils.getServer();
AUserInAServer author = MockUtils.getUserObject(3L, server);
CommandContext context = CommandContext
.builder()
.build();
GuildImpl guild = MockUtils.getGuild(server, jda);
context.setGuild(guild);
MemberImpl member = MockUtils.getMockedMember(server, author, jda);
context.setAuthor(member);
long channelId = 4L;
TextChannelImpl mockedTextChannel = MockUtils.getMockedTextChannel(channelId, guild);
UserInitiatedServerContext userInitiatedContext = UserInitiatedServerContext
.builder()
.server(server)
.guild(guild)
.aUserInAServer(author)
.member(member)
.user(author.getUserReference())
.channel(MockUtils.getTextChannel(server, channelId))
.messageChannel(mockedTextChannel)
.build();
context.setUserInitiatedContext(userInitiatedContext);
context.setJda(jda);
context.setChannel(mockedTextChannel);
context.setParameters(Parameters.builder().parameters(new ArrayList<>()).build());
context.setMessage(MockUtils.buildMockedMessage(3L, "text", member));
return context;
}
public static CommandContext getWithParameters(JDAImpl jda, List<Object> parameters) {
CommandContext context = getNoParameters(jda);
context.getParameters().getParameters().addAll(parameters);
return context;
}
public static CommandContext enhanceWithParameters(CommandContext context, List<Object> parameters) {
context.getParameters().getParameters().addAll(parameters);
return context;
}
public static void checkSuccessfulCompletion(CommandResult result){
Assert.assertEquals(ResultState.SUCCESSFUL, result.getResult());
}
}