renamed template method to not rely on overloading

added test for scheduler service bean
This commit is contained in:
Sheldan
2020-04-08 13:26:37 +02:00
parent da28831ff9
commit e13762fa02
12 changed files with 179 additions and 11 deletions

View File

@@ -32,7 +32,7 @@ public class Ban extends AbstractConditionableCommand {
public CommandResult execute(CommandContext commandContext) {
List<Object> parameters = commandContext.getParameters().getParameters();
Member member = (Member) parameters.get(0);
String defaultReason = templateService.renderTemplate("ban_default_reason", null);
String defaultReason = templateService.renderTemplateWithMap("ban_default_reason", null);
String reason = parameters.size() == 2 ? (String) parameters.get(1) : defaultReason;
BanLog banLogModel = (BanLog) ContextConverter.fromCommandContext(commandContext, BanLog.class);

View File

@@ -29,7 +29,7 @@ public class BanId extends AbstractConditionableCommand {
public CommandResult execute(CommandContext commandContext) {
List<Object> parameters = commandContext.getParameters().getParameters();
Long userId = (Long) parameters.get(0);
String defaultReason = templateService.renderTemplate("ban_default_reason", null);
String defaultReason = templateService.renderTemplateWithMap("ban_default_reason", null);
String reason = parameters.size() == 2 ? (String) parameters.get(1) : defaultReason;
BanIdLog banLogModel = (BanIdLog) ContextConverter.fromCommandContext(commandContext, BanIdLog.class);
banLogModel.setBannedUserId(userId);

View File

@@ -31,7 +31,7 @@ public class Kick extends AbstractConditionableCommand {
List<Object> parameters = commandContext.getParameters().getParameters();
Member member = (Member) parameters.get(0);
String defaultReason = templateService.renderTemplate("ban_default_reason", null);
String defaultReason = templateService.renderTemplateWithMap("ban_default_reason", null);
String reason = parameters.size() == 2 ? (String) parameters.get(1) : defaultReason;
KickLogModel kickLogModel = (KickLogModel) ContextConverter.fromCommandContext(commandContext, KickLogModel.class);

View File

@@ -36,7 +36,7 @@ public class Warn extends AbstractConditionableCommand {
public CommandResult execute(CommandContext commandContext) {
List<Object> parameters = commandContext.getParameters().getParameters();
Member member = (Member) parameters.get(0);
String defaultReason = templateService.renderTemplate("warn_default_reason", null);
String defaultReason = templateService.renderTemplateWithMap("warn_default_reason", null);
String reason = parameters.size() == 2 ? (String) parameters.get(1) : defaultReason;
WarnLog warnLogModel = (WarnLog) ContextConverter.fromCommandContext(commandContext, WarnLog.class);
warnLogModel.setWarnedUser(member);

View File

@@ -43,7 +43,7 @@ public class JoinLogger implements JoinListener {
@Override
public void execute(Member member, Guild guild) {
HashMap<String, Object> parameters = getUserParameter(member.getUser());
String text = templateService.renderTemplate(USER_JOIN_TEMPLATE, parameters);;
String text = templateService.renderTemplateWithMap(USER_JOIN_TEMPLATE, parameters);;
postTargetService.sendTextInPostTarget(text, JOIN_LOG_TARGET, guild.getIdLong());
}

View File

@@ -43,7 +43,7 @@ public class LeaveLogger implements LeaveListener {
@Override
public void execute(Member member, Guild guild) {
String text = templateService.renderTemplate(USER_LEAVE_TEMPLATE, getUserParameter(member.getUser()));
String text = templateService.renderTemplateWithMap(USER_LEAVE_TEMPLATE, getUserParameter(member.getUser()));
postTargetService.sendTextInPostTarget(text, LEAVE_LOG_TARGET, guild.getIdLong());
}

View File

@@ -94,7 +94,7 @@ public class Help implements Command {
if(templateKey == null || !commandConfiguration.isTemplated()) {
return defaultText;
} else {
return templateService.renderTemplate(templateKey, null);
return templateService.renderTemplateWithMap(templateKey, null);
}
}

View File

@@ -78,7 +78,12 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.2.6.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
@@ -110,6 +115,12 @@
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,145 @@
package dev.sheldan.abstracto.scheduling.factory;
import dev.sheldan.abstracto.scheduling.model.database.SchedulerJob;
import dev.sheldan.abstracto.scheduling.service.SchedulerServiceBean;
import dev.sheldan.abstracto.scheduling.service.management.SchedulerJobManagementServiceBean;
import org.junit.Before;
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 org.quartz.*;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.*;
@RunWith(MockitoJUnitRunner.class)
public class SchedulerServiceBeanTest {
public static final String JOB_CLASS = "dev.sheldan.abstracto.scheduling.factory.TestJob";
public static final String JOB_NAME = "jobName";
public static final String GROUP_NAME = "groupName";
@InjectMocks
private SchedulerServiceBean classToTest;
@Mock
private SchedulerFactoryBean schedulerFactoryBean;
@Mock
private ApplicationContext context;
@Mock
private QuartzConfigFactory scheduleCreator;
@Mock
private SchedulerJobManagementServiceBean schedulerJobManagementServiceBean;
@Mock
private Scheduler scheduler;
@Before
public void setup() throws ClassNotFoundException {
when(schedulerFactoryBean.getScheduler()).thenReturn(scheduler);
when(scheduleCreator.createJob(eq(TestJob.class), anyBoolean(), any(), anyString(), anyString(), anyBoolean())).thenReturn(getJobDetail());
}
@Test
public void testStartingAllJobs() throws SchedulerException {
when(schedulerJobManagementServiceBean.findAll()).thenReturn(allCronJobsActive());
classToTest.startScheduledJobs();
verify(scheduler, times(2)).checkExists(eq(new JobKey("jobName", "groupName")));
verify(scheduler, times(2)).addJob(any(JobDetail.class), eq(true));
}
@Test
public void testStartSomeJobs() throws SchedulerException {
when(schedulerJobManagementServiceBean.findAll()).thenReturn(someCronJobsActive());
classToTest.startScheduledJobs();
verify(scheduler, times(1)).checkExists(eq(new JobKey("jobName", "groupName")));
verify(scheduler, times(1)).addJob(any(JobDetail.class), eq(true));
}
@Test
public void testInvalidClass() throws SchedulerException {
when(schedulerJobManagementServiceBean.findAll()).thenReturn(Arrays.asList(SchedulerJob.builder().active(true).cronExpression("*").clazz("invalidJob").groupName(GROUP_NAME).name(JOB_NAME).build()));
classToTest.startScheduledJobs();
verify(scheduler, times(0)).checkExists(eq(new JobKey("jobName", "groupName")));
verify(scheduler, times(0)).addJob(any(JobDetail.class), eq(true));
}
@Test
public void scheduleSingleJob() throws SchedulerException {
classToTest.scheduleJob(activeJobCronJob());
verify(scheduler, times(1)).checkExists(eq(new JobKey("jobName", "groupName")));
verify(scheduler, times(1)).addJob(any(JobDetail.class), eq(true));
}
@Test
public void unScheduleSingleJob() throws SchedulerException {
classToTest.unScheduleJob(JOB_NAME);
verify(scheduler, times(1)).unscheduleJob(any(TriggerKey.class));
}
@Test
public void executeJobOnce() throws SchedulerException {
when(scheduleCreator.createOnceOnlyTriggerForJob(eq(JOB_NAME), eq(GROUP_NAME), any(Date.class), any(JobDataMap.class))).thenReturn(Mockito.mock(Trigger.class));
classToTest.executeJobWithParametersOnce(JOB_NAME, GROUP_NAME, new JobDataMap(), new Date());
verify(scheduler, times(1)).scheduleJob(any(Trigger.class));
}
private List<SchedulerJob> allCronJobsActive() {
List<SchedulerJob> jobs = new ArrayList<>();
jobs.add(activeJobCronJob());
jobs.add(activeJobCronJob());
return jobs;
}
private List<SchedulerJob> someCronJobsActive() {
List<SchedulerJob> jobs = new ArrayList<>();
jobs.add(activeJobCronJob());
jobs.add(inactiveCronJob());
return jobs;
}
private SchedulerJob activeJobCronJob() {
return SchedulerJob.builder().active(true).cronExpression("*").clazz(JOB_CLASS).groupName(GROUP_NAME).name(JOB_NAME).build();
}
private SchedulerJob inactiveCronJob() {
return SchedulerJob.builder().active(false).cronExpression("*").clazz(JOB_CLASS).groupName(GROUP_NAME).name(JOB_NAME).build();
}
private JobDetail getJobDetail() throws ClassNotFoundException {
JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName(JOB_CLASS);
factoryBean.setJobClass(jobClass);
factoryBean.setDurability(true);
factoryBean.setApplicationContext(context);
factoryBean.setRequestsRecovery(false);
factoryBean.setName(JOB_NAME);
factoryBean.setGroup(GROUP_NAME);
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(JOB_NAME + GROUP_NAME, jobClass.getName());
factoryBean.setJobDataMap(jobDataMap);
factoryBean.afterPropertiesSet();
return factoryBean.getObject();
}
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.scheduling.factory;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class TestJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
}
}

View File

@@ -37,7 +37,7 @@ public class TemplateServiceBean implements TemplateService {
private String getPageString(Integer count) {
HashMap<String, Object> params = new HashMap<>();
params.put("count", count);
return renderTemplate("embed_page_count", params);
return renderTemplateWithMap("embed_page_count", params);
}
@Override
@@ -111,7 +111,7 @@ public class TemplateServiceBean implements TemplateService {
}
@Override
public String renderTemplate(String key, HashMap<String, Object> parameters) {
public String renderTemplateWithMap(String key, HashMap<String, Object> parameters) {
try {
return FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate(key), parameters);
} catch (IOException | TemplateException e) {

View File

@@ -8,6 +8,6 @@ import java.util.HashMap;
public interface TemplateService {
String renderTemplate(Template template);
MessageToSend renderEmbedTemplate(String key, Object model);
String renderTemplate(String key, HashMap<String, Object> parameters);
String renderTemplateWithMap(String key, HashMap<String, Object> parameters);
String renderTemplate(String key, Object model);
}