package fr.gouv.vitam.worker.core.plugin; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyObject; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.File; import java.io.FileNotFoundException; import java.io.InputStream; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import fr.gouv.vitam.common.PropertiesUtils; import fr.gouv.vitam.common.database.builder.request.multiple.Select; import fr.gouv.vitam.common.exception.InvalidParseOperationException; import fr.gouv.vitam.common.guid.GUIDFactory; import fr.gouv.vitam.common.json.JsonHandler; import fr.gouv.vitam.common.model.ItemStatus; import fr.gouv.vitam.common.model.StatusCode; import fr.gouv.vitam.metadata.api.exception.MetaDataExecutionException; import fr.gouv.vitam.metadata.client.MetaDataClient; import fr.gouv.vitam.metadata.client.MetaDataClientFactory; import fr.gouv.vitam.processing.common.parameter.WorkerParameters; import fr.gouv.vitam.processing.common.parameter.WorkerParametersFactory; import fr.gouv.vitam.storage.engine.client.StorageClient; import fr.gouv.vitam.storage.engine.client.StorageClientFactory; import fr.gouv.vitam.storage.engine.client.exception.StorageAlreadyExistsClientException; import fr.gouv.vitam.storage.engine.client.exception.StorageNotFoundClientException; import fr.gouv.vitam.storage.engine.common.model.DataCategory; import fr.gouv.vitam.worker.core.impl.HandlerIOImpl; import fr.gouv.vitam.workspace.client.WorkspaceClient; import fr.gouv.vitam.workspace.client.WorkspaceClientFactory; @RunWith(PowerMockRunner.class) @PowerMockIgnore("javax.net.ssl.*") @PrepareForTest({WorkspaceClientFactory.class, MetaDataClientFactory.class, StorageClientFactory.class}) public class StoreMetaDataUnitActionPluginTest { private static final String METDATA_UNIT_RESPONSE_JSON = "storeMetadataUnitPlugin/metdataUnitResponse.json"; private static final String CONTAINER_NAME = "aebaaaaaaaag3r7cabf4aak2izdlnwiaaaaq"; private static final String UNIT_GUID = "aeaqaaaaaaag3r7cabf4aak2izdloiiaaaaq"; private static final String UNIT = "storeMetadataUnitPlugin/aeaqaaaaaaag3r7cabf4aak2izdloiiaaaaq.json"; private WorkspaceClient workspaceClient; private WorkspaceClientFactory workspaceClientFactory; private MetaDataClient metadataClient; private StorageClient storageClient; private HandlerIOImpl action; private final InputStream unit; private final JsonNode unitResponse; private StorageClientFactory storageClientFactory; private StoreMetaDataUnitActionPlugin plugin; public StoreMetaDataUnitActionPluginTest() throws FileNotFoundException, InvalidParseOperationException { unit = PropertiesUtils.getResourceAsStream(UNIT); File file = PropertiesUtils.getResourceFile(METDATA_UNIT_RESPONSE_JSON); unitResponse = JsonHandler.getFromFile(file); } @Before public void setUp() throws Exception { workspaceClient = mock(WorkspaceClient.class); metadataClient = mock(MetaDataClient.class); storageClient = mock(StorageClient.class); PowerMockito.mockStatic(WorkspaceClientFactory.class); PowerMockito.mockStatic(MetaDataClientFactory.class); PowerMockito.mockStatic(StorageClientFactory.class); // workspace client workspaceClientFactory = mock(WorkspaceClientFactory.class); PowerMockito.when(WorkspaceClientFactory.getInstance()).thenReturn(workspaceClientFactory); PowerMockito.when(WorkspaceClientFactory.getInstance().getClient()).thenReturn(workspaceClient); // metadata client final MetaDataClientFactory mockedMetadataFactory = mock(MetaDataClientFactory.class); PowerMockito.when(MetaDataClientFactory.getInstance()).thenReturn(mockedMetadataFactory); PowerMockito.when(mockedMetadataFactory.getClient()).thenReturn(metadataClient); // storage client storageClientFactory = PowerMockito.mock(StorageClientFactory.class); when(storageClientFactory.getClient()).thenReturn(storageClient); when(StorageClientFactory.getInstance()).thenReturn(storageClientFactory); action = new HandlerIOImpl(CONTAINER_NAME, "workerId"); } @After public void clean() { action.partialClose(); } @Test public void givenMetadataClientWhensearchUnirThenReturnNull() throws Exception { final WorkerParameters params = WorkerParametersFactory.newWorkerParameters().setWorkerGUID(GUIDFactory .newGUID()).setContainerName(CONTAINER_NAME).setUrlMetadata("http://localhost:8083") .setUrlWorkspace("http://localhost:8083") .setObjectName(UNIT_GUID + ".json").setCurrentStep("Store unit"); plugin = new StoreMetaDataUnitActionPlugin(); final ItemStatus response = plugin.execute(params, action); assertEquals(StatusCode.KO, response.getGlobalStatus()); } @Test public void givenMetadataClientAndWorkspaceResponsesWhenSearchUnitThenReturnOK() throws Exception { final WorkerParameters params = WorkerParametersFactory.newWorkerParameters().setWorkerGUID(GUIDFactory .newGUID()).setContainerName(CONTAINER_NAME).setUrlMetadata("http://localhost:8083") .setUrlWorkspace("http://localhost:8083") .setObjectName(UNIT_GUID + ".json").setCurrentStep("Store unit"); final MetaDataClientFactory mockedMetadataFactory = mock(MetaDataClientFactory.class); PowerMockito.when(MetaDataClientFactory.getInstance()).thenReturn(mockedMetadataFactory); PowerMockito.when(mockedMetadataFactory.getClient()).thenReturn(metadataClient); Select query = new Select(); ObjectNode constructQuery = query.getFinalSelect(); when(metadataClient.selectUnitbyId(constructQuery, UNIT_GUID)) .thenReturn(unitResponse); when(workspaceClient.getObject(CONTAINER_NAME, DataCategory.UNIT.name() + "/" + params.getObjectName())) .thenReturn(Response.status(Status.OK).entity(unit).build()); when(storageClientFactory.getClient()).thenReturn(storageClient); when(StorageClientFactory.getInstance()).thenReturn(storageClientFactory); plugin = new StoreMetaDataUnitActionPlugin(); final ItemStatus response = plugin.execute(params, action); assertEquals(StatusCode.OK, response.getGlobalStatus()); } @Test public void givenMetadataClientWhensearchUnitThenThrowsException() throws Exception { final WorkerParameters params = WorkerParametersFactory.newWorkerParameters().setWorkerGUID(GUIDFactory .newGUID()).setContainerName(CONTAINER_NAME).setUrlMetadata("http://localhost:8083") .setUrlWorkspace("http://localhost:8083") .setObjectName(UNIT_GUID + ".json").setCurrentStep("Store unit"); final MetaDataClientFactory mockedMetadataFactory = mock(MetaDataClientFactory.class); PowerMockito.when(MetaDataClientFactory.getInstance()).thenReturn(mockedMetadataFactory); PowerMockito.when(mockedMetadataFactory.getClient()).thenReturn(metadataClient); Mockito.doThrow(new MetaDataExecutionException("Error Metadata")).when(metadataClient) .selectUnitbyId(anyObject(), anyObject()); plugin = new StoreMetaDataUnitActionPlugin(); final ItemStatus response = plugin.execute(params, action); assertEquals(StatusCode.FATAL, response.getGlobalStatus()); } @Test public void givenStorageClientWhenStoreFromWorkspaceThenThrowStorageNotFoundClientExceptionThenFATAL() throws Exception { final WorkerParameters params = WorkerParametersFactory.newWorkerParameters().setWorkerGUID(GUIDFactory .newGUID()).setContainerName(CONTAINER_NAME).setUrlMetadata("http://localhost:8083") .setUrlWorkspace("http://localhost:8083") .setObjectName(UNIT_GUID + ".json").setCurrentStep("Store unit"); Select query = new Select(); ObjectNode constructQuery = query.getFinalSelect(); when(metadataClient.selectUnitbyId(constructQuery, UNIT_GUID)) .thenReturn(unitResponse); when(workspaceClient.getObject(CONTAINER_NAME, DataCategory.UNIT.name() + "/" + params.getObjectName())) .thenReturn(Response.status(Status.OK).entity(unit).build()); Mockito.doThrow(new StorageNotFoundClientException("Error Metadata")).when(storageClient) .storeFileFromWorkspace(anyObject(), anyObject(), anyObject(), anyObject()); plugin = new StoreMetaDataUnitActionPlugin(); final ItemStatus response = plugin.execute(params, action); assertEquals(StatusCode.FATAL, response.getGlobalStatus()); } @Test public void givenStorageClientWhenStoreFromWorkspaceThenThrowStorageAlreadyExistsClientExceptionThenKO() throws Exception { final WorkerParameters params = WorkerParametersFactory.newWorkerParameters().setWorkerGUID(GUIDFactory .newGUID()).setContainerName(CONTAINER_NAME).setUrlMetadata("http://localhost:8083") .setUrlWorkspace("http://localhost:8083") .setObjectName(UNIT_GUID + ".json").setCurrentStep("Store unit"); Select query = new Select(); ObjectNode constructQuery = query.getFinalSelect(); when(metadataClient.selectUnitbyId(constructQuery, UNIT_GUID)) .thenReturn(unitResponse); when(workspaceClient.getObject(CONTAINER_NAME, DataCategory.UNIT.name() + "/" + params.getObjectName())) .thenReturn(Response.status(Status.OK).entity(unit).build()); Mockito.doThrow(new StorageAlreadyExistsClientException("Error Metadata ")).when(storageClient) .storeFileFromWorkspace(anyObject(), anyObject(), anyObject(), anyObject()); plugin = new StoreMetaDataUnitActionPlugin(); final ItemStatus response = plugin.execute(params, action); assertEquals(StatusCode.KO, response.getGlobalStatus()); } }