package eu.europeana.cloud.service.mcs.rest;
import com.google.common.collect.ImmutableMap;
import eu.europeana.cloud.common.model.*;
import eu.europeana.cloud.common.response.ErrorInfo;
import eu.europeana.cloud.common.response.ResultSlice;
import eu.europeana.cloud.service.mcs.ApplicationContextUtils;
import eu.europeana.cloud.service.mcs.DataSetService;
import eu.europeana.cloud.service.mcs.RecordService;
import eu.europeana.cloud.service.mcs.UISClientHandler;
import eu.europeana.cloud.service.mcs.exception.*;
import eu.europeana.cloud.service.mcs.rest.exceptionmappers.RevisionIsNotValidExceptionMapper;
import eu.europeana.cloud.service.mcs.status.McsErrorCode;
import eu.europeana.cloud.test.CassandraTestRunner;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.context.ApplicationContext;
import javax.ws.rs.Path;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;
import java.util.Date;
import java.util.List;
import java.util.Map;
import static eu.europeana.cloud.common.web.ParamConstants.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.*;
/**
* RevisionResourceTest
*/
@RunWith(CassandraTestRunner.class)
public class DataSetRevisionTimeStampResourceTest extends JerseyTest {
private RecordService recordService;
private Representation rep;
private WebTarget revisionAndRepresenttaionWebTargetInsideDataSet;
private final static String TEST_REVISION_NAME = "revisionNameTest";
private final static String DATE_SET_NAME = "dataSetId";
private final static String REVISION_PROVIDER_ID = "revisionProviderId";
private UISClientHandler uisHandler;
private DataSetService dataSetService;
private DataProvider dataProvider;
private Revision revisionForDataProvider;
private String revisionAndRepresentationPath;
@Before
public void mockUp() throws Exception {
ApplicationContext applicationContext = ApplicationContextUtils
.getApplicationContext();
recordService = applicationContext.getBean(RecordService.class);
dataSetService = applicationContext.getBean(DataSetService.class);
uisHandler = applicationContext.getBean(UISClientHandler.class);
dataProvider = new DataProvider();
dataProvider.setId("1");
Mockito.doReturn(new DataProvider()).when(uisHandler)
.getProvider("1");
Mockito.doReturn(true).when(uisHandler)
.existsCloudId(Mockito.anyString());
rep = recordService.createRepresentation("1", "1", "1");
revisionForDataProvider = new Revision(TEST_REVISION_NAME, REVISION_PROVIDER_ID, new Date(), true, true, true);
String dataSetPath = DataSetResource.class.getAnnotation(Path.class).value();
revisionAndRepresentationPath = dataSetPath + "/revision" + "/{" + P_REVISION_NAME + "}/" + REVISION_PROVIDER + "/{" + P_REVISION_PROVIDER_ID + "}/" + REPRESENTATIONS + "/{" + P_REPRESENTATIONNAME + "}";
Map<String, Object> revisionAndRepresentation = ImmutableMap
.<String, Object>of(P_PROVIDER,
dataProvider.getId(), P_DATASET,
DATE_SET_NAME, P_REPRESENTATIONNAME,
rep.getRepresentationName(), P_REVISION_NAME,
TEST_REVISION_NAME, P_REVISION_PROVIDER_ID,
REVISION_PROVIDER_ID);
revisionAndRepresenttaionWebTargetInsideDataSet = target(revisionAndRepresentationPath).resolveTemplates(revisionAndRepresentation);
}
@After
public void cleanUp() throws Exception {
recordService.deleteRepresentation(rep.getCloudId(),
rep.getRepresentationName());
reset(recordService);
reset(dataSetService);
}
@Override
public Application configure() {
return new JerseyConfig().property("contextConfigLocation",
"classpath:spiedPersistentServicesTestContext.xml")
.registerClasses(RevisionIsNotValidExceptionMapper.class);
}
@Override
protected void configureClient(ClientConfig config) {
config.register(MultiPartFeature.class);
}
@Test
public void shouldProperlyReturnCloudIdAndTimestamp() throws Exception {
List<CloudIdAndTimestampResponse> cloudIdAndTimestampResponseList = getDataSetCloudIdsByRepresentationAndRevisionSuccessfully(null);
assertEquals(cloudIdAndTimestampResponseList.get(0).getCloudId(), rep.getCloudId());
}
@Test
public void shouldProperlyReturnCloudIdAndTimestampWhenDeleted() throws Exception {
List<CloudIdAndTimestampResponse> cloudIdAndTimestampResponseList = getDataSetCloudIdsByRepresentationAndRevisionSuccessfully(true);
assertEquals(cloudIdAndTimestampResponseList.get(0).getCloudId(), rep.getCloudId());
}
@Test
public void shouldReturnEmptyResults() throws Exception {
List<CloudIdAndTimestampResponse> cloudIdAndTimestampResponseList = getDataSetCloudIdsByRepresentationAndRevisionSuccessfully(false);
assertTrue(cloudIdAndTimestampResponseList.isEmpty());
}
private List<CloudIdAndTimestampResponse> getDataSetCloudIdsByRepresentationAndRevisionSuccessfully(Boolean isDeleted) throws ProviderNotExistsException, DataSetAlreadyExistsException, RevisionIsNotValidException, DataSetNotExistsException, RepresentationNotExistsException {
//given
PrepareTest(dataProvider.getId(), DATE_SET_NAME);
makeExistsProviderPass();
//when
Response response = revisionAndRepresenttaionWebTargetInsideDataSet.queryParam(F_START_FROM, null).queryParam(IS_DELETED, isDeleted).request().get();
//then
assertSuccessfulCallToLatestRevisionAndRepresentation(response);
ResultSlice<CloudIdAndTimestampResponse> cloudIdAndTimestampResponseResultSlice = response.readEntity(ResultSlice.class);
return cloudIdAndTimestampResponseResultSlice.getResults();
}
private void assertSuccessfulCallToLatestRevisionAndRepresentation(Response response) {
assertNotNull(response);
assertEquals(response.getStatus(), 200);
}
private void makeExistsProviderPass() {
Mockito.doReturn(true).when(uisHandler)
.existsProvider("1");
}
private void PrepareTest(String providerId, String datasetName) throws ProviderNotExistsException, DataSetAlreadyExistsException, RevisionIsNotValidException, DataSetNotExistsException, RepresentationNotExistsException {
DataSet dataSet = dataSetService.createDataSet(providerId, datasetName, "DataSetDescription");
recordService.addRevision(rep.getCloudId(), rep.getRepresentationName(), rep.getVersion(), revisionForDataProvider);
dataSetService.addAssignment(providerId, dataSet.getId(), rep.getCloudId(), rep.getRepresentationName
(), rep.getVersion());
}
@Test
public void shouldReturnDataSetNotExistError() throws Exception {
PrepareTest(dataProvider.getId(), "None_Existed_Dataset");
makeExistsProviderPass();
Response response = revisionAndRepresenttaionWebTargetInsideDataSet.queryParam(F_START_FROM, null).queryParam(IS_DELETED, null).request().get();
assertNotNull(response);
assertEquals(response.getStatus(), 404);
ErrorInfo errorInfo = response.readEntity(ErrorInfo.class);
assertEquals(McsErrorCode.DATASET_NOT_EXISTS.toString(), errorInfo.getErrorCode());
}
@Test
public void shouldReturnProviderNotExistError() throws Exception {
//given
PrepareTest("1", DATE_SET_NAME);
//when
Map<String, Object> revisionAndRepresentationNoneExistedProviderId = ImmutableMap
.<String, Object>of(P_PROVIDER,
dataProvider.getId(), P_DATASET,
DATE_SET_NAME, P_REPRESENTATIONNAME,
rep.getRepresentationName(), P_REVISION_NAME,
TEST_REVISION_NAME, P_REVISION_PROVIDER_ID,
dataProvider.getId());
revisionAndRepresenttaionWebTargetInsideDataSet = target(revisionAndRepresentationPath).resolveTemplates(revisionAndRepresentationNoneExistedProviderId);
Response response = revisionAndRepresenttaionWebTargetInsideDataSet.queryParam(F_START_FROM, null).queryParam(IS_DELETED, null).request().get();
//then
assertNotNull(response);
assertEquals(response.getStatus(), 404);
ErrorInfo errorInfo = response.readEntity(ErrorInfo.class);
assertEquals(McsErrorCode.PROVIDER_NOT_EXISTS.toString(), errorInfo.getErrorCode());
}
}