package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs; import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar.CalendarType; import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.jobs.calendar.SingleCalendarOperationsAdapter; import com.jaspersoft.jasperserver.jaxrs.client.core.Callback; import com.jaspersoft.jasperserver.jaxrs.client.core.enums.JRSVersion; import com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest; import com.jaspersoft.jasperserver.jaxrs.client.core.enums.MimeType; import com.jaspersoft.jasperserver.jaxrs.client.core.RequestExecution; import com.jaspersoft.jasperserver.jaxrs.client.core.RestClientConfiguration; import com.jaspersoft.jasperserver.jaxrs.client.core.SessionStorage; import com.jaspersoft.jasperserver.jaxrs.client.core.operationresult.OperationResult; import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.Job; import com.jaspersoft.jasperserver.jaxrs.client.dto.jobs.jaxb.wrappers.CalendarNameListWrapper; import org.mockito.Mock; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.testng.PowerMockTestCase; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.concurrent.atomic.AtomicInteger; import static com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest.buildRequest; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.verifyStatic; import static org.powermock.api.mockito.PowerMockito.whenNew; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertSame; /** * Unit tests for {@link JobsService} */ @PrepareForTest({JerseyRequest.class, JobsService.class}) public class JobsServiceTest extends PowerMockTestCase { @Mock private SessionStorage sessionStorageMock; @Mock private BatchJobsOperationsAdapter expectedAdapterMock; @Mock private SingleJobOperationsAdapter expectedJobOperationsAdapter; @Mock private JerseyRequest<Job> jobRequestMock; @Mock private JerseyRequest<CalendarNameListWrapper> wrapperRequestMock; @Mock private OperationResult<Job> expectedJobOperationResultMock; @Mock private OperationResult<CalendarNameListWrapper> expectedWrapperOperationResultMock; @Mock private Job reportMock; @Mock private RestClientConfiguration configurationMock; @Mock private Callback<OperationResult<CalendarNameListWrapper>, Object> callbackMock; @Mock private RequestExecution executionMock; @Mock private SingleCalendarOperationsAdapter expectedCalendarOperationsAdapterMock; @BeforeMethod public void before() { initMocks(this); } @Test(testName = "jobs") public void should_return_proper_adapter() throws Exception { // Given JobsService serviceSpy = spy(new JobsService(sessionStorageMock)); whenNew(BatchJobsOperationsAdapter.class) .withParameterTypes(SessionStorage.class) .withArguments(sessionStorageMock) .thenReturn(expectedAdapterMock); // When BatchJobsOperationsAdapter retrieved = serviceSpy.jobs(); // Then assertSame(retrieved, expectedAdapterMock); } @Test(testName = "job") public void should_return_proper_SingleJobOperationsAdapter() throws Exception { // Given JobsService serviceSpy = spy(new JobsService(sessionStorageMock)); whenNew(SingleJobOperationsAdapter.class) .withParameterTypes(SessionStorage.class, String.class) .withArguments(sessionStorageMock, "9056") .thenReturn(expectedJobOperationsAdapter); // When SingleJobOperationsAdapter retrieved = serviceSpy.job(9056); // Then verify(serviceSpy, times(1)).job(9056); assertSame(retrieved, expectedJobOperationsAdapter); } @Test(testName = "scheduleReport_for_v5_6_1") public void should_return_proper_OperationResult_when_JRS_version_is_v5_6_1() { // Given JobsService serviceSpy = spy(new JobsService(sessionStorageMock)); mockStatic(JerseyRequest.class); when(JerseyRequest.buildRequest(eq(sessionStorageMock), eq(Job.class), eq(new String[]{"jobs"}), any(JobValidationErrorHandler.class))).thenReturn(jobRequestMock); when(jobRequestMock.put(reportMock)).thenReturn(expectedJobOperationResultMock); when(sessionStorageMock.getConfiguration()).thenReturn(configurationMock); when(configurationMock.getJrsVersion()).thenReturn(JRSVersion.v5_6_1); when(configurationMock.getContentMimeType()).thenReturn(MimeType.XML); // When serviceSpy.scheduleReport(reportMock); // Then verifyStatic(times(1)); JerseyRequest.buildRequest(eq(sessionStorageMock), eq(Job.class), eq(new String[]{"jobs"}), any(JobValidationErrorHandler.class)); verify(jobRequestMock, times(1)).put(reportMock); verify(jobRequestMock, times(1)).setContentType("application/job+xml"); verify(jobRequestMock, times(1)).setAccept("application/job+xml"); } @Test(testName = "scheduleReport_for_v4_7_0") public void should_return_proper_OperationResult_when_JRS_version_is_v4_7_0() { // Given mockStatic(JerseyRequest.class); when(JerseyRequest.buildRequest(eq(sessionStorageMock), eq(Job.class), eq(new String[]{"jobs"}), any(JobValidationErrorHandler.class))).thenReturn(jobRequestMock); when(jobRequestMock.put(reportMock)).thenReturn(expectedJobOperationResultMock); when(sessionStorageMock.getConfiguration()).thenReturn(configurationMock); when(configurationMock.getJrsVersion()).thenReturn(JRSVersion.v4_7_0); when(configurationMock.getContentMimeType()).thenReturn(MimeType.JSON); JobsService serviceSpy = spy(new JobsService(sessionStorageMock)); // When OperationResult<Job> retrieved = serviceSpy.scheduleReport(reportMock); // Then verifyStatic(times(1)); JerseyRequest.buildRequest(eq(sessionStorageMock), eq(Job.class), eq(new String[]{"jobs"}), any(JobValidationErrorHandler.class)); verify(jobRequestMock, times(1)).put(reportMock); verify(jobRequestMock, times(1)).setContentType("application/job+json"); verify(jobRequestMock, times(1)).setAccept("application/job+json"); assertNotNull(retrieved); assertSame(retrieved, expectedJobOperationResultMock); } @Test(testName = "calendars") public void should_return_proper_op_result_object() { // Given JobsService serviceSpy = spy(new JobsService(sessionStorageMock)); doReturn(expectedWrapperOperationResultMock).when(serviceSpy).calendars(null); // When OperationResult<CalendarNameListWrapper> retrieved = serviceSpy.calendars(); // Then verify(serviceSpy, times(1)).calendars(); verify(serviceSpy, times(1)).calendars(null); verify(serviceSpy, never()).calendars(CalendarType.holiday); verifyNoMoreInteractions(serviceSpy); assertSame(retrieved, expectedWrapperOperationResultMock); } @Test(testName = "asyncCalendars") public void should_return_RequestExecution_with_CalendarNameListWrapper_instance() { // Given JobsService serviceSpy = spy(new JobsService(sessionStorageMock)); doReturn(executionMock).when(serviceSpy).asyncCalendars(null, callbackMock); // When RequestExecution retrieved = serviceSpy.asyncCalendars(callbackMock); // Then verify(serviceSpy, times(1)).asyncCalendars(null, callbackMock); verify(serviceSpy, never()).asyncCalendars(CalendarType.holiday, callbackMock); assertSame(retrieved, executionMock); } @Test(testName = "calendars_with_param") public void should_return_proper_op_result_object_when_param_is_not_null() { // Given mockStatic(JerseyRequest.class); when(JerseyRequest.buildRequest(eq(sessionStorageMock), eq(CalendarNameListWrapper.class), eq(new String[]{"jobs", "calendars"}))).thenReturn(wrapperRequestMock); when(wrapperRequestMock.get()).thenReturn(expectedWrapperOperationResultMock); JobsService serviceSpy = spy(new JobsService(sessionStorageMock)); // When OperationResult<CalendarNameListWrapper> retrieved = serviceSpy.calendars(CalendarType.daily); // Then assertNotNull(retrieved); assertSame(retrieved, expectedWrapperOperationResultMock); verifyStatic(times(1)); JerseyRequest.buildRequest(eq(sessionStorageMock), eq(CalendarNameListWrapper.class), eq(new String[]{"jobs", "calendars"})); verify(wrapperRequestMock, times(1)).get(); verify(wrapperRequestMock, times(1)).addParam("calendarType", CalendarType.daily.toString().toLowerCase()); } @Test(testName = "calendars_with_param") public void should_return_proper_op_result_object_when_param_is_null() { // Given mockStatic(JerseyRequest.class); when(JerseyRequest.buildRequest(eq(sessionStorageMock), eq(CalendarNameListWrapper.class), eq(new String[]{"jobs", "calendars"}))).thenReturn(wrapperRequestMock); when(wrapperRequestMock.get()).thenReturn(expectedWrapperOperationResultMock); JobsService serviceSpy = spy(new JobsService(sessionStorageMock)); // When OperationResult<CalendarNameListWrapper> retrieved = serviceSpy.calendars(null); // Then assertNotNull(retrieved); assertSame(retrieved, expectedWrapperOperationResultMock); verifyStatic(times(1)); JerseyRequest.buildRequest(eq(sessionStorageMock), eq(CalendarNameListWrapper.class), eq(new String[]{"jobs", "calendars"})); verify(wrapperRequestMock, times(1)).get(); verify(wrapperRequestMock, never()).addParam("calendarType", CalendarType.daily.toString().toLowerCase()); } @Test(testName = "calendar") public void should_return_an_calendar_adapter() throws Exception { // Given final String calendarName = "testCalendar"; JobsService serviceSpy = spy(new JobsService(sessionStorageMock)); whenNew(SingleCalendarOperationsAdapter.class) .withParameterTypes(SessionStorage.class, String.class) .withArguments(sessionStorageMock, calendarName) .thenReturn(expectedCalendarOperationsAdapterMock); // When SingleCalendarOperationsAdapter retrieved = serviceSpy.calendar(calendarName); // Then assertNotNull(retrieved); assertSame(retrieved, expectedCalendarOperationsAdapterMock); } @Test(testName = "calendar", expectedExceptions = IllegalArgumentException.class) public void should_throw_an_exception_when_invalid_calendar_name() throws Exception { JobsService serviceSpy = spy(new JobsService(sessionStorageMock)); serviceSpy.calendar(""); } @Test public void should_get_calendars_asynchronously() throws InterruptedException { /* Given */ PowerMockito.mockStatic(JerseyRequest.class); PowerMockito.when(buildRequest(eq(sessionStorageMock), eq(CalendarNameListWrapper.class), eq(new String[]{"jobs", "calendars"}))).thenReturn(wrapperRequestMock); PowerMockito.doReturn(expectedWrapperOperationResultMock).when(wrapperRequestMock).get(); JobsService serviceSpy = PowerMockito.spy(new JobsService(sessionStorageMock)); final AtomicInteger newThreadId = new AtomicInteger(); final int currentThreadId = (int) Thread.currentThread().getId(); final Callback<OperationResult<CalendarNameListWrapper>, Void> callback = PowerMockito.spy(new Callback<OperationResult<CalendarNameListWrapper>, Void>() { @Override public Void execute(OperationResult<CalendarNameListWrapper> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); PowerMockito.doReturn(null).when(callback).execute(expectedWrapperOperationResultMock); /* When */ RequestExecution retrieved = serviceSpy.asyncCalendars(CalendarType.annual, callback); /* Wait */ synchronized (callback) { callback.wait(1000); } /* Then */ Assert.assertNotNull(retrieved); Assert.assertNotSame(currentThreadId, newThreadId.get()); Mockito.verify(wrapperRequestMock).get(); Mockito.verify(callback).execute(expectedWrapperOperationResultMock); Mockito.verify(wrapperRequestMock).addParam("calendarType", "annual"); } @Test public void should_send_ScheduleReport_asynchronously_() throws InterruptedException { /* Given */ PowerMockito.mockStatic(JerseyRequest.class); PowerMockito.when(buildRequest(eq(sessionStorageMock), eq(Job.class), eq(new String[]{"jobs"}), any(JobValidationErrorHandler.class))).thenReturn(jobRequestMock); PowerMockito.doReturn(expectedJobOperationResultMock).when(jobRequestMock).put(reportMock); JobsService serviceSpy = PowerMockito.spy(new JobsService(sessionStorageMock)); final AtomicInteger newThreadId = new AtomicInteger(); final int currentThreadId = (int) Thread.currentThread().getId(); final Callback<OperationResult<Job>, Void> callback = PowerMockito.spy(new Callback<OperationResult<Job>, Void>() { @Override public Void execute(OperationResult<Job> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); PowerMockito.doReturn(null).when(callback).execute(expectedJobOperationResultMock); PowerMockito.doReturn(configurationMock).when(sessionStorageMock).getConfiguration(); PowerMockito.doReturn(JRSVersion.v5_0_0).when(configurationMock).getJrsVersion(); PowerMockito.doReturn(null).when(callback).execute(expectedJobOperationResultMock); PowerMockito.doReturn(null).when(callback).execute(expectedJobOperationResultMock); /* When */ RequestExecution retrieved = serviceSpy.asyncScheduleReport(reportMock, callback); /* Wait */ synchronized (callback) { callback.wait(1000); } /* Then */ Assert.assertNotNull(retrieved); Assert.assertNotSame(currentThreadId, newThreadId.get()); Mockito.verify(jobRequestMock).put(reportMock); Mockito.verify(jobRequestMock).setContentType("application/job+json"); Mockito.verify(jobRequestMock).setAccept("application/job+json"); Mockito.verify(callback).execute(expectedJobOperationResultMock); Mockito.verify(sessionStorageMock).getConfiguration(); Mockito.verify(configurationMock).getJrsVersion(); } @Test public void should_send_ScheduleReport_asynchronously() throws InterruptedException { /* Given */ PowerMockito.mockStatic(JerseyRequest.class); PowerMockito.when(buildRequest(eq(sessionStorageMock), eq(Job.class), eq(new String[]{"jobs"}), any(JobValidationErrorHandler.class))).thenReturn(jobRequestMock); PowerMockito.doReturn(expectedJobOperationResultMock).when(jobRequestMock).put(reportMock); JobsService serviceSpy = PowerMockito.spy(new JobsService(sessionStorageMock)); final AtomicInteger newThreadId = new AtomicInteger(); final int currentThreadId = (int) Thread.currentThread().getId(); final Callback<OperationResult<Job>, Void> callback = PowerMockito.spy(new Callback<OperationResult<Job>, Void>() { @Override public Void execute(OperationResult<Job> data) { newThreadId.set((int) Thread.currentThread().getId()); synchronized (this) { this.notify(); } return null; } }); PowerMockito.doReturn(null).when(callback).execute(expectedJobOperationResultMock); PowerMockito.doReturn(configurationMock).when(sessionStorageMock).getConfiguration(); PowerMockito.doReturn(JRSVersion.v5_6_1).when(configurationMock).getJrsVersion(); PowerMockito.doReturn(null).when(callback).execute(expectedJobOperationResultMock); PowerMockito.doReturn(null).when(callback).execute(expectedJobOperationResultMock); /* When */ RequestExecution retrieved = serviceSpy.asyncScheduleReport(reportMock, callback); /* Wait */ synchronized (callback) { callback.wait(1000); } /* Then */ Assert.assertNotNull(retrieved); Assert.assertNotSame(currentThreadId, newThreadId.get()); Mockito.verify(jobRequestMock).put(reportMock); Mockito.verify(jobRequestMock).setContentType("application/job+xml"); Mockito.verify(jobRequestMock).setAccept("application/job+xml"); Mockito.verify(callback).execute(expectedJobOperationResultMock); Mockito.verify(sessionStorageMock, times(3)).getConfiguration(); Mockito.verify(configurationMock).getJrsVersion(); } @AfterMethod public void after() { reset(sessionStorageMock, expectedAdapterMock, expectedJobOperationsAdapter, jobRequestMock, expectedJobOperationResultMock, reportMock, configurationMock); } }