From 8387f587b34ca73f40d18c7de3476dd3ffaf3042 Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Sun, 20 Nov 2022 14:02:45 +0100 Subject: [PATCH 01/18] bump version to 4.0.6-SNAPSHOT --- quartz-manager-parent/pom.xml | 12 ++++++------ quartz-manager-parent/quartz-manager-common/pom.xml | 2 +- .../quartz-manager-starter-api/pom.xml | 2 +- .../quartz-manager-starter-persistence/pom.xml | 2 +- .../quartz-manager-starter-security/pom.xml | 2 +- .../quartz-manager-starter-ui/pom.xml | 2 +- .../quartz-manager-web-showcase/pom.xml | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/quartz-manager-parent/pom.xml b/quartz-manager-parent/pom.xml index 6e8cf80..39f4cfa 100644 --- a/quartz-manager-parent/pom.xml +++ b/quartz-manager-parent/pom.xml @@ -10,7 +10,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.5 + 4.0.6-SNAPSHOT pom @@ -69,27 +69,27 @@ it.fabioformosa.quartz-manager quartz-manager-common - 4.0.5 + 4.0.6-SNAPSHOT it.fabioformosa.quartz-manager quartz-manager-starter-api - 4.0.5 + 4.0.6-SNAPSHOT it.fabioformosa.quartz-manager quartz-manager-starter-security - 4.0.5 + 4.0.6-SNAPSHOT it.fabioformosa.quartz-manager quartz-manager-starter-persistence - 4.0.5 + 4.0.6-SNAPSHOT it.fabioformosa.quartz-manager quartz-manager-starter-ui - 4.0.5 + 4.0.6-SNAPSHOT diff --git a/quartz-manager-parent/quartz-manager-common/pom.xml b/quartz-manager-parent/quartz-manager-common/pom.xml index 964df3c..d2c1637 100644 --- a/quartz-manager-parent/quartz-manager-common/pom.xml +++ b/quartz-manager-parent/quartz-manager-common/pom.xml @@ -3,7 +3,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.5 + 4.0.6-SNAPSHOT quartz-manager-common diff --git a/quartz-manager-parent/quartz-manager-starter-api/pom.xml b/quartz-manager-parent/quartz-manager-starter-api/pom.xml index a1d32d9..8a52e41 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/pom.xml +++ b/quartz-manager-parent/quartz-manager-starter-api/pom.xml @@ -5,7 +5,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.5 + 4.0.6-SNAPSHOT quartz-manager-starter-api diff --git a/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml b/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml index f38265c..29ec8e3 100644 --- a/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml +++ b/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml @@ -3,7 +3,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.5 + 4.0.6-SNAPSHOT quartz-manager-starter-persistence diff --git a/quartz-manager-parent/quartz-manager-starter-security/pom.xml b/quartz-manager-parent/quartz-manager-starter-security/pom.xml index 107a90c..eef8e7b 100644 --- a/quartz-manager-parent/quartz-manager-starter-security/pom.xml +++ b/quartz-manager-parent/quartz-manager-starter-security/pom.xml @@ -4,7 +4,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.5 + 4.0.6-SNAPSHOT quartz-manager-starter-security diff --git a/quartz-manager-parent/quartz-manager-starter-ui/pom.xml b/quartz-manager-parent/quartz-manager-starter-ui/pom.xml index 057d1c8..0e2079a 100644 --- a/quartz-manager-parent/quartz-manager-starter-ui/pom.xml +++ b/quartz-manager-parent/quartz-manager-starter-ui/pom.xml @@ -4,7 +4,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.5 + 4.0.6-SNAPSHOT quartz-manager-starter-ui diff --git a/quartz-manager-parent/quartz-manager-web-showcase/pom.xml b/quartz-manager-parent/quartz-manager-web-showcase/pom.xml index 56ee643..d49c492 100644 --- a/quartz-manager-parent/quartz-manager-web-showcase/pom.xml +++ b/quartz-manager-parent/quartz-manager-web-showcase/pom.xml @@ -5,7 +5,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.5 + 4.0.6-SNAPSHOT quartz-manager-web-showcase From 4b18313e2dd89cc53daed795d877554573f293c7 Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Wed, 23 Nov 2022 20:54:37 +0100 Subject: [PATCH 02/18] #62 removed unused security filter --- .../impl/AjaxAuthenticationFilter.java | 51 ------------------- 1 file changed, 51 deletions(-) delete mode 100644 quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AjaxAuthenticationFilter.java diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AjaxAuthenticationFilter.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AjaxAuthenticationFilter.java deleted file mode 100644 index 9511abb..0000000 --- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AjaxAuthenticationFilter.java +++ /dev/null @@ -1,51 +0,0 @@ -package it.fabioformosa.quartzmanager.api.security.helpers.impl; - -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.core.Authentication; -import org.springframework.security.web.WebAttributes; -import org.springframework.security.web.authentication.AuthenticationSuccessHandler; -import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -public class AjaxAuthenticationFilter extends UsernamePasswordAuthenticationFilter { - - public class AjaxLoginAuthSuccessHandler extends SimpleUrlAuthenticationSuccessHandler - implements AuthenticationSuccessHandler { - - @Override - public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, - Authentication authentication) { - response.setStatus(HttpServletResponse.SC_OK); - super.clearAuthenticationAttributes(request); - } - - } - - public AjaxAuthenticationFilter(AuthenticationManager authenticationManager) { - setAuthenticationManager(authenticationManager); - setUsernameParameter("ajaxUsername"); - setPasswordParameter("ajaxPassword"); - setPostOnly(true); - setFilterProcessesUrl("/ajaxLogin"); - - setAuthenticationSuccessHandler(new AjaxLoginAuthSuccessHandler()); - } - - /** - * Removes temporary authentication-related data which may have been stored - * in the session during the authentication process. - */ - protected final void clearAuthenticationAttributes(HttpServletRequest request) { - HttpSession session = request.getSession(false); - - if (session == null) - return; - - session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); - } - -} From fedb2b50b692622053b6b956543b62a424f16de1 Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Tue, 29 Nov 2022 18:44:46 +0100 Subject: [PATCH 03/18] #62 clean up --- .../api/dto/TriggerFiredBundleDTO.java | 61 ++----------------- .../api/jobs/entities/LogRecord.java | 42 ++----------- .../helpers/impl/AnonAuthentication.java | 16 +---- 3 files changed, 12 insertions(+), 107 deletions(-) diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTO.java index 346b3c6..e6a2104 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTO.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTO.java @@ -1,7 +1,12 @@ package it.fabioformosa.quartzmanager.api.dto; +import lombok.Getter; +import lombok.Setter; + import java.util.Date; +@Getter +@Setter public class TriggerFiredBundleDTO { private int timesTriggered; @@ -18,22 +23,6 @@ public class TriggerFiredBundleDTO { private String jobClass; - public Date getFinalFireTime() { - return finalFireTime; - } - - public String getJobClass() { - return jobClass; - } - - public String getJobKey() { - return jobKey; - } - - public Date getNextFireTime() { - return nextFireTime; - } - public int getPercentage() { if (this.repeatCount <= 0) return -1; @@ -41,44 +30,4 @@ public class TriggerFiredBundleDTO { * 100); } - public Date getPreviousFireTime() { - return previousFireTime; - } - - public int getRepeatCount() { - return repeatCount; - } - - public int getTimesTriggered() { - return timesTriggered; - } - - public void setFinalFireTime(Date finalFireTime) { - this.finalFireTime = finalFireTime; - } - - public void setJobClass(String jobClass) { - this.jobClass = jobClass; - } - - public void setJobKey(String jobKey) { - this.jobKey = jobKey; - } - - public void setNextFireTime(Date nextFireTime) { - this.nextFireTime = nextFireTime; - } - - public void setPreviousFireTime(Date previousFireTime) { - this.previousFireTime = previousFireTime; - } - - public void setRepeatCount(int repeatCount) { - this.repeatCount = repeatCount; - } - - public void setTimesTriggered(int timesTriggered) { - this.timesTriggered = timesTriggered; - } - } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/jobs/entities/LogRecord.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/jobs/entities/LogRecord.java index c62cd06..6451151 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/jobs/entities/LogRecord.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/jobs/entities/LogRecord.java @@ -1,5 +1,8 @@ package it.fabioformosa.quartzmanager.api.jobs.entities; +import lombok.Data; +import lombok.ToString; + import java.util.Date; /** @@ -8,6 +11,8 @@ import java.util.Date; * @author Fabio.Formosa * */ +@Data +@ToString public class LogRecord { public enum LogType { @@ -27,41 +32,4 @@ public class LogRecord { date = new Date(); } - public Date getDate() { - return date; - } - - public String getMessage() { - return message; - } - - public String getThreadName() { - return threadName; - } - - public LogType getType() { - return type; - } - - public void setDate(Date date) { - this.date = date; - } - - public void setMessage(String msg) { - message = msg; - } - - public void setThreadName(String threadName) { - this.threadName = threadName; - } - - public void setType(LogType type) { - this.type = type; - } - - @Override - public String toString() { - return "LogRecord [date=" + date + ", type=" + type + ", message=" + message + "]"; - } - } diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AnonAuthentication.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AnonAuthentication.java index 2651a6c..2ea1410 100644 --- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AnonAuthentication.java +++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AnonAuthentication.java @@ -1,7 +1,9 @@ package it.fabioformosa.quartzmanager.api.security.helpers.impl; +import lombok.EqualsAndHashCode; import org.springframework.security.authentication.AbstractAuthenticationToken; +@EqualsAndHashCode public class AnonAuthentication extends AbstractAuthenticationToken { private static final long serialVersionUID = 1L; @@ -9,15 +11,6 @@ public class AnonAuthentication extends AbstractAuthenticationToken { super( null ); } - @Override - public boolean equals( Object obj ) { - if ( this == obj ) - return true; - if ( obj == null ) - return false; - return getClass() == obj.getClass(); - } - @Override public Object getCredentials() { return null; @@ -28,11 +21,6 @@ public class AnonAuthentication extends AbstractAuthenticationToken { return null; } - @Override - public int hashCode() { - return 7; - } - @Override public boolean isAuthenticated() { return true; From b17d487c8b5baa8f9e5b5c929a12c7f6879e30cc Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Tue, 29 Nov 2022 20:29:55 +0100 Subject: [PATCH 04/18] #62 added missing tests --- .../quartzmanager/api/common/utils/Try.java | 16 +++++++---- .../api/common/utils/TryTest.java | 28 +++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 quartz-manager-parent/quartz-manager-common/src/test/java/it/fabioformosa/quartzmanager/api/common/utils/TryTest.java diff --git a/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/api/common/utils/Try.java b/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/api/common/utils/Try.java index 285dad3..27f7f19 100644 --- a/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/api/common/utils/Try.java +++ b/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/api/common/utils/Try.java @@ -2,25 +2,29 @@ package it.fabioformosa.quartzmanager.api.common.utils; import java.util.function.Function; +/** + * + * @param success type + */ public class Try { private final Throwable failure; private final R success; - public Try(Throwable failure, R success) { + private Try(Throwable failure, R success) { this.failure = failure; this.success = success; } - public R getSuccess() { + private R getSuccess() { return success; } - public static Try success(R r){ + private static Try success(R r){ return new Try<>(null, r); } - public static Try failure(Throwable e){ + private static Try failure(Throwable e){ return new Try<>(e, null); } @@ -38,11 +42,11 @@ public class Try { return t -> Try.with(checkedFunction).apply(t).getSuccess(); } - public boolean isSuccess(){ + private boolean isSuccess(){ return this.failure == null; } - public boolean isFailure(){ + private boolean isFailure(){ return this.failure != null; } diff --git a/quartz-manager-parent/quartz-manager-common/src/test/java/it/fabioformosa/quartzmanager/api/common/utils/TryTest.java b/quartz-manager-parent/quartz-manager-common/src/test/java/it/fabioformosa/quartzmanager/api/common/utils/TryTest.java new file mode 100644 index 0000000..4ffba71 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-common/src/test/java/it/fabioformosa/quartzmanager/api/common/utils/TryTest.java @@ -0,0 +1,28 @@ +package it.fabioformosa.quartzmanager.api.common.utils; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Optional; + +class TryTest { + + String raiseExceptionIfHello(String greetings) throws Exception { + if("hello".equals(greetings)) + throw new Exception("hello"); + return greetings; + } + + @Test + void givenAFunction_whenItRaisesAnException_thenItReturnsNull(){ + String hello = Optional.of("hello").map(Try.sneakyThrow(this::raiseExceptionIfHello)).orElse(null); + Assertions.assertThat(hello).isNull(); + } + + @Test + void givenAFunction_whenItDoesntRaisesAnException_thenItReturnsTheValue(){ + String hello = Optional.of("not hello").map(Try.sneakyThrow(this::raiseExceptionIfHello)).orElse(null); + Assertions.assertThat(hello).isEqualTo("not hello"); + } + +} From 249cf498737c92d63a14bbdae18e21ef36b59c82 Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Tue, 29 Nov 2022 23:12:54 +0100 Subject: [PATCH 05/18] #62 added missing tests --- .../quartzmanager/api/common/utils/Try.java | 8 ---- .../quartz-manager-starter-api/pom.xml | 2 +- .../api/controllers/JobController.java | 3 +- .../configuration/SchedulerConfigTest.java | 47 ++++++++++++++++--- .../api/controllers/JobControllerTest.java | 46 ++++++++++++++++++ 5 files changed, 90 insertions(+), 16 deletions(-) create mode 100644 quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/JobControllerTest.java diff --git a/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/api/common/utils/Try.java b/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/api/common/utils/Try.java index 27f7f19..4495440 100644 --- a/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/api/common/utils/Try.java +++ b/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/api/common/utils/Try.java @@ -42,14 +42,6 @@ public class Try { return t -> Try.with(checkedFunction).apply(t).getSuccess(); } - private boolean isSuccess(){ - return this.failure == null; - } - - private boolean isFailure(){ - return this.failure != null; - } - @FunctionalInterface public static interface CheckedFunction { R apply(T t) throws java.lang.Exception; diff --git a/quartz-manager-parent/quartz-manager-starter-api/pom.xml b/quartz-manager-parent/quartz-manager-starter-api/pom.xml index 8a52e41..58dc0b0 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/pom.xml +++ b/quartz-manager-parent/quartz-manager-starter-api/pom.xml @@ -20,7 +20,7 @@ UTF-8 1.5.12 9 - **/QuartManagerApplicationTests.java + **/QuartManagerApplicationTests.java, **/OpenApiConfig.java diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/controllers/JobController.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/controllers/JobController.java index ff63601..ad47df2 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/controllers/JobController.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/controllers/JobController.java @@ -16,10 +16,11 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.stream.Collectors; -@RequestMapping(QuartzManagerPaths.QUARTZ_MANAGER_BASE_CONTEXT_PATH + "/jobs") +@RequestMapping(JobController.JOB_CONTROLLER_BASE_URL) @SecurityRequirement(name = OpenAPIConfigConsts.QUARTZ_MANAGER_SEC_OAS_SCHEMA) @RestController public class JobController { + public static final String JOB_CONTROLLER_BASE_URL = QuartzManagerPaths.QUARTZ_MANAGER_BASE_CONTEXT_PATH + "/jobs"; private final JobService jobService; public JobController(JobService jobService) { diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/configuration/SchedulerConfigTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/configuration/SchedulerConfigTest.java index e7b2d99..b94a5f3 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/configuration/SchedulerConfigTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/configuration/SchedulerConfigTest.java @@ -7,8 +7,10 @@ import org.quartz.Scheduler; import org.springframework.context.support.GenericApplicationContext; import org.springframework.scheduling.quartz.SchedulerFactoryBean; +import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Properties; class SchedulerConfigTest { @@ -16,11 +18,8 @@ class SchedulerConfigTest { public static final String QUARTZ_SCHEDULER_DEFAULT_NAME = "QuartzScheduler"; @Test - void givenASchedulerName_whenTheSchedulerIsInstatiated_thenTheSchedulerHasThatName() throws Exception { - QuartzModuleProperties quartzModuleProperties = new QuartzModuleProperties(); - quartzModuleProperties.getProperties().put("org.quartz.scheduler.instanceName", TEST_SCHEDULER_NAME); - List quartzModulePropertiesList = new ArrayList<>(); - quartzModulePropertiesList.add(quartzModuleProperties); + void givenASchedulerName_whenTheSchedulerIsInstantiated_thenTheSchedulerHasThatName() throws Exception { + List quartzModulePropertiesList = getQuartzModulePropertiesWithASchedulerName(TEST_SCHEDULER_NAME); SchedulerConfig schedulerConfig = new SchedulerConfig(quartzModulePropertiesList); GenericApplicationContext applicationContext = new GenericApplicationContext(); applicationContext.refresh(); @@ -31,8 +30,16 @@ class SchedulerConfigTest { Assertions.assertThat(scheduler.getSchedulerName()).isEqualTo(TEST_SCHEDULER_NAME); } + private static List getQuartzModulePropertiesWithASchedulerName(String schedulerName) { + QuartzModuleProperties quartzModuleProperties = new QuartzModuleProperties(); + quartzModuleProperties.getProperties().put("org.quartz.scheduler.instanceName", schedulerName); + List quartzModulePropertiesList = new ArrayList<>(); + quartzModulePropertiesList.add(quartzModuleProperties); + return quartzModulePropertiesList; + } + @Test - void givenNoSchedulerName_whenTheSchedulerIsInstatiated_thenTheSchedulerHasTheDefaultName() throws Exception { + void givenNoSchedulerName_whenTheSchedulerIsInstantiated_thenTheSchedulerHasTheDefaultName() throws Exception { QuartzModuleProperties quartzModuleProperties = new QuartzModuleProperties(); List quartzModulePropertiesList = new ArrayList<>(); quartzModulePropertiesList.add(quartzModuleProperties); @@ -46,4 +53,32 @@ class SchedulerConfigTest { Assertions.assertThat(scheduler.getSchedulerName()).isEqualTo(QUARTZ_SCHEDULER_DEFAULT_NAME); } + @Test + void givenAManagedProperties_whenTheSchedulerIsInstantiated_thenTheManagedPropsHavePriority() throws Exception { + List quartzModulePropertiesList = getQuartzModulePropertiesWithASchedulerName(TEST_SCHEDULER_NAME); + SchedulerConfig schedulerConfig = new SchedulerConfig(quartzModulePropertiesList); + GenericApplicationContext applicationContext = new GenericApplicationContext(); + applicationContext.refresh(); + + Properties managedProps = new Properties(); + String overridden_scheduler_name = "OVERRIDDEN_SCHEDULER_NAME"; + managedProps.put("org.quartz.scheduler.instanceName", overridden_scheduler_name); + SchedulerFactoryBean schedulerFactoryBean = schedulerConfig.schedulerFactoryBean(schedulerConfig.jobFactory(applicationContext), managedProps); + + schedulerFactoryBean.afterPropertiesSet(); + Scheduler scheduler = schedulerFactoryBean.getScheduler(); + Assertions.assertThat(scheduler.getSchedulerName()).isEqualTo(overridden_scheduler_name); + } + + @Test + void givenAnEmptyManagedPropFile_whenSchedulerConfigRuns_thenItReturnsAnEmptyPropList() throws IOException { + List quartzModulePropertiesList = getQuartzModulePropertiesWithASchedulerName(TEST_SCHEDULER_NAME); + SchedulerConfig schedulerConfig = new SchedulerConfig(quartzModulePropertiesList); + GenericApplicationContext applicationContext = new GenericApplicationContext(); + applicationContext.refresh(); + + Properties properties = schedulerConfig.quartzProperties(); + Assertions.assertThat(properties).isEmpty(); + } + } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/JobControllerTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/JobControllerTest.java new file mode 100644 index 0000000..49838de --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/JobControllerTest.java @@ -0,0 +1,46 @@ +package it.fabioformosa.quartzmanager.api.controllers; + +import it.fabioformosa.quartzmanager.api.QuartManagerApplicationTests; +import it.fabioformosa.quartzmanager.api.controllers.utils.TestUtils; +import it.fabioformosa.quartzmanager.api.jobs.SampleJob; +import it.fabioformosa.quartzmanager.api.services.JobService; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; + +@ContextConfiguration(classes = {QuartManagerApplicationTests.class}) +@WebMvcTest(controllers = SimpleTriggerController.class, properties = { + "quartz-manager.jobClassPackages=it.fabioformosa.quartzmanager.jobs" +}) +class JobControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private JobService jobService; + + @Test + void whenGetListIsCalled_thenTheSimpleJobIsReturned() throws Exception { + Mockito.when(jobService.getJobClasses()).thenReturn(List.of(SampleJob.class)); + + List expectedJobs = List.of(SampleJob.class.getName()); + mockMvc.perform(get(JobController.JOB_CONTROLLER_BASE_URL) + .contentType(MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().json(TestUtils.toJson(expectedJobs))); + + Mockito.verify(jobService, Mockito.times(1)).getJobClasses(); + } + +} From 6d22207e27fea42e19202d41becfbead6b18ebad Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Tue, 29 Nov 2022 23:39:14 +0100 Subject: [PATCH 06/18] #62 added missing tests --- .../quartzmanager/api/dto/SchedulerDTO.java | 2 + .../controllers/SchedulerControllerTest.java | 89 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SchedulerControllerTest.java diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/SchedulerDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/SchedulerDTO.java index 7e95d04..07dfd21 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/SchedulerDTO.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/SchedulerDTO.java @@ -2,6 +2,7 @@ package it.fabioformosa.quartzmanager.api.dto; import it.fabioformosa.quartzmanager.api.enums.SchedulerStatus; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.quartz.TriggerKey; @@ -11,6 +12,7 @@ import java.util.Set; @NoArgsConstructor @AllArgsConstructor @Data +@Builder public class SchedulerDTO { private String name; private String instanceId; diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SchedulerControllerTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SchedulerControllerTest.java new file mode 100644 index 0000000..3e5ff80 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SchedulerControllerTest.java @@ -0,0 +1,89 @@ +package it.fabioformosa.quartzmanager.api.controllers; + +import it.fabioformosa.quartzmanager.api.QuartManagerApplicationTests; +import it.fabioformosa.quartzmanager.api.controllers.utils.TestUtils; +import it.fabioformosa.quartzmanager.api.dto.SchedulerDTO; +import it.fabioformosa.quartzmanager.api.enums.SchedulerStatus; +import it.fabioformosa.quartzmanager.api.services.SchedulerService; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; + +@ContextConfiguration(classes = {QuartManagerApplicationTests.class}) +@WebMvcTest(controllers = SimpleTriggerController.class, properties = { + "quartz-manager.jobClassPackages=it.fabioformosa.quartzmanager.jobs" +}) +class SchedulerControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private SchedulerService schedulerService; + + @Test + void whenTheGetIsCalled_thenTheSchedulerServiceIsReturned() throws Exception { + SchedulerDTO schedulerDTO = SchedulerDTO.builder() + .name("TEST_SCHEDULER") + .instanceId("testSchedulerId") + .status(SchedulerStatus.STOPPED) + .build(); + Mockito.when(schedulerService.getScheduler()).thenReturn(schedulerDTO); + + mockMvc.perform(get(SchedulerController.SCHEDULER_CONTROLLER_BASE_URL) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().json(TestUtils.toJson(schedulerDTO))); + + Mockito.verify(schedulerService).getScheduler(); + } + + @Test + void givenAScheduler_whenTheGetPausedIsCalled_then2xxReturned() throws Exception { + mockMvc.perform(get(SchedulerController.SCHEDULER_CONTROLLER_BASE_URL + "/pause") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.status().isNoContent()) + .andExpect(MockMvcResultMatchers.content().string("")); + + Mockito.verify(schedulerService).standby(); + } + + @Test + void givenAScheduler_whenTheGetResumedIsCalled_then2xxReturned() throws Exception { + mockMvc.perform(get(SchedulerController.SCHEDULER_CONTROLLER_BASE_URL + "/resume") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.status().isNoContent()) + .andExpect(MockMvcResultMatchers.content().string("")); + + Mockito.verify(schedulerService).start(); + } + + @Test + void givenAScheduler_whenTheGetRunIsCalled_then2xxReturned() throws Exception { + mockMvc.perform(get(SchedulerController.SCHEDULER_CONTROLLER_BASE_URL + "/run") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.status().isNoContent()) + .andExpect(MockMvcResultMatchers.content().string("")); + + Mockito.verify(schedulerService).start(); + } + + @Test + void givenAScheduler_whenTheGetStoppedIsCalled_then2xxReturned() throws Exception { + mockMvc.perform(get(SchedulerController.SCHEDULER_CONTROLLER_BASE_URL + "/stop") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.status().isNoContent()) + .andExpect(MockMvcResultMatchers.content().string("")); + + Mockito.verify(schedulerService).shutdown(); + } + +} From 5b33bd4dca6fc3c6ac37380a478faee042d7a5d7 Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Thu, 1 Dec 2022 00:30:47 +0100 Subject: [PATCH 07/18] #62 added missing tests --- quartz-manager-parent/pom.xml | 5 ++ .../converters/SchedulerToSchedulerDTO.java | 3 +- .../SchedulerServiceIntegrationTest.java | 60 ++++++++++++++++++ .../api/services/SchedulerServiceTest.java | 63 +++++++++++++++++++ 4 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SchedulerServiceIntegrationTest.java create mode 100644 quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SchedulerServiceTest.java diff --git a/quartz-manager-parent/pom.xml b/quartz-manager-parent/pom.xml index 39f4cfa..dadb385 100644 --- a/quartz-manager-parent/pom.xml +++ b/quartz-manager-parent/pom.xml @@ -128,6 +128,11 @@ org.jacoco jacoco-maven-plugin ${jacoco-maven-plugin.version} + + + **/OpenApiConfig.class + + diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/converters/SchedulerToSchedulerDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/converters/SchedulerToSchedulerDTO.java index 6561c95..1a0ca26 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/converters/SchedulerToSchedulerDTO.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/converters/SchedulerToSchedulerDTO.java @@ -17,7 +17,8 @@ public class SchedulerToSchedulerDTO extends AbstractBaseConverterToDTO Date: Thu, 1 Dec 2022 00:35:40 +0100 Subject: [PATCH 08/18] #62 fixed a failing test --- .../api/services/SchedulerServiceIntegrationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SchedulerServiceIntegrationTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SchedulerServiceIntegrationTest.java index 9185854..8ef6720 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SchedulerServiceIntegrationTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SchedulerServiceIntegrationTest.java @@ -35,8 +35,8 @@ class SchedulerServiceIntegrationTest { Assertions.assertThat(scheduler.isInStandbyMode()).isTrue(); Assertions.assertThat(scheduler.isShutdown()).isFalse(); - schedulerService.shutdown(); - Assertions.assertThat(scheduler.isShutdown()).isTrue(); +// schedulerService.shutdown(); +// Assertions.assertThat(scheduler.isShutdown()).isTrue(); } From 0969a406c65e3068ee79ca2e99048856aa3d178e Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Thu, 1 Dec 2022 00:55:38 +0100 Subject: [PATCH 09/18] #62 fixed a failing test --- .../SchedulerServiceIntegrationTest.java | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SchedulerServiceIntegrationTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SchedulerServiceIntegrationTest.java index 8ef6720..1f54ccc 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SchedulerServiceIntegrationTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SchedulerServiceIntegrationTest.java @@ -2,12 +2,17 @@ package it.fabioformosa.quartzmanager.api.services; import it.fabioformosa.quartzmanager.api.dto.SchedulerDTO; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) @SpringBootTest class SchedulerServiceIntegrationTest { @@ -24,37 +29,29 @@ class SchedulerServiceIntegrationTest { Assertions.assertThat(schedulerDTO.getName()).isEqualTo(scheduler.getSchedulerName()); } + @Order(1) @Test void givenASchedulerService_whenTheStatusIsChange_thenTheSchedulerReflectsTheSame() throws SchedulerException { Assertions.assertThat(scheduler.isStarted()).isFalse(); schedulerService.start(); Assertions.assertThat(scheduler.isStarted()).isTrue(); - + } + @Order(2) + @Test + void givenASchedulerService_whenStandByIsCalled_thenTheStandByIsPropagated() throws SchedulerException { Assertions.assertThat(scheduler.isInStandbyMode()).isFalse(); schedulerService.standby(); Assertions.assertThat(scheduler.isInStandbyMode()).isTrue(); - - Assertions.assertThat(scheduler.isShutdown()).isFalse(); -// schedulerService.shutdown(); -// Assertions.assertThat(scheduler.isShutdown()).isTrue(); - } -// @Test -// void givenASchedulerService_whenStandByIsCalled_thenTheStandByIsPropagated() throws SchedulerException { -// Assertions.assertThat(scheduler.isInStandbyMode()).isTrue(); -// schedulerService.start(); -// Assertions.assertThat(scheduler.isInStandbyMode()).isFalse(); -// schedulerService.standby(); -// Assertions.assertThat(scheduler.isInStandbyMode()).isTrue(); -// } -// -// @Test -// void givenASchedulerService_whenShutdownIsCalled_thenTheShutdownIsPropagated() throws SchedulerException { -// Assertions.assertThat(scheduler.isShutdown()).isFalse(); -// schedulerService.start(); -// schedulerService.shutdown(); -// Assertions.assertThat(scheduler.isShutdown()).isTrue(); -// } + @Order(3) + @DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD) + @Test + void givenASchedulerService_whenShutdownIsCalled_thenTheShutdownIsPropagated() throws SchedulerException { + Assertions.assertThat(scheduler.isShutdown()).isFalse(); + schedulerService.start(); + schedulerService.shutdown(); + Assertions.assertThat(scheduler.isShutdown()).isTrue(); + } } From c490a7ab28583d1f6f9344c26aa5c0db1d3bb24b Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Thu, 1 Dec 2022 23:48:16 +0100 Subject: [PATCH 10/18] #62 added missing tests --- .../SchedulerToSchedulerDTOTest.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SchedulerToSchedulerDTOTest.java diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SchedulerToSchedulerDTOTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SchedulerToSchedulerDTOTest.java new file mode 100644 index 0000000..e9ffd70 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SchedulerToSchedulerDTOTest.java @@ -0,0 +1,52 @@ +package it.fabioformosa.quartzmanager.api.converters; + +import it.fabioformosa.quartzmanager.api.dto.SchedulerDTO; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.convert.ConversionService; +import org.springframework.test.annotation.DirtiesContext; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@SpringBootTest +class SchedulerToSchedulerDTOTest { + + @Autowired + private Scheduler scheduler; + + @Autowired + private ConversionService conversionService; + + @Order(1) + @Test + void givenAnActiveScheduler_whenItIsConverted_thenADtoIsReturned () throws SchedulerException { + Assertions.assertThat(scheduler.isShutdown()).isFalse(); + SchedulerDTO schedulerDTO = conversionService.convert(scheduler, SchedulerDTO.class); + Assertions.assertThat(schedulerDTO).isNotNull(); + Assertions.assertThat(schedulerDTO.getName()).isEqualTo(scheduler.getSchedulerName()); + Assertions.assertThat(schedulerDTO.getInstanceId()).isEqualTo(scheduler.getSchedulerInstanceId()); + } + + @DirtiesContext + @Order(2) + @Test + void givenASchedulerInShutdown_whenItIsConverted_thenADtoIsReturned () throws SchedulerException { + Assertions.assertThat(scheduler.isShutdown()).isFalse(); + scheduler.shutdown(false); + Assertions.assertThat(scheduler.isShutdown()).isTrue(); + + SchedulerDTO schedulerDTO = conversionService.convert(scheduler, SchedulerDTO.class); + Assertions.assertThat(schedulerDTO).isNotNull(); + Assertions.assertThat(schedulerDTO.getName()).isEqualTo(scheduler.getSchedulerName()); + Assertions.assertThat(schedulerDTO.getInstanceId()).isEqualTo(scheduler.getSchedulerInstanceId()); + Assertions.assertThat(schedulerDTO.getTriggerKeys()).isNull(); + } + + +} From 6578dc312acfcb14f60d5e7302352e497ec37926 Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Thu, 1 Dec 2022 23:52:48 +0100 Subject: [PATCH 11/18] #62 added missing tests --- .../SchedulerToSchedulerDTOTest.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SchedulerToSchedulerDTOTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SchedulerToSchedulerDTOTest.java index e9ffd70..8729348 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SchedulerToSchedulerDTOTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SchedulerToSchedulerDTOTest.java @@ -1,6 +1,7 @@ package it.fabioformosa.quartzmanager.api.converters; import it.fabioformosa.quartzmanager.api.dto.SchedulerDTO; +import it.fabioformosa.quartzmanager.api.enums.SchedulerStatus; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Order; @@ -23,6 +24,8 @@ class SchedulerToSchedulerDTOTest { @Autowired private ConversionService conversionService; + + @Order(1) @Test void givenAnActiveScheduler_whenItIsConverted_thenADtoIsReturned () throws SchedulerException { @@ -33,10 +36,25 @@ class SchedulerToSchedulerDTOTest { Assertions.assertThat(schedulerDTO.getInstanceId()).isEqualTo(scheduler.getSchedulerInstanceId()); } - @DirtiesContext @Order(2) @Test - void givenASchedulerInShutdown_whenItIsConverted_thenADtoIsReturned () throws SchedulerException { + void givenAnActiveScheduler_whenItIsConverted_thenADtoHasAStatus () throws SchedulerException { + scheduler.start(); + Assertions.assertThat(scheduler.isStarted()).isTrue(); + SchedulerDTO schedulerDTO = conversionService.convert(scheduler, SchedulerDTO.class); + Assertions.assertThat(schedulerDTO.getStatus()).isEqualTo(SchedulerStatus.RUNNING); + + scheduler.standby(); + Assertions.assertThat(scheduler.isInStandbyMode()).isTrue(); + schedulerDTO = conversionService.convert(scheduler, SchedulerDTO.class); + Assertions.assertThat(schedulerDTO.getStatus()).isEqualTo(SchedulerStatus.PAUSED); + + } + + @DirtiesContext + @Order(3) + @Test + void givenASchedulerInShutdown_whenItIsConverted_thenADtoIsReturnedWithNoTriggers () throws SchedulerException { Assertions.assertThat(scheduler.isShutdown()).isFalse(); scheduler.shutdown(false); Assertions.assertThat(scheduler.isShutdown()).isTrue(); @@ -46,6 +64,7 @@ class SchedulerToSchedulerDTOTest { Assertions.assertThat(schedulerDTO.getName()).isEqualTo(scheduler.getSchedulerName()); Assertions.assertThat(schedulerDTO.getInstanceId()).isEqualTo(scheduler.getSchedulerInstanceId()); Assertions.assertThat(schedulerDTO.getTriggerKeys()).isNull(); + Assertions.assertThat(schedulerDTO.getStatus()).isEqualTo(SchedulerStatus.STOPPED); } From 7553efdc3b3858feaff303c8cd1224ca836e7354 Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Fri, 2 Dec 2022 00:21:23 +0100 Subject: [PATCH 12/18] #62 added missing tests --- .../api/services/SimpleTriggerService.java | 3 +- .../services/SimpleTriggerServiceTest.java | 56 ++++++++++++++++++- .../api/services/TriggerServiceTest.java | 50 +++++++++++++++++ 3 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/TriggerServiceTest.java diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerService.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerService.java index fe636e1..908f815 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerService.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerService.java @@ -1,7 +1,6 @@ package it.fabioformosa.quartzmanager.api.services; import it.fabioformosa.quartzmanager.api.dto.SimpleTriggerCommandDTO; -import it.fabioformosa.quartzmanager.api.dto.TriggerDTO; import it.fabioformosa.quartzmanager.api.dto.SimpleTriggerDTO; import it.fabioformosa.quartzmanager.api.exceptions.TriggerNotFoundException; import org.quartz.*; @@ -34,7 +33,7 @@ public class SimpleTriggerService extends AbstractSchedulerService { return conversionService.convert(newSimpleTrigger, SimpleTriggerDTO.class); } - public TriggerDTO rescheduleSimpleTrigger(SimpleTriggerCommandDTO triggerCommandDTO) throws SchedulerException { + public SimpleTriggerDTO rescheduleSimpleTrigger(SimpleTriggerCommandDTO triggerCommandDTO) throws SchedulerException { SimpleTrigger newSimpleTrigger = conversionService.convert(triggerCommandDTO, SimpleTrigger.class); TriggerKey triggerKey = TriggerKey.triggerKey(triggerCommandDTO.getTriggerName()); diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerServiceTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerServiceTest.java index dea7667..e396c97 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerServiceTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerServiceTest.java @@ -9,9 +9,7 @@ import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.quartz.Scheduler; -import org.quartz.SchedulerException; -import org.quartz.SimpleTrigger; +import org.quartz.*; import org.springframework.core.convert.ConversionService; import java.util.Date; @@ -45,6 +43,21 @@ class SimpleTriggerServiceTest { Assertions.assertThat(throwable).isInstanceOf(TriggerNotFoundException.class); } + @Test + void givenAnExistingTrigger_whenGetSimplerTriggerByNameIsCalled_thenTheDtoIsReturned() throws SchedulerException, TriggerNotFoundException { + String existing_trigger = "existing_trigger"; + Mockito.when(scheduler.getTrigger(any(TriggerKey.class))) + .thenReturn(TriggerBuilder.newTrigger().withIdentity(existing_trigger).build()); + Mockito.when(conversionService.convert(any(SimpleTrigger.class), eq(SimpleTriggerDTO.class))) + .thenReturn(SimpleTriggerDTO.builder() + .triggerKeyDTO(TriggerKeyDTO.builder().name(existing_trigger).build()) + .build()); + + + SimpleTriggerDTO simpleTriggerByName = simpleSchedulerService.getSimpleTriggerByName(existing_trigger); + Assertions.assertThat(simpleTriggerByName.getTriggerKeyDTO().getName()).isEqualTo(existing_trigger); + } + @Test void givenASimpleTriggerCommandDTO_whenASimpleTriggerIsScheduled_thenATriggerDTOIsReturned() throws SchedulerException, ClassNotFoundException { SimpleTriggerInputDTO triggerInputDTO = SimpleTriggerInputDTO.builder() @@ -79,4 +92,41 @@ class SimpleTriggerServiceTest { Assertions.assertThat(simpleTrigger).isEqualTo(expectedTriggerDTO); } + @Test + void givenASimpleTriggerCommandDTO_whenASimpleTriggerIsRecheduled_thenATriggerDTOIsReturned() throws SchedulerException, ClassNotFoundException { + SimpleTriggerInputDTO triggerInputDTO = SimpleTriggerInputDTO.builder() + .jobClass("it.fabioformosa.quartzmanager.api.jobs.SampleJob") + .startDate(new Date()) + .repeatInterval(5000L).repeatCount(5) + .endDate(DateUtils.addHoursToNow(1)) + .build(); + + String simpleTriggerName = "simpleTrigger"; + + SimpleTriggerDTO expectedTriggerDTO = SimpleTriggerDTO.builder() + .startTime(triggerInputDTO.getStartDate()) + .repeatInterval(1000) + .repeatCount(10) + .mayFireAgain(true) + .finalFireTime(triggerInputDTO.getEndDate()) + .jobKeyDTO(JobKeyDTO.builder().name("MyJob").build()) + .misfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW) + .triggerKeyDTO(TriggerKeyDTO.builder().name(simpleTriggerName).build()) + .build(); + + Mockito.when(scheduler.rescheduleJob(any(), any())).thenReturn(new Date()); + Mockito.when(conversionService.convert(any(), eq(SimpleTriggerDTO.class))).thenReturn(expectedTriggerDTO); + + SimpleTriggerCommandDTO simpleTriggerCommandDTO = SimpleTriggerCommandDTO.builder() + .triggerName(simpleTriggerName) + .simpleTriggerInputDTO(triggerInputDTO) + .build(); + SimpleTriggerDTO simpleTrigger = simpleSchedulerService.rescheduleSimpleTrigger(simpleTriggerCommandDTO); + + Assertions.assertThat(simpleTrigger).isEqualTo(expectedTriggerDTO); + + Mockito.verify(scheduler).rescheduleJob(any(), any()); + Mockito.verify(conversionService).convert(any(), eq(SimpleTriggerDTO.class)); + } + } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/TriggerServiceTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/TriggerServiceTest.java new file mode 100644 index 0000000..0d7979d --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/TriggerServiceTest.java @@ -0,0 +1,50 @@ +package it.fabioformosa.quartzmanager.api.services; + +import it.fabioformosa.quartzmanager.api.dto.TriggerKeyDTO; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.TriggerKey; +import org.springframework.core.convert.ConversionService; +import org.springframework.core.convert.TypeDescriptor; + +import java.util.List; +import java.util.Set; + +import static org.mockito.ArgumentMatchers.any; + +class TriggerServiceTest { + + @InjectMocks + private TriggerService triggerService; + + @Mock + private Scheduler scheduler; + + @Mock + private ConversionService conversionService; + + @BeforeEach + void setUp(){ + MockitoAnnotations.openMocks(this); + } + + @Test + void givenATrigger_whenTheyAreFecthed_TheServiceReturnsTheDtos() throws SchedulerException { + String triggerTestName = "triggerTest"; + Mockito.when(scheduler.getTriggerKeys(any())).thenReturn(Set.of(TriggerKey.triggerKey(triggerTestName))); + Mockito.when(conversionService.convert(any(Set.class), any(TypeDescriptor.class), any(TypeDescriptor.class))) + .thenReturn(List.of(TriggerKeyDTO.builder().name(triggerTestName).build())); + + List triggerKeyDTOs = triggerService.fetchTriggers(); + Assertions.assertThat(triggerKeyDTOs).hasSize(1); + Assertions.assertThat(triggerKeyDTOs.get(0).getName()).isEqualTo(triggerTestName); + } + +} From cd6e01109b7331bf6476160af61503ce1a8e2a36 Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Fri, 2 Dec 2022 00:32:52 +0100 Subject: [PATCH 13/18] #62 added some coverage exclusion --- quartz-manager-parent/pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/quartz-manager-parent/pom.xml b/quartz-manager-parent/pom.xml index dadb385..dfbc94d 100644 --- a/quartz-manager-parent/pom.xml +++ b/quartz-manager-parent/pom.xml @@ -131,6 +131,8 @@ **/OpenApiConfig.class + **/SecurityOpenApiConfig.class + **/QuartzModuleProperties.class From c2a26c97a818e58775d075d714d5123046048ac4 Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Fri, 2 Dec 2022 00:37:56 +0100 Subject: [PATCH 14/18] #62 added some coverage exclusion --- quartz-manager-parent/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/quartz-manager-parent/pom.xml b/quartz-manager-parent/pom.xml index dfbc94d..100fb97 100644 --- a/quartz-manager-parent/pom.xml +++ b/quartz-manager-parent/pom.xml @@ -133,6 +133,10 @@ **/OpenApiConfig.class **/SecurityOpenApiConfig.class **/QuartzModuleProperties.class + **/QuartManagerDemoApplication.class + **/ServletInitializer.class + **/SessionController.class + **/HealthCheckController.class From 6348bac11a20f223fca1ec351c5ae4e7b5d315e3 Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Sat, 3 Dec 2022 12:19:41 +0100 Subject: [PATCH 15/18] #62 added missing tests --- .../api/dto/TriggerFiredBundleDTO.java | 9 +-- .../exceptions/ResourceConflictException.java | 5 +- .../exceptions/TriggerNotFoundException.java | 6 -- .../ResourceConflictControllerTest.java | 28 +++++++++ .../api/controllers/TestController.java | 19 ++++++ .../quartzmanager/api/jobs/SampleJobTest.java | 62 +++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + 7 files changed, 116 insertions(+), 14 deletions(-) create mode 100644 quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/ResourceConflictControllerTest.java create mode 100644 quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/TestController.java create mode 100644 quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java create mode 100644 quartz-manager-parent/quartz-manager-starter-api/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTO.java index e6a2104..0e696d3 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTO.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTO.java @@ -1,12 +1,13 @@ package it.fabioformosa.quartzmanager.api.dto; -import lombok.Getter; -import lombok.Setter; +import lombok.*; import java.util.Date; -@Getter -@Setter +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor public class TriggerFiredBundleDTO { private int timesTriggered; diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/exceptions/ResourceConflictException.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/exceptions/ResourceConflictException.java index a2cbee5..c7ba754 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/exceptions/ResourceConflictException.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/exceptions/ResourceConflictException.java @@ -8,11 +8,8 @@ public class ResourceConflictException extends RuntimeException { private static final long serialVersionUID = 1791564636123821405L; - private final Long resourceId; - public ResourceConflictException(Long resourceId, String message) { - super(message); - this.resourceId = resourceId; + super("Conflict on resourceID " + resourceId + " " + message); } } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/exceptions/TriggerNotFoundException.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/exceptions/TriggerNotFoundException.java index ae68e30..b58cb89 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/exceptions/TriggerNotFoundException.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/exceptions/TriggerNotFoundException.java @@ -1,16 +1,10 @@ package it.fabioformosa.quartzmanager.api.exceptions; -import lombok.Getter; import lombok.ToString; @ToString -@Getter public class TriggerNotFoundException extends Exception { - - private final String name; - public TriggerNotFoundException(String name) { super("Trigger with name " + name + " not found!"); - this.name = name; } } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/ResourceConflictControllerTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/ResourceConflictControllerTest.java new file mode 100644 index 0000000..7df7b44 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/ResourceConflictControllerTest.java @@ -0,0 +1,28 @@ +package it.fabioformosa.quartzmanager.api.controllers; + +import it.fabioformosa.quartzmanager.api.QuartManagerApplicationTests; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +@ContextConfiguration(classes = {QuartManagerApplicationTests.class}) +@WebMvcTest(controllers = SimpleTriggerController.class, properties = { + "quartz-manager.jobClassPackages=it.fabioformosa.quartzmanager.jobs" +}) +class ResourceConflictControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Test + void whenAResourceConflictExceptionIsRaised_thenTheExceptionHandlerReturns409() throws Exception { + mockMvc.perform( + MockMvcRequestBuilders.post(TestController.TEST_CONTROLLER_BASE_URL + "/test-conflict") + .contentType(MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers.status().isConflict()); + } +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/TestController.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/TestController.java new file mode 100644 index 0000000..88a0b11 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/TestController.java @@ -0,0 +1,19 @@ +package it.fabioformosa.quartzmanager.api.controllers; + +import it.fabioformosa.quartzmanager.api.exceptions.ResourceConflictException; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequestMapping(TestController.TEST_CONTROLLER_BASE_URL) +@RestController +public class TestController { + + public static final String TEST_CONTROLLER_BASE_URL = "/test-controller"; + + @PostMapping("/test-conflict") + public void raiseConflictException(){ + throw new ResourceConflictException(1000L, "another entity has found with the same ID"); + } + +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java new file mode 100644 index 0000000..e41947d --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java @@ -0,0 +1,62 @@ +package it.fabioformosa.quartzmanager.api.jobs; + +import it.fabioformosa.quartzmanager.api.dto.TriggerFiredBundleDTO; +import it.fabioformosa.quartzmanager.api.jobs.entities.LogRecord; +import it.fabioformosa.quartzmanager.api.websockets.WebhookSender; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.quartz.*; + +import static org.mockito.ArgumentMatchers.any; + +class SampleJobTest { + + @InjectMocks + private SampleJob sampleJob; + + @Mock + private WebhookSender webSocketProgressNotifier; + @Mock + private WebhookSender webSocketLogsNotifier; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void givenASampleJob_whenTheJobIsExecuted_thenTheWebhookSendersAreCalled() { + JobExecutionContext jobExecutionContext = Mockito.mock(JobExecutionContext.class); + + ScheduleBuilder schedulerBuilder = SimpleScheduleBuilder.simpleSchedule() + .withRepeatCount(5) + .withIntervalInMilliseconds(1000L); + JobDetail jobDetail = JobBuilder + .newJob(SampleJob.class).withIdentity(JobKey.jobKey("test-job")) + .build(); + Trigger trigger = TriggerBuilder.newTrigger() + .forJob(jobDetail) + .withSchedule(schedulerBuilder) + .build(); + Mockito.when(jobExecutionContext.getTrigger()).thenReturn(trigger); + Mockito.when(jobExecutionContext.getJobDetail()).thenReturn(jobDetail); + + sampleJob.execute(jobExecutionContext); + Mockito.verify(webSocketLogsNotifier).send(any(LogRecord.class)); + Mockito.verify(webSocketProgressNotifier).send(any(TriggerFiredBundleDTO.class)); + } + + @Test + void givenASampleJob_whenTheDoItMethodIsCalled_thenALogRecordIsReturned() { + JobExecutionContext jobExecutionContext = Mockito.mock(JobExecutionContext.class); + LogRecord logRecord = sampleJob.doIt(jobExecutionContext); + Assertions.assertThat(logRecord.getMessage()).isEqualTo("Hello!"); + Assertions.assertThat(logRecord.getType()).isEqualTo(LogRecord.LogType.INFO); + } + +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/quartz-manager-parent/quartz-manager-starter-api/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 0000000..1f0955d --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline From 98b5d0e37a83351e15298972cc41767f9dea7214 Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Sat, 3 Dec 2022 16:21:13 +0100 Subject: [PATCH 16/18] #62 fixed the job class name in the TriggerFiredBundleDTO --- .../exceptions/TriggerNotFoundException.java | 3 --- .../websockets/WebSocketProgressNotifier.java | 2 +- .../quartzmanager/api/jobs/SampleJobTest.java | 18 +++++++++++++++--- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/exceptions/TriggerNotFoundException.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/exceptions/TriggerNotFoundException.java index b58cb89..d3e0113 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/exceptions/TriggerNotFoundException.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/exceptions/TriggerNotFoundException.java @@ -1,8 +1,5 @@ package it.fabioformosa.quartzmanager.api.exceptions; -import lombok.ToString; - -@ToString public class TriggerNotFoundException extends Exception { public TriggerNotFoundException(String name) { super("Trigger with name " + name + " not found!"); diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketProgressNotifier.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketProgressNotifier.java index 464a12d..7eeba6d 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketProgressNotifier.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketProgressNotifier.java @@ -43,7 +43,7 @@ public class WebSocketProgressNotifier implements WebhookSender { + Assertions.assertThat(actualLogRecord.getMessage()).isEqualTo("Hello!"); + Assertions.assertThat(actualLogRecord.getType()).isEqualTo(LogRecord.LogType.INFO); + Assertions.assertThat(actualLogRecord.getDate()).isNotNull(); + Assertions.assertThat(actualLogRecord.getThreadName()).isNotNull(); + return true; + })); + Mockito.verify(webSocketProgressNotifier).send(argThat(triggerFiredBundleDTO -> { + Assertions.assertThat(triggerFiredBundleDTO.getJobKey()).isEqualTo("test-job"); + Assertions.assertThat(triggerFiredBundleDTO.getRepeatCount()).isEqualTo(6); + Assertions.assertThat(triggerFiredBundleDTO.getJobClass()).isEqualTo(SampleJob.class.getName()); + return true; + })); } @Test @@ -57,6 +68,7 @@ class SampleJobTest { LogRecord logRecord = sampleJob.doIt(jobExecutionContext); Assertions.assertThat(logRecord.getMessage()).isEqualTo("Hello!"); Assertions.assertThat(logRecord.getType()).isEqualTo(LogRecord.LogType.INFO); + Assertions.assertThat(logRecord.getDate()).isNotNull(); } } From f7054b160fd4a1cb0f8dd15b758b2506fa6cf0cd Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Sat, 3 Dec 2022 16:46:27 +0100 Subject: [PATCH 17/18] #62 added missing tests --- quartz-manager-parent/pom.xml | 2 + .../api/dto/TriggerFiredBundleDTOTest.java | 42 +++++++++++++++++++ .../quartzmanager/api/jobs/SampleJobTest.java | 5 +++ 3 files changed, 49 insertions(+) create mode 100644 quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTOTest.java diff --git a/quartz-manager-parent/pom.xml b/quartz-manager-parent/pom.xml index 100fb97..db206be 100644 --- a/quartz-manager-parent/pom.xml +++ b/quartz-manager-parent/pom.xml @@ -137,6 +137,8 @@ **/ServletInitializer.class **/SessionController.class **/HealthCheckController.class + **/WebShowcaseOpenApiConfig.class + **/MisfireTestJob.class diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTOTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTOTest.java new file mode 100644 index 0000000..c592829 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTOTest.java @@ -0,0 +1,42 @@ +package it.fabioformosa.quartzmanager.api.dto; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class TriggerFiredBundleDTOTest { + + @Test + void givenARecursionOf1000_whenTheTriggerHasFired10_thenThePercentageIs10(){ + TriggerFiredBundleDTO triggerFiredBundleDTO = TriggerFiredBundleDTO.builder().build(); + triggerFiredBundleDTO.setTimesTriggered(10); + triggerFiredBundleDTO.setRepeatCount(100); + Assertions.assertThat(triggerFiredBundleDTO.getPercentage()).isEqualTo(10); + } + + @Test + void givenARecursionOf1000_whenTheTriggerHasFired23_thenThePercentageIsRoundedDown(){ + TriggerFiredBundleDTO triggerFiredBundleDTO = TriggerFiredBundleDTO.builder().build(); + triggerFiredBundleDTO.setTimesTriggered(23); + triggerFiredBundleDTO.setRepeatCount(1000); + Assertions.assertThat(triggerFiredBundleDTO.getPercentage()).isEqualTo(2); + } + + @Test + void givenARecursionOf1000_whenTheTriggerHasFired26_thenThePercentageIsRoundedUp(){ + TriggerFiredBundleDTO triggerFiredBundleDTO = TriggerFiredBundleDTO.builder().build(); + triggerFiredBundleDTO.setTimesTriggered(26); + triggerFiredBundleDTO.setRepeatCount(1000); + Assertions.assertThat(triggerFiredBundleDTO.getPercentage()).isEqualTo(3); + } + + @Test + void givenAnInfiniteRecursion_whenTheTriggerHasFired10_thenThePercentageIsMinus1(){ + TriggerFiredBundleDTO triggerFiredBundleDTO = TriggerFiredBundleDTO.builder().build(); + triggerFiredBundleDTO.setTimesTriggered(10); + triggerFiredBundleDTO.setRepeatCount(-1); + Assertions.assertThat(triggerFiredBundleDTO.getPercentage()).isEqualTo(-1); + } + +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java index 287a2ae..f56bd0d 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java @@ -58,6 +58,11 @@ class SampleJobTest { Assertions.assertThat(triggerFiredBundleDTO.getJobKey()).isEqualTo("test-job"); Assertions.assertThat(triggerFiredBundleDTO.getRepeatCount()).isEqualTo(6); Assertions.assertThat(triggerFiredBundleDTO.getJobClass()).isEqualTo(SampleJob.class.getName()); + Assertions.assertThat(triggerFiredBundleDTO.getTimesTriggered()).isZero(); + Assertions.assertThat(triggerFiredBundleDTO.getNextFireTime()).isNull(); + Assertions.assertThat(triggerFiredBundleDTO.getPercentage()).isZero(); + Assertions.assertThat(triggerFiredBundleDTO.getFinalFireTime()).isNotNull(); + Assertions.assertThat(triggerFiredBundleDTO.getPreviousFireTime()).isNull(); return true; })); } From 3063e08eb3599011851b11cdf06197c1b9cc8dec Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Sat, 3 Dec 2022 17:10:34 +0100 Subject: [PATCH 18/18] #62 solved a couple of sonar smells --- .../quartzmanager/api/common/utils/Try.java | 5 ++- .../api/common/utils/TryTest.java | 18 ++++++++-- .../api/dto/TriggerFiredBundleDTOTest.java | 33 +++++++------------ 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/api/common/utils/Try.java b/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/api/common/utils/Try.java index 4495440..4fd255e 100644 --- a/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/api/common/utils/Try.java +++ b/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/api/common/utils/Try.java @@ -1,11 +1,14 @@ package it.fabioformosa.quartzmanager.api.common.utils; +import lombok.Getter; + import java.util.function.Function; /** * * @param success type */ +@Getter public class Try { private final Throwable failure; @@ -16,7 +19,7 @@ public class Try { this.success = success; } - private R getSuccess() { + public R getSuccess() { return success; } diff --git a/quartz-manager-parent/quartz-manager-common/src/test/java/it/fabioformosa/quartzmanager/api/common/utils/TryTest.java b/quartz-manager-parent/quartz-manager-common/src/test/java/it/fabioformosa/quartzmanager/api/common/utils/TryTest.java index 4ffba71..be555a9 100644 --- a/quartz-manager-parent/quartz-manager-common/src/test/java/it/fabioformosa/quartzmanager/api/common/utils/TryTest.java +++ b/quartz-manager-parent/quartz-manager-common/src/test/java/it/fabioformosa/quartzmanager/api/common/utils/TryTest.java @@ -14,15 +14,29 @@ class TryTest { } @Test - void givenAFunction_whenItRaisesAnException_thenItReturnsNull(){ + void givenAFunctionWhichRaisesAnException_whenSneakyThrowIsCalled_thenItReturnsNull(){ String hello = Optional.of("hello").map(Try.sneakyThrow(this::raiseExceptionIfHello)).orElse(null); Assertions.assertThat(hello).isNull(); } @Test - void givenAFunction_whenItDoesntRaisesAnException_thenItReturnsTheValue(){ + void givenAFunctionWhichDoesntRaiseAnException_whenSneakyThrowIsCalled_thenItReturnsTheValue(){ String hello = Optional.of("not hello").map(Try.sneakyThrow(this::raiseExceptionIfHello)).orElse(null); Assertions.assertThat(hello).isEqualTo("not hello"); } + @Test + void givenAFunctionWhichRaisesAnException_whenTryWithIsCalled_thenItReturnsAFailureObj(){ + Try aTry = Optional.of("hello").map(greet -> Try.with(this::raiseExceptionIfHello).apply(greet)).get(); + Assertions.assertThat(aTry.getFailure()).isNotNull(); + Assertions.assertThat(aTry.getFailure().getMessage()).isEqualTo("hello"); + } + + @Test + void givenAFunctionWhichDoesntRaiseAnException_whenTryWithIsCalled_thenItReturnsTheValue(){ + Try aTry = Optional.of("not hello").map(greet -> Try.with(this::raiseExceptionIfHello).apply(greet)).get(); + Assertions.assertThat(aTry.getFailure()).isNull(); + Assertions.assertThat(aTry.getSuccess()).isEqualTo("not hello"); + } + } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTOTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTOTest.java index c592829..a301569 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTOTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/dto/TriggerFiredBundleDTOTest.java @@ -2,33 +2,24 @@ package it.fabioformosa.quartzmanager.api.dto; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.*; class TriggerFiredBundleDTOTest { - @Test - void givenARecursionOf1000_whenTheTriggerHasFired10_thenThePercentageIs10(){ + @CsvSource({ + "10, 100, 10", + "23, 1000, 2", + "26, 1000, 3" + }) + @ParameterizedTest + void givenARepeatCount_whenTheTriggerHasFiredXTimes_thenThePercentageIsCalculatedAccordingly(int timesTriggered, int repeatCount, int expectedPercentage){ TriggerFiredBundleDTO triggerFiredBundleDTO = TriggerFiredBundleDTO.builder().build(); - triggerFiredBundleDTO.setTimesTriggered(10); - triggerFiredBundleDTO.setRepeatCount(100); - Assertions.assertThat(triggerFiredBundleDTO.getPercentage()).isEqualTo(10); - } - - @Test - void givenARecursionOf1000_whenTheTriggerHasFired23_thenThePercentageIsRoundedDown(){ - TriggerFiredBundleDTO triggerFiredBundleDTO = TriggerFiredBundleDTO.builder().build(); - triggerFiredBundleDTO.setTimesTriggered(23); - triggerFiredBundleDTO.setRepeatCount(1000); - Assertions.assertThat(triggerFiredBundleDTO.getPercentage()).isEqualTo(2); - } - - @Test - void givenARecursionOf1000_whenTheTriggerHasFired26_thenThePercentageIsRoundedUp(){ - TriggerFiredBundleDTO triggerFiredBundleDTO = TriggerFiredBundleDTO.builder().build(); - triggerFiredBundleDTO.setTimesTriggered(26); - triggerFiredBundleDTO.setRepeatCount(1000); - Assertions.assertThat(triggerFiredBundleDTO.getPercentage()).isEqualTo(3); + triggerFiredBundleDTO.setTimesTriggered(timesTriggered); + triggerFiredBundleDTO.setRepeatCount(repeatCount); + Assertions.assertThat(triggerFiredBundleDTO.getPercentage()).isEqualTo(expectedPercentage); } @Test