diff --git a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/jira/JiraItemInfo.java b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/jira/JiraItemInfo.java index c601b5ec99..9c12ccf0e0 100644 --- a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/jira/JiraItemInfo.java +++ b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/jira/JiraItemInfo.java @@ -2,31 +2,12 @@ import lombok.Getter; import lombok.Setter; -import org.opensearch.dataprepper.plugins.source.jira.models.IssueBean; import org.opensearch.dataprepper.plugins.source.jira.utils.Constants; -import org.opensearch.dataprepper.plugins.source.jira.utils.JiraContentType; import org.opensearch.dataprepper.plugins.source.source_crawler.model.ItemInfo; import java.time.Instant; -import java.time.OffsetDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Date; -import java.util.HashMap; import java.util.Map; -import java.util.Objects; import java.util.UUID; -import java.util.regex.Pattern; - -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.CONTENT_TYPE; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.CREATED; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.ISSUE_KEY; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.KEY; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.NAME; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.PROJECT; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.PROJECT_KEY; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.PROJECT_NAME; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.UPDATED; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants._ISSUE; @Setter @Getter @@ -124,52 +105,6 @@ public JiraItemInfoBuilder withIssueType(String issueType) { this.issueType = issueType; return this; } - - public JiraItemInfoBuilder withIssueBean(IssueBean issue) { - Map issueMetadata = new HashMap<>(); - if (Objects.nonNull(((Map) issue.getFields().get(PROJECT)).get(KEY))) { - issueMetadata.put(PROJECT_KEY, ((Map) issue.getFields().get(PROJECT)).get(KEY).toString()); - this.project = ((Map) issue.getFields().get(PROJECT)).get(KEY).toString(); - } - - if (Objects.nonNull(((Map) issue.getFields().get(PROJECT)).get(NAME))) { - issueMetadata.put(PROJECT_NAME, ((Map) issue.getFields().get(PROJECT)).get(NAME).toString()); - } - - long created = 0; - Pattern JiraDateTimePattern = Pattern.compile( - "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}[-+]\\d{4}$"); - DateTimeFormatter offsetDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); - if (Objects.nonNull(issue.getFields().get(CREATED)) && JiraDateTimePattern.matcher(issue.getFields().get(CREATED) - .toString()).matches()) { - String charSequence = issue.getFields().get(CREATED).toString(); - OffsetDateTime offsetDateTime = OffsetDateTime.parse(charSequence, offsetDateTimeFormatter); - new Date(offsetDateTime.toInstant().toEpochMilli()); - created = offsetDateTime.toEpochSecond() * 1000; - } - issueMetadata.put(CREATED, String.valueOf(created)); - - long updated = 0; - if (JiraDateTimePattern.matcher(issue.getFields().get(UPDATED).toString()).matches()) { - String charSequence = issue.getFields().get(UPDATED).toString(); - OffsetDateTime offsetDateTime = OffsetDateTime.parse(charSequence, offsetDateTimeFormatter); - new Date(offsetDateTime.toInstant().toEpochMilli()); - updated = offsetDateTime.toEpochSecond() * 1000; - } - issueMetadata.put(UPDATED, String.valueOf(updated)); - - issueMetadata.put(ISSUE_KEY, issue.getKey()); - this.id = issue.getKey(); - - issueMetadata.put(CONTENT_TYPE, JiraContentType.ISSUE.getType()); - this.issueType = JiraContentType.ISSUE.getType(); - - this.itemId = _ISSUE + issueMetadata.get(PROJECT_KEY) + "-" + issue.getKey(); - - this.metadata = issueMetadata; - - return this; - } } } diff --git a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/jira/JiraService.java b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/jira/JiraService.java index 5d78d88c4c..8a3b030d68 100644 --- a/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/jira/JiraService.java +++ b/data-prepper-plugins/saas-source-plugins/jira-source/src/main/java/org/opensearch/dataprepper/plugins/source/jira/JiraService.java @@ -14,7 +14,9 @@ import javax.inject.Named; import java.time.Instant; +import java.time.OffsetDateTime; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -26,38 +28,15 @@ import java.util.stream.Collectors; import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.CREATED; -import static org.opensearch.dataprepper.logging.DataPrepperMarkers.NOISY; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.AUTHORIZATION_ERROR_CODE; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.BAD_REQUEST_EXCEPTION; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.CLOSING_ROUND_BRACKET; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.CONTENT_TYPE; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.DELIMITER; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.EXPAND_FIELD; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.EXPAND_VALUE; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.FIFTY; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.GREATER_THAN_EQUALS; import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.ISSUE_KEY; import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.KEY; import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.LIVE; - import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.NAME; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.MAX_RESULT; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.OAUTH2; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.PREFIX; import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.PROJECT; import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.PROJECT_KEY; - import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.PROJECT_NAME; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.RATE_LIMIT; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.REST_API_FETCH_ISSUE; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.REST_API_SEARCH; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.RETRY_ATTEMPT; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.RETRY_ATTEMPT_SLEEP_TIME; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.START_AT; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.STATUS_IN; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.SUFFIX; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.TOKEN_EXPIRED; import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.UPDATED; +import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants._ISSUE; import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants._PROJECT; import static org.opensearch.dataprepper.plugins.source.jira.utils.JqlConstants.CLOSING_ROUND_BRACKET; import static org.opensearch.dataprepper.plugins.source.jira.utils.JqlConstants.DELIMITER; @@ -150,14 +129,46 @@ private void searchForNewTicketsAndAddToQueue(JiraSourceConfig configuration, In */ private void addItemsToQueue(List issueList, Queue itemInfoQueue) { issueList.forEach(issue -> { - itemInfoQueue.add(JiraItemInfo.builder().withEventTime(Instant.now()).withIssueBean(issue).build()); - + Map issueMetadata = new HashMap<>(); if (Objects.nonNull(((Map) issue.getFields().get(PROJECT)).get(KEY))) { - String projectKey = ((Map) issue.getFields().get(PROJECT)).get(KEY).toString(); - if (!jiraProjectCache.containsKey(projectKey)) { - jiraProjectCache.put(projectKey, LIVE); - } + issueMetadata.put(PROJECT_KEY, + ((Map) issue.getFields().get(PROJECT)).get(KEY).toString()); + } + if (Objects.nonNull(((Map) issue.getFields().get(PROJECT)).get(NAME))) { + issueMetadata.put(PROJECT_NAME, + ((Map) issue.getFields().get(PROJECT)).get(NAME).toString()); + } + + long created = 0; + if (Objects.nonNull(issue.getFields()) && issue.getFields().get(CREATED) + .toString().length() >= 23) { + String charSequence = issue.getFields().get(CREATED).toString().substring(0, 23) + "Z"; + OffsetDateTime offsetDateTime = OffsetDateTime.parse(charSequence); + new Date(offsetDateTime.toInstant().toEpochMilli()); + created = offsetDateTime.toEpochSecond() * 1000; } + issueMetadata.put(CREATED, String.valueOf(created)); + + long updated = 0; + if (issue.getFields().get(UPDATED).toString().length() >= 23) { + String charSequence = issue.getFields().get(UPDATED).toString().substring(0, 23) + "Z"; + OffsetDateTime offsetDateTime = OffsetDateTime.parse(charSequence); + new Date(offsetDateTime.toInstant().toEpochMilli()); + updated = offsetDateTime.toEpochSecond() * 1000; + } + issueMetadata.put(UPDATED, String.valueOf(updated)); + + issueMetadata.put(ISSUE_KEY, issue.getKey()); + issueMetadata.put(CONTENT_TYPE, JiraContentType.ISSUE.getType()); + String id = _ISSUE + issueMetadata.get(PROJECT_KEY) + "-" + issue.getKey(); + + itemInfoQueue.add(createItemInfo(id, issueMetadata)); + + if (Objects.nonNull(issueMetadata.get(PROJECT_KEY)) && !jiraProjectCache + .containsKey(issueMetadata.get(PROJECT_KEY))) { + jiraProjectCache.put((String) issueMetadata.get(PROJECT_KEY), LIVE); + } + }); } diff --git a/data-prepper-plugins/saas-source-plugins/jira-source/src/test/java/org/opensearch/dataprepper/plugins/source/jira/JiraItemInfoTest.java b/data-prepper-plugins/saas-source-plugins/jira-source/src/test/java/org/opensearch/dataprepper/plugins/source/jira/JiraItemInfoTest.java index 80aa7a2e1e..5a65129e16 100644 --- a/data-prepper-plugins/saas-source-plugins/jira-source/src/test/java/org/opensearch/dataprepper/plugins/source/jira/JiraItemInfoTest.java +++ b/data-prepper-plugins/saas-source-plugins/jira-source/src/test/java/org/opensearch/dataprepper/plugins/source/jira/JiraItemInfoTest.java @@ -5,13 +5,13 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.opensearch.dataprepper.plugins.source.jira.utils.Constants; import java.time.Instant; import java.util.Map; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.when; @@ -53,11 +53,6 @@ void testGetters() { assertEquals(jiraItemInfo.getEventTime(), eventTime); } - @Test - void testGetKeyAttributes() { - assertInstanceOf(Map.class, jiraItemInfo.getKeyAttributes()); - } - @Test void testSetter() { jiraItemInfo.setEventTime(Instant.now()); diff --git a/data-prepper-plugins/saas-source-plugins/jira-source/src/test/java/org/opensearch/dataprepper/plugins/source/jira/JiraServiceTest.java b/data-prepper-plugins/saas-source-plugins/jira-source/src/test/java/org/opensearch/dataprepper/plugins/source/jira/JiraServiceTest.java index 49b00f25a8..149396d1dc 100644 --- a/data-prepper-plugins/saas-source-plugins/jira-source/src/test/java/org/opensearch/dataprepper/plugins/source/jira/JiraServiceTest.java +++ b/data-prepper-plugins/saas-source-plugins/jira-source/src/test/java/org/opensearch/dataprepper/plugins/source/jira/JiraServiceTest.java @@ -125,12 +125,10 @@ public void testGetJiraEntities() throws JsonProcessingException { JiraSourceConfig jiraSourceConfig = createJiraConfiguration(BASIC, issueType, issueStatus, projectKey); JiraService jiraService = spy(new JiraService(jiraSourceConfig, jiraRestClient)); List mockIssues = new ArrayList<>(); - IssueBean issue1 = createIssueBean(false, false); + IssueBean issue1 = createIssueBean(false); mockIssues.add(issue1); - IssueBean issue2 = createIssueBean(true, false); + IssueBean issue2 = createIssueBean(true); mockIssues.add(issue2); - IssueBean issue3 = createIssueBean(false, true); - mockIssues.add(issue3); SearchResults mockSearchResults = mock(SearchResults.class); when(mockSearchResults.getIssues()).thenReturn(mockIssues); @@ -141,7 +139,7 @@ public void testGetJiraEntities() throws JsonProcessingException { Instant timestamp = Instant.ofEpochSecond(0); Queue itemInfoQueue = new ConcurrentLinkedQueue<>(); jiraService.getJiraEntities(jiraSourceConfig, timestamp, itemInfoQueue); - + //one additional item is added for the project assertEquals(mockIssues.size() + 1, itemInfoQueue.size()); } @@ -155,7 +153,7 @@ public void buildIssueItemInfoMultipleFutureThreads() throws JsonProcessingExcep JiraService jiraService = spy(new JiraService(jiraSourceConfig, jiraRestClient)); List mockIssues = new ArrayList<>(); for (int i = 0; i < 50; i++) { - IssueBean issue1 = createIssueBean(false, false); + IssueBean issue1 = createIssueBean(false); mockIssues.add(issue1); } @@ -179,9 +177,8 @@ public void testBadProjectKeys() throws JsonProcessingException { issueType.add("Task"); issueStatus.add("Done"); projectKey.add("Bad Project Key"); - projectKey.add("A"); + projectKey.add(""); projectKey.add("!@#$"); - projectKey.add("AAAAAAAAAAAAAA"); JiraSourceConfig jiraSourceConfig = createJiraConfiguration(BASIC, issueType, issueStatus, projectKey); JiraService jiraService = new JiraService(jiraSourceConfig, jiraRestClient); @@ -207,93 +204,7 @@ public void testGetJiraEntitiesException() throws JsonProcessingException { assertThrows(RuntimeException.class, () -> jiraService.getJiraEntities(jiraSourceConfig, timestamp, itemInfoQueue)); } - - @Test - public void testGetAllIssuesBasic() throws JsonProcessingException { - List issueType = new ArrayList<>(); - List issueStatus = new ArrayList<>(); - List projectKey = new ArrayList<>(); - issueType.add("Task"); - JiraSourceConfig jiraSourceConfig = createJiraConfiguration(BASIC, issueType, issueStatus, projectKey); - JiraService jiraService = new JiraService(restTemplate, jiraSourceConfig, authConfig); - SearchResults mockSearchResults = mock(SearchResults.class); - doReturn(new ResponseEntity<>(mockSearchResults, HttpStatus.OK)).when(restTemplate).getForEntity(any(URI.class), any(Class.class)); - SearchResults results = jiraService.getAllIssues(jql, 0, jiraSourceConfig); - assertNotNull(results); - } - - @Test - public void testGetAllIssuesOauth2() throws JsonProcessingException { - List issueType = new ArrayList<>(); - List issueStatus = new ArrayList<>(); - List projectKey = new ArrayList<>(); - issueType.add("Task"); - JiraSourceConfig jiraSourceConfig = createJiraConfiguration(OAUTH2, issueType, issueStatus, projectKey); - JiraService jiraService = new JiraService(restTemplate, jiraSourceConfig, authConfig); - SearchResults mockSearchResults = mock(SearchResults.class); - doReturn("http://mock-service.jira.com").when(authConfig).getUrl(); - doReturn(new ResponseEntity<>(mockSearchResults, HttpStatus.OK)).when(restTemplate).getForEntity(any(URI.class), any(Class.class)); - SearchResults results = jiraService.getAllIssues(jql, 0, jiraSourceConfig); - assertNotNull(results); - } - - private JiraSourceConfig createJiraConfiguration(String auth_type, List issueType, List issueStatus, List projectKey) throws JsonProcessingException { - ObjectMapper objectMapper = new ObjectMapper(); - Map connectorCredentialsMap = new HashMap<>(); - connectorCredentialsMap.put("auth_type", auth_type); - - Map jiraSourceConfigMap = new HashMap<>(); - jiraSourceConfigMap.put("account_url", ACCESSIBLE_RESOURCES); - jiraSourceConfigMap.put("connector_credentials", connectorCredentialsMap); - jiraSourceConfigMap.put("issue_types", issueType); - jiraSourceConfigMap.put("statuses", issueStatus); - jiraSourceConfigMap.put("projects", projectKey); - - - String jiraSourceConfigJsonString = objectMapper.writeValueAsString(jiraSourceConfigMap); - return objectMapper.readValue(jiraSourceConfigJsonString, JiraSourceConfig.class); - } - - @Test - void testInvokeRestApiTokenExpiredInterruptException() throws JsonProcessingException, InterruptedException { - List issueType = new ArrayList<>(); - List issueStatus = new ArrayList<>(); - List projectKey = new ArrayList<>(); - JiraSourceConfig jiraSourceConfig = createJiraConfiguration(BASIC, issueType, issueStatus, projectKey); - JiraService jiraService = new JiraService(restTemplate, jiraSourceConfig, authConfig); - when(authConfig.getUrl()).thenReturn("https://example.com/rest/api/2/issue/key"); - when(restTemplate.getForEntity(any(URI.class), any(Class.class))).thenThrow(new HttpClientErrorException(HttpStatus.TOO_MANY_REQUESTS)); - jiraService.setSleepTimeMultiplier(100000); - - Thread testThread = new Thread(() -> { - assertThrows(InterruptedException.class, () -> { - try { - jiraService.getIssue("key"); - } catch (Exception e) { - throw new RuntimeException(e); - } - }); - }); - testThread.start(); - Thread.sleep(100); - testThread.interrupt(); - } - - @ParameterizedTest - @MethodSource("provideHttpStatusCodesWithExceptionClass") - void testInvokeRestApiTokenExpired(HttpStatus statusCode, Class expectedExceptionType) throws JsonProcessingException { - List issueType = new ArrayList<>(); - List issueStatus = new ArrayList<>(); - List projectKey = new ArrayList<>(); - JiraSourceConfig jiraSourceConfig = createJiraConfiguration(BASIC, issueType, issueStatus, projectKey); - JiraService jiraService = new JiraService(restTemplate, jiraSourceConfig, authConfig); - jiraService.setSleepTimeMultiplier(1); - when(authConfig.getUrl()).thenReturn("https://example.com/rest/api/2/issue/key"); - when(restTemplate.getForEntity(any(URI.class), any(Class.class))).thenThrow(new HttpClientErrorException(statusCode)); - assertThrows(expectedExceptionType, () -> jiraService.getIssue("key")); - } - - private IssueBean createIssueBean(boolean nullFields, boolean createdNull) { + private IssueBean createIssueBean(boolean nullFields) { IssueBean issue1 = new IssueBean(); issue1.setId(UUID.randomUUID().toString()); issue1.setKey("issue_1_key"); @@ -302,16 +213,12 @@ private IssueBean createIssueBean(boolean nullFields, boolean createdNull) { Map fieldMap = new HashMap<>(); if (!nullFields) { - fieldMap.put(CREATED, "2024-07-06T21:12:23.437-0700"); - fieldMap.put(UPDATED, "2024-07-06T21:12:23.106-0700"); -// fieldMap.put(UPDATED, Instant.now()); + fieldMap.put(CREATED, Instant.now()); + fieldMap.put(UPDATED, Instant.now()); } else { fieldMap.put(CREATED, 0); fieldMap.put(UPDATED, 0); } - if (createdNull) { - fieldMap.put(CREATED, null); - } Map issueTypeMap = new HashMap<>(); issueTypeMap.put("name", "Task"); diff --git a/data-prepper-plugins/saas-source-plugins/jira-source/src/test/java/org/opensearch/dataprepper/plugins/source/jira/JiraSourceTest.java b/data-prepper-plugins/saas-source-plugins/jira-source/src/test/java/org/opensearch/dataprepper/plugins/source/jira/JiraSourceTest.java index 560ad8b0d5..d95235e3ee 100644 --- a/data-prepper-plugins/saas-source-plugins/jira-source/src/test/java/org/opensearch/dataprepper/plugins/source/jira/JiraSourceTest.java +++ b/data-prepper-plugins/saas-source-plugins/jira-source/src/test/java/org/opensearch/dataprepper/plugins/source/jira/JiraSourceTest.java @@ -6,25 +6,12 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.opensearch.dataprepper.metrics.PluginMetrics; import org.opensearch.dataprepper.model.acknowledgements.AcknowledgementSetManager; -import org.opensearch.dataprepper.model.buffer.Buffer; -import org.opensearch.dataprepper.model.event.Event; import org.opensearch.dataprepper.model.plugin.PluginFactory; -import org.opensearch.dataprepper.model.record.Record; -import org.opensearch.dataprepper.model.source.coordinator.enhanced.EnhancedSourceCoordinator; import org.opensearch.dataprepper.plugins.source.jira.rest.auth.JiraAuthConfig; import org.opensearch.dataprepper.plugins.source.source_crawler.base.Crawler; import org.opensearch.dataprepper.plugins.source.source_crawler.base.PluginExecutorServiceProvider; -import java.util.concurrent.ExecutorService; - import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.ACCESSIBLE_RESOURCES; -import static org.opensearch.dataprepper.plugins.source.jira.utils.Constants.BASIC; @ExtendWith(MockitoExtension.class) public class JiraSourceTest { @@ -44,65 +31,15 @@ public class JiraSourceTest { @Mock private AcknowledgementSetManager acknowledgementSetManager; - @Mock - private Crawler crawler; - - @Mock - private EnhancedSourceCoordinator sourceCooridinator; - - @Mock - Buffer> buffer; @Mock - private PluginExecutorServiceProvider executorServiceProvider; + private Crawler crawler; - @Mock - private ExecutorService executorService; -// = new PluginExecutorServiceProvider(); + private PluginExecutorServiceProvider executorServiceProvider = new PluginExecutorServiceProvider(); @Test void initialization() { - when(executorServiceProvider.get()).thenReturn(executorService); JiraSource source = new JiraSource(pluginMetrics, jiraSourceConfig, jiraOauthConfig, pluginFactory, acknowledgementSetManager, crawler, executorServiceProvider); assertNotNull(source); } - - @Test - void testStart() { - when(executorServiceProvider.get()).thenReturn(executorService); - JiraSource source = new JiraSource(pluginMetrics, jiraSourceConfig, jiraOauthConfig, pluginFactory, acknowledgementSetManager, crawler, executorServiceProvider); - when(jiraSourceConfig.getAccountUrl()).thenReturn(ACCESSIBLE_RESOURCES); - when(jiraSourceConfig.getAuthType()).thenReturn(BASIC); - when(jiraSourceConfig.getJiraId()).thenReturn("Test Id"); - when(jiraSourceConfig.getJiraCredential()).thenReturn("Test Credential"); - - source.setEnhancedSourceCoordinator(sourceCooridinator); - source.start(buffer); - verify(executorService, atLeast(1)).submit(any(Runnable.class)); - } - - @Test - void testStop() { - when(executorServiceProvider.get()).thenReturn(executorService); - JiraSource source = new JiraSource(pluginMetrics, jiraSourceConfig, jiraOauthConfig, pluginFactory, acknowledgementSetManager, crawler, executorServiceProvider); - when(jiraSourceConfig.getAccountUrl()).thenReturn(ACCESSIBLE_RESOURCES); - when(jiraSourceConfig.getAuthType()).thenReturn(BASIC); - when(jiraSourceConfig.getJiraId()).thenReturn("Test Id"); - when(jiraSourceConfig.getJiraCredential()).thenReturn("Test Credential"); - - source.setEnhancedSourceCoordinator(sourceCooridinator); - source.start(buffer); - source.stop(); - verify(executorService).shutdownNow(); - } - - @Test - void testStop_WhenNotStarted() { - when(executorServiceProvider.get()).thenReturn(executorService); - JiraSource source = new JiraSource(pluginMetrics, jiraSourceConfig, jiraOauthConfig, pluginFactory, acknowledgementSetManager, crawler, executorServiceProvider); - - source.stop(); - - verify(executorService, never()).shutdown(); - } }