package de.otto.edison.jobs.configuration; import de.otto.edison.jobs.definition.DefaultJobDefinition; import de.otto.edison.jobs.definition.JobDefinition; import de.otto.edison.jobs.service.JobDefinitionService; import de.otto.edison.jobs.status.JobStatusCalculator; import de.otto.edison.status.domain.StatusDetail; import de.otto.edison.status.indicator.CompositeStatusDetailIndicator; import de.otto.edison.status.indicator.StatusDetailIndicator; import org.junit.Test; import java.util.HashMap; import static de.otto.edison.jobs.definition.DefaultJobDefinition.fixedDelayJobDefinition; import static de.otto.edison.status.domain.Status.OK; import static java.time.Duration.ofSeconds; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static java.util.Optional.of; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class JobsConfigurationTest { private JobsProperties jobsProperties = new JobsProperties();; @Test public void shouldIndicateOkIfNoJobDefinitionsAvailable() { // given final JobsConfiguration jobsConfiguration = new JobsConfiguration(jobsProperties); final JobStatusCalculator defaultCalculator = mock(JobStatusCalculator.class); when(defaultCalculator.getKey()).thenReturn("warningOnLastJobFailed"); final JobDefinitionService noJobDefinitions = mock(JobDefinitionService.class); when(noJobDefinitions.getJobDefinitions()).thenReturn(emptyList()); // when final StatusDetail statusDetail = jobsConfiguration.jobStatusDetailIndicator( noJobDefinitions, singletonList(defaultCalculator)).statusDetail(); // then assertThat(statusDetail.getStatus(), is(OK)); assertThat(statusDetail.getName(), is("Jobs")); assertThat(statusDetail.getMessage(), is("No job definitions configured in application.")); } @Test public void shouldConstructCompositeStatusDetailIndicator() { // given final JobsConfiguration jobsConfiguration = new JobsConfiguration(jobsProperties); final JobStatusCalculator defaultCalculator = mock(JobStatusCalculator.class); when(defaultCalculator.getKey()).thenReturn("warningOnLastJobFailed"); // when final StatusDetailIndicator indicator = jobsConfiguration.jobStatusDetailIndicator( someJobDefinitionService(), singletonList(defaultCalculator) ); // then assertThat(indicator, is(instanceOf(CompositeStatusDetailIndicator.class))); } @Test public void shouldUseDefaultJobStatusDetailIndicator() { // given final JobsConfiguration jobsConfiguration = new JobsConfiguration(jobsProperties); final JobStatusCalculator defaultCalculator = mock(JobStatusCalculator.class); when(defaultCalculator.getKey()).thenReturn("warningOnLastJobFailed"); // when jobsConfiguration.jobStatusDetailIndicator( someJobDefinitionService(), singletonList(defaultCalculator)).statusDetail(); // then verify(defaultCalculator).statusDetail(any(JobDefinition.class)); } @Test public void shouldUseConfiguredJobStatusDetailIndicator() { // given final JobsProperties jobsProperties = new JobsProperties(); jobsProperties.getStatus().setCalculator(new HashMap<String, String>(){{ put("test", "errorOnLastJobFailed"); }}); final JobsConfiguration jobConfiguration = new JobsConfiguration(jobsProperties); final JobStatusCalculator defaultCalculator = mock(JobStatusCalculator.class); when(defaultCalculator.getKey()).thenReturn("warningOnLastJobFailed"); final JobStatusCalculator testCalculator = mock(JobStatusCalculator.class); when(testCalculator.getKey()).thenReturn("errorOnLastJobFailed"); // when jobConfiguration.jobStatusDetailIndicator( someJobDefinitionService(), asList(defaultCalculator, testCalculator)).statusDetail(); // then verify(testCalculator).statusDetail(any(JobDefinition.class)); } @Test public void shouldNormalizeJobTypesInConfiguredJobStatusDetailIndicators() { // given final JobsProperties jobsProperties = new JobsProperties(); jobsProperties.getStatus().setCalculator(new HashMap<String, String>(){{ put("soMe-TeSt job", "errorOnLastJobFailed"); }}); final JobsConfiguration jobConfiguration = new JobsConfiguration(jobsProperties); final JobStatusCalculator defaultCalculator = mock(JobStatusCalculator.class); when(defaultCalculator.getKey()).thenReturn("warningOnLastJobFailed"); final JobStatusCalculator testCalculator = mock(JobStatusCalculator.class); when(testCalculator.getKey()).thenReturn("errorOnLastJobFailed"); final JobDefinitionService jobDefinitionService = mock(JobDefinitionService.class); when(jobDefinitionService.getJobDefinitions()).thenReturn(singletonList( someJobDefinition("Some Test Job")) ); // when jobConfiguration.jobStatusDetailIndicator( jobDefinitionService, asList(defaultCalculator, testCalculator)).statusDetail(); // then verify(testCalculator).statusDetail(any(JobDefinition.class)); } private JobDefinitionService someJobDefinitionService() { final JobDefinitionService jobDefinitionService = mock(JobDefinitionService.class); when(jobDefinitionService.getJobDefinitions()).thenReturn(singletonList(someJobDefinition("test"))); return jobDefinitionService; } private DefaultJobDefinition someJobDefinition(final String jobType) { return fixedDelayJobDefinition( jobType, "test", "", ofSeconds(10), 0, of(ofSeconds(10)) ); } }