diff --git a/src/main/java/uk/nhs/tis/sync/job/PostFundingSyncJob.java b/src/main/java/uk/nhs/tis/sync/job/PostFundingSyncJob.java index f769f946..a5f1dc2a 100644 --- a/src/main/java/uk/nhs/tis/sync/job/PostFundingSyncJob.java +++ b/src/main/java/uk/nhs/tis/sync/job/PostFundingSyncJob.java @@ -81,11 +81,13 @@ public void run(@Nullable String params) { } protected void runSyncJob() { - if (mainStopWatch != null) { + if (isCurrentlyRunning()) { LOG.info("Sync job [{}] already running, exiting this execution", JOB_NAME); return; } - CompletableFuture.runAsync(this::doDataSync); + CompletableFuture.runAsync(() -> { + doDataSync(); + }); } private void doDataSync() { diff --git a/src/main/java/uk/nhs/tis/sync/job/PostFundingSyncJobTemplate.java b/src/main/java/uk/nhs/tis/sync/job/PostFundingSyncJobTemplate.java deleted file mode 100644 index 196690da..00000000 --- a/src/main/java/uk/nhs/tis/sync/job/PostFundingSyncJobTemplate.java +++ /dev/null @@ -1,30 +0,0 @@ -package uk.nhs.tis.sync.job; - -import java.math.BigInteger; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import javax.persistence.EntityManager; -import javax.persistence.Query; - -/** - * This abstract class serves as a template for implementing post funding synchronization jobs - * that collects data from a database using native SQL queries. - * - * @param the type of data objects being synchronized - */ -public abstract class PostFundingSyncJobTemplate extends - PersonDateChangeCaptureSyncJobTemplate { - - @Override - protected List collectData(long lastPostId, String queryString, - EntityManager entityManager) { - Query query = - entityManager.createNativeQuery(queryString).setParameter("lastPostId", lastPostId); - - List resultList = query.getResultList(); - return resultList.stream().filter(Objects::nonNull) - .map(result -> Long.parseLong(result.toString())) - .collect(Collectors.toList()); - } -} diff --git a/src/test/java/uk/nhs/tis/sync/job/PostFundingSyncJobTemplateTest.java b/src/test/java/uk/nhs/tis/sync/job/PostFundingSyncJobTemplateTest.java deleted file mode 100644 index 27dd8a18..00000000 --- a/src/test/java/uk/nhs/tis/sync/job/PostFundingSyncJobTemplateTest.java +++ /dev/null @@ -1,119 +0,0 @@ -package uk.nhs.tis.sync.job; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.math.BigInteger; -import java.time.LocalDate; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import javax.annotation.Nullable; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Query; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.context.ApplicationEventPublisher; -import uk.nhs.tis.sync.event.JobExecutionEvent; - -@ExtendWith(MockitoExtension.class) -class PostFundingSyncJobTemplateTest { - - @Mock - private EntityManager entityManager; - - @Mock - private EntityManagerFactory entityManagerFactory; - - @Mock - private Query query; - - @Mock - ApplicationEventPublisher applicationEventPublisher; - - private ConcretePostFundingSyncJobTemplate postFundingSyncJobTemplate; - - @BeforeEach - void setUp() { - postFundingSyncJobTemplate = new ConcretePostFundingSyncJobTemplate(); - postFundingSyncJobTemplate.entityManagerFactory = entityManagerFactory; - } - - @Test - void testGetFailureMessage() { - String errorMessage = "Failed!"; - Throwable exception = new RuntimeException(errorMessage); - assertEquals(" Sync [TestJob] failed with exception [" + errorMessage + "].", - postFundingSyncJobTemplate.getFailureMessage(Optional.of("TestJob"), exception)); - assertEquals(" Sync [ConcretePostFundingSyncJobTemplate] failed with exception [" - + errorMessage + "].", - postFundingSyncJobTemplate.getFailureMessage(Optional.empty(), exception)); - } - - @Test - void testCollectData() { - when(entityManager.createNativeQuery(anyString())).thenReturn(query); - when(query.setParameter(anyString(), any())).thenReturn(query); - when(query.getResultList()) - .thenReturn(Arrays.asList(BigInteger.ONE, BigInteger.valueOf(2), BigInteger.valueOf(3))); - - List collectedData = postFundingSyncJobTemplate - .collectData(0L, "SELECT id FROM table WHERE id > :lastPostId", entityManager); - - assertNotNull(collectedData); - assertEquals(3, collectedData.size()); - assertTrue(collectedData.contains(1L)); - assertTrue(collectedData.contains(2L)); - assertTrue(collectedData.contains(3L)); - } - - @Test - void testPublishJobExecutionEvent() { - postFundingSyncJobTemplate.applicationEventPublisher = applicationEventPublisher; - - JobExecutionEvent event = new JobExecutionEvent(this, "Test Job"); - - postFundingSyncJobTemplate.publishJobexecutionEvent(event); - - ArgumentCaptor eventCaptor = ArgumentCaptor - .forClass(JobExecutionEvent.class); - verify(applicationEventPublisher, times(1)).publishEvent(eventCaptor.capture()); - - JobExecutionEvent capturedEvent = eventCaptor.getValue(); - assertSame(event, capturedEvent); - } - - private static class ConcretePostFundingSyncJobTemplate extends - PostFundingSyncJobTemplate { - - @Override - protected int convertData(Set entitiesToSave, List entityData, - EntityManager entityManager) { - return 0; - } - - @Override - protected String buildQueryForDate(LocalDate dateOfChange) { - return null; - } - - @Override - protected void handleData(Set dataToSave, EntityManager entityManager) { } - - @Override - public void run(@Nullable String params) { } - } -} diff --git a/src/test/java/uk/nhs/tis/sync/job/PostFundingSyncJobTest.java b/src/test/java/uk/nhs/tis/sync/job/PostFundingSyncJobTest.java index bfdef3c2..2979140a 100644 --- a/src/test/java/uk/nhs/tis/sync/job/PostFundingSyncJobTest.java +++ b/src/test/java/uk/nhs/tis/sync/job/PostFundingSyncJobTest.java @@ -2,6 +2,10 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -9,6 +13,9 @@ import com.transformuk.hee.tis.tcs.api.enumeration.Status; import com.transformuk.hee.tis.tcs.service.model.Post; import com.transformuk.hee.tis.tcs.service.model.PostFunding; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.math.BigInteger; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -18,17 +25,32 @@ import java.util.List; import java.util.Set; import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.EntityTransaction; +import javax.persistence.Query; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.context.ApplicationEventPublisher; +import uk.nhs.tis.sync.event.JobExecutionEvent; @ExtendWith(MockitoExtension.class) class PostFundingSyncJobTest { @Mock private EntityManager entityManager; + @Mock + ApplicationEventPublisher applicationEventPublisher; + @Mock + private EntityManagerFactory entityManagerFactory; + @Mock + private EntityTransaction transaction; + @Mock + private Query query; private PostFundingSyncJob postFundingSyncJob; @@ -37,6 +59,7 @@ class PostFundingSyncJobTest { @BeforeEach void setUp() { postFundingSyncJob = new PostFundingSyncJob(); + postFundingSyncJob.entityManagerFactory = entityManagerFactory; } @Test @@ -125,4 +148,53 @@ void testShouldBeSuccessfulWithHandleDataMethod() { verify(entityManager, times(1)).persist(post); verify(entityManager, times(1)).flush(); } + + @Test + void testDoDataSync() + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + when(entityManagerFactory.createEntityManager()).thenReturn(entityManager); + when(entityManager.getTransaction()).thenReturn(transaction); + when(transaction.isActive()).thenReturn(false); + when(entityManager.createNativeQuery(ArgumentMatchers.any())).thenReturn(query); + when(query.setParameter(eq("lastPostId"), ArgumentMatchers.any())).thenReturn(query); + when(query.getResultList()) + .thenReturn(Arrays.asList(BigInteger.ONE, BigInteger.valueOf(2), BigInteger.valueOf(3))) + .thenReturn(new ArrayList<>()); + + Method method = PostFundingSyncJob.class.getDeclaredMethod("doDataSync"); + method.setAccessible(true); + method.invoke(postFundingSyncJob); + + verify(query, times(2)).getResultList(); + } + + @Test + void testPublishJobExecutionEvent() + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + postFundingSyncJob.applicationEventPublisher = applicationEventPublisher; + + JobExecutionEvent event = new JobExecutionEvent(this, "Post funding sync job"); + + Method method = PostFundingSyncJob.class + .getDeclaredMethod("publishJobexecutionEvent", JobExecutionEvent.class); + method.setAccessible(true); + method.invoke(postFundingSyncJob, event); + + ArgumentCaptor eventCaptor = ArgumentCaptor + .forClass(JobExecutionEvent.class); + verify(applicationEventPublisher, times(1)).publishEvent(eventCaptor.capture()); + + JobExecutionEvent capturedEvent = eventCaptor.getValue(); + assertThat(capturedEvent.getMessage(), containsString("Post funding sync job")); + } + + @Test + public void testRun() { + PostFundingSyncJob spyJob = spy(postFundingSyncJob); + doNothing().when(spyJob).postFundingSyncJob(); + + spyJob.run(null); + + verify(spyJob).postFundingSyncJob(); + } }