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());
}
}