From dc19839aa74b69c33af0a796c162a87042bf3bf4 Mon Sep 17 00:00:00 2001 From: NThakur4 <nthakur4@slb.com> Date: Thu, 3 Mar 2022 07:36:21 -0600 Subject: [PATCH] add unit test --- .../service/IndexerServiceImplTest.java | 219 +++++++++++++++--- 1 file changed, 185 insertions(+), 34 deletions(-) diff --git a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/IndexerServiceImplTest.java b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/IndexerServiceImplTest.java index 026ff32cb..285b384a0 100644 --- a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/IndexerServiceImplTest.java +++ b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/IndexerServiceImplTest.java @@ -1,55 +1,206 @@ package org.opengroup.osdu.indexer.service; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.MockitoAnnotations.initMocks; -import java.util.ArrayList; -import java.util.List; +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import org.elasticsearch.action.bulk.BulkItemResponse; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.opengroup.osdu.core.common.model.indexer.RecordInfo; +import org.mockito.Spy; +import org.opengroup.osdu.core.common.http.HeadersUtil; +import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; +import org.opengroup.osdu.core.common.model.entitlements.Acl; +import org.opengroup.osdu.core.common.model.http.DpsHeaders; +import org.opengroup.osdu.core.common.model.indexer.*; +import org.opengroup.osdu.core.common.model.search.RecordChangedMessages; +import org.opengroup.osdu.core.common.model.storage.ConversionStatus; +import org.opengroup.osdu.core.common.provider.interfaces.IRequestInfo; import org.opengroup.osdu.core.common.search.ElasticIndexNameResolver; +import org.opengroup.osdu.indexer.logging.AuditLogger; +import org.opengroup.osdu.indexer.provider.interfaces.IPublisher; import org.opengroup.osdu.indexer.util.ElasticClientHandler; -import org.springframework.test.context.junit4.SpringRunner; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; -@RunWith(SpringRunner.class) +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Type; +import java.net.URISyntaxException; +import java.util.*; + +import static java.util.Collections.singletonList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.MockitoAnnotations.initMocks; +import static org.powermock.api.mockito.PowerMockito.*; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({RestHighLevelClient.class, BulkResponse.class, Acl.class, HeadersUtil.class}) public class IndexerServiceImplTest { - @InjectMocks - private IndexerServiceImpl indexerService; + @InjectMocks + private IndexerServiceImpl sut; + @Mock + private ElasticClientHandler elasticClientHandler; + @Mock + private ElasticIndexNameResolver elasticIndexNameResolver; + @Mock + private IndicesService indicesService; + @Mock + private StorageService storageService; + @Mock + private StorageIndexerPayloadMapper storageIndexerPayloadMapper; + @InjectMocks + @Spy + private JobStatus jobStatus = new JobStatus(); + @Mock + private AuditLogger auditLogger; + @Mock + private BulkResponse bulkResponse; + @Mock + private IRequestInfo requestInfo; + @Mock + private RestHighLevelClient restHighLevelClient; + @Mock + private IndexSchemaService schemaService; + @Mock + private JaxRsDpsLog jaxRsDpsLog; + @Mock + private IMappingService mappingService; + @Mock + private IPublisher progressPublisher; + + private List<RecordInfo> recordInfos = new ArrayList<>(); + + private final String pubsubMsg = "[{\"id\":\"opendes:doc:test1\",\"kind\":\"opendes:testindexer1:well:1.0.0\",\"op\":\"update\"}," + + "{\"id\":\"opendes:doc:test2\",\"kind\":\"opendes:testindexer2:well:1.0.0\",\"op\":\"create\"}]"; + private final String kind1 = "opendes:testindexer1:well:1.0.0"; + private final String kind2 = "opendes:testindexer2:well:1.0.0"; + private final String recordId1 = "opendes:doc:test1"; + private final String recordId2 = "opendes:doc:test2"; + private final String failureMassage = "test failure"; + + private DpsHeaders dpsHeaders; + private RecordChangedMessages recordChangedMessages; + + @Before + public void setup() throws IOException { + } + + @Test + public void processSchemaMessagesTest() throws Exception { + RecordInfo recordInfo = new RecordInfo(); + recordInfo.setId("opendes:ds:mytest3-d9033ae1-fb15-496c-9ba0-880fd1d2b2qf"); + recordInfo.setKind("opendes:ds:mytest2:1.0.0"); + recordInfo.setOp("purge_schema"); + this.recordInfos.add(recordInfo); + + initMocks(this); + + this.sut.processSchemaMessages(recordInfos); + + verify(this.elasticClientHandler, times(1)).createRestClient(); + verify(this.elasticIndexNameResolver, times(1)).getIndexNameFromKind(any()); + verify(this.indicesService, times(1)).isIndexExist(any(), any()); + } + + @Test + public void should_properlyUpdateAuditLogs_givenValidCreateAndUpdateRecords() { + try { + mockStatic(Acl.class); + + // setup headers + this.dpsHeaders = new DpsHeaders(); + this.dpsHeaders.put(DpsHeaders.AUTHORIZATION, "testAuth"); + when(this.requestInfo.getHeaders()).thenReturn(dpsHeaders); + when(this.requestInfo.getHeadersMapWithDwdAuthZ()).thenReturn(dpsHeaders.getHeaders()); + + // setup message + Type listType = new TypeToken<List<RecordInfo>>() {}.getType(); + this.recordInfos = (new Gson()).fromJson(this.pubsubMsg, listType); + Map<String, String> messageAttributes = new HashMap<>(); + messageAttributes.put(DpsHeaders.DATA_PARTITION_ID, "opendes"); + this.recordChangedMessages = RecordChangedMessages.builder().attributes(messageAttributes).messageId("xxxx").publishTime("2000-01-02T10:10:44+0000").data("{}").build(); + + // setup schema + Map<String, Object> schema = createSchema(); + indexSchemaServiceMock(kind2, schema); + indexSchemaServiceMock(kind1, null); + + // setup storage records + Map<String, Object> storageData = new HashMap<>(); + storageData.put("schema1", "test-value"); + List<Records.Entity> validRecords = new ArrayList<>(); + validRecords.add(Records.Entity.builder().id(recordId2).kind(kind2).data(storageData).build()); + List<ConversionStatus> conversionStatus = new LinkedList<>(); + Records storageRecords = Records.builder().records(validRecords).conversionStatuses(conversionStatus).build(); + when(this.storageService.getStorageRecords(any())).thenReturn(storageRecords); + + // setup elastic, index and mapped document + when(this.indicesService.createIndex(any(), any(), any(), any(), any())).thenReturn(true); + when(this.mappingService.getIndexMappingFromRecordSchema(any())).thenReturn(new HashMap<>()); + + when(this.elasticClientHandler.createRestClient()).thenReturn(this.restHighLevelClient); + when(this.restHighLevelClient.bulk(any(), any(RequestOptions.class))).thenReturn(this.bulkResponse); + + Map<String, Object> indexerMappedPayload = new HashMap<>(); + indexerMappedPayload.put("id", "keyword"); + when(this.storageIndexerPayloadMapper.mapDataPayload(any(), any(), any())).thenReturn(indexerMappedPayload); - @Mock - private ElasticClientHandler elasticClientHandler; + BulkItemResponse[] responses = new BulkItemResponse[]{prepareFailedResponse(), prepareSuccessfulResponse()}; + when(this.bulkResponse.getItems()).thenReturn(responses); - @Mock - private ElasticIndexNameResolver elasticIndexNameResolver; + // test + JobStatus jobStatus = this.sut.processRecordChangedMessages(recordChangedMessages, recordInfos); - @Mock - private IndicesService indicesService; + // validate + assertEquals(2, jobStatus.getStatusesList().size()); + assertEquals(1, jobStatus.getIdsByIndexingStatus(IndexingStatus.FAIL).size()); + assertEquals(1, jobStatus.getIdsByIndexingStatus(IndexingStatus.SUCCESS).size()); - private List<RecordInfo> recordInfos = new ArrayList<>(); + verify(this.auditLogger).indexCreateRecordSuccess(singletonList("RecordStatus(id=opendes:doc:test2, kind=opendes:testindexer2:well:1.0.0, operationType=create, status=SUCCESS)")); + verify(this.auditLogger).indexUpdateRecordFail(singletonList("RecordStatus(id=opendes:doc:test1, kind=opendes:testindexer1:well:1.0.0, operationType=update, status=FAIL, message=test failure)")); + } catch (Exception e) { + fail("Should not throw this exception" + e.getMessage()); + } + } - @Before - public void setup() { - RecordInfo recordInfo = new RecordInfo(); - recordInfo.setId("opendes:ds:mytest3-d9033ae1-fb15-496c-9ba0-880fd1d2b2qf"); - recordInfo.setKind("opendes:ds:mytest2:1.0.0"); - recordInfo.setOp("purge_schema"); - recordInfos.add(recordInfo); + private BulkItemResponse prepareFailedResponse() { + BulkItemResponse responseFail = mock(BulkItemResponse.class); + when(responseFail.isFailed()).thenReturn(true); + when(responseFail.getFailureMessage()).thenReturn(failureMassage); + when(responseFail.getId()).thenReturn(recordId1); + when(responseFail.getFailure()).thenReturn(new BulkItemResponse.Failure("failure index", "failure type", "failure id", new Exception("test failure"))); + return responseFail; + } - initMocks(this); - } + private BulkItemResponse prepareSuccessfulResponse() { + BulkItemResponse responseSuccess = mock(BulkItemResponse.class); + when(responseSuccess.getId()).thenReturn(recordId2); + return responseSuccess; + } - @Test - public void processSchemaMessagesTest() throws Exception { - indexerService.processSchemaMessages(recordInfos); + private void indexSchemaServiceMock(String kind, Map<String, Object> schema) throws UnsupportedEncodingException, URISyntaxException { + IndexSchema indexSchema = schema == null + ? IndexSchema.builder().kind(kind).dataSchema(new HashMap<>()).build() + : IndexSchema.builder().kind(kind).dataSchema(schema).build(); + when(schemaService.getIndexerInputSchema(kind, new ArrayList<>())).thenReturn(indexSchema); + } - verify(elasticClientHandler, times(1)).createRestClient(); - verify(elasticIndexNameResolver, times(1)).getIndexNameFromKind(any()); - verify(indicesService, times(1)).isIndexExist(any(), any()); - } + private Map<String, Object> createSchema() { + Map<String, Object> schema = new HashMap<>(); + schema.put("schema1", "keyword"); + schema.put("schema2", "boolean"); + schema.put("schema3", "date"); + schema.put("schema6", "object"); + return schema; + } } -- GitLab