package eu.europeana.cloud.service.mcs.rest; import eu.europeana.cloud.common.model.DataProvider; import eu.europeana.cloud.common.model.DataSet; import eu.europeana.cloud.common.model.File; import eu.europeana.cloud.common.model.Representation; 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.DataSetNotExistsException; import eu.europeana.cloud.test.CassandraTestRunner; import org.glassfish.jersey.test.JerseyTest; 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.QueryParam; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Application; import javax.ws.rs.core.Form; import javax.ws.rs.core.Response; import java.io.ByteArrayInputStream; import java.util.List; import static eu.europeana.cloud.common.web.ParamConstants.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.springframework.context.ApplicationContext; /** * DataSetResourceTest */ @RunWith(CassandraTestRunner.class) public class DataSetResourceTest extends JerseyTest { // private DataProviderService dataProviderService; private DataSetService dataSetService; private RecordService recordService; private WebTarget dataSetWebTarget; private WebTarget dataSetAssignmentWebTarget; private DataProvider dataProvider = new DataProvider(); private UISClientHandler uisHandler; @Override public Application configure() { return new JerseyConfig().property("contextConfigLocation", "classpath:spiedPersistentServicesTestContext.xml"); } @Before public void mockUp() throws Exception { ApplicationContext applicationContext = ApplicationContextUtils.getApplicationContext(); dataProvider.setId("testprov"); uisHandler = applicationContext.getBean(UISClientHandler.class); Mockito.doReturn(new DataProvider()).when(uisHandler) .getProvider(Mockito.anyString()); Mockito.doReturn(true).when(uisHandler) .existsCloudId(Mockito.anyString()); Mockito.doReturn(true).when(uisHandler) .existsProvider(Mockito.anyString()); dataSetService = applicationContext.getBean(DataSetService.class); recordService = applicationContext.getBean(RecordService.class); dataSetWebTarget = target(DataSetResource.class.getAnnotation(Path.class).value()); } @Test public void shouldUpdateDataset() throws Exception { // given certain data set in service String dataSetId = "dataset"; String description = "dataset description"; dataSetService.createDataSet(dataProvider.getId(), dataSetId, ""); // when you add data set for a provider dataSetWebTarget = dataSetWebTarget.resolveTemplate(P_PROVIDER, dataProvider.getId()).resolveTemplate( P_DATASET, dataSetId); Response updateResponse = dataSetWebTarget.request().put(Entity.form(new Form(F_DESCRIPTION, description))); assertEquals(Response.Status.NO_CONTENT.getStatusCode(), updateResponse.getStatus()); // ten this set should be visible in service List<DataSet> dataSetsForPrivider = dataSetService.getDataSets(dataProvider.getId(), null, 10000).getResults(); assertEquals("Expected single dataset in service", 1, dataSetsForPrivider.size()); DataSet ds = dataSetsForPrivider.get(0); assertEquals(dataSetId, ds.getId()); assertEquals(description, ds.getDescription()); } @Test public void shouldDeleteDataset() throws Exception { // given certain datasets with the same id for different providers String dataSetId = "dataset"; String anotherProvider = "anotherProvider"; dataSetService.createDataSet(dataProvider.getId(), dataSetId, ""); DataProvider another = new DataProvider(); another.setId(anotherProvider); // Mockito.doReturn(another).when(dataProviderDAO).getProvider("anotherProvider"); dataSetService.createDataSet(anotherProvider, dataSetId, ""); // when you delete it for one provider dataSetWebTarget = dataSetWebTarget.resolveTemplate(P_PROVIDER, dataProvider.getId()).resolveTemplate( P_DATASET, dataSetId); Response deleteResponse = dataSetWebTarget.request().delete(); assertEquals(Response.Status.NO_CONTENT.getStatusCode(), deleteResponse.getStatus()); // than deleted dataset should not be in service and non-deleted should remain assertTrue("Expecting no dataset for provier service", dataSetService.getDataSets(dataProvider.getId(), null, 10000).getResults().isEmpty()); assertEquals("Expecting one dataset", 1, dataSetService.getDataSets(anotherProvider, null, 10000).getResults() .size()); } @Test public void shouldListRepresentationsFromDataset() throws Exception { // given data set with assigned record representations String dataSetId = "dataset"; dataSetService.createDataSet(dataProvider.getId(), dataSetId, ""); Representation r1_1 = insertDummyPersistentRepresentation("1", "dc", dataProvider.getId()); Representation r1_2 = insertDummyPersistentRepresentation("1", "dc", dataProvider.getId()); Representation r2_1 = insertDummyPersistentRepresentation("2", "dc", dataProvider.getId()); Representation r2_2 = insertDummyPersistentRepresentation("2", "dc", dataProvider.getId()); dataSetService.addAssignment(dataProvider.getId(), dataSetId, r1_1.getCloudId(), r1_1.getRepresentationName(), null); dataSetService.addAssignment(dataProvider.getId(), dataSetId, r2_1.getCloudId(), r2_1.getRepresentationName(), r2_1.getVersion()); // when you list dataset contents dataSetWebTarget = dataSetWebTarget.resolveTemplate(P_PROVIDER, dataProvider.getId()).resolveTemplate( P_DATASET, dataSetId); Response listDataset = dataSetWebTarget.request().get(); assertEquals(Response.Status.OK.getStatusCode(), listDataset.getStatus()); List<Representation> dataSetContents = listDataset.readEntity(ResultSlice.class).getResults(); // then you should get assigned records in specified versions or latest (depending on assigmnents) assertEquals(2, dataSetContents.size()); Representation r1FromDataset, r2FromDataset; if (dataSetContents.get(0).getCloudId().equals(r1_1.getCloudId())) { r1FromDataset = dataSetContents.get(0); r2FromDataset = dataSetContents.get(1); } else { r1FromDataset = dataSetContents.get(1); r2FromDataset = dataSetContents.get(0); } assertEquals(r1_2, r1FromDataset); assertEquals(r2_1, r2FromDataset); } @Test public void shouldReturnErrorForMissingParameters() throws Exception { String dataSetId = "dataset"; dataSetWebTarget = dataSetWebTarget.resolveTemplate(P_PROVIDER, dataProvider.getId()).resolveTemplate( P_DATASET, dataSetId).path("/latelyRevisionedVersion"); Response response = dataSetWebTarget.request().get(); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); // dataSetWebTarget = dataSetWebTarget.resolveTemplate(P_PROVIDER, dataProvider.getId()).resolveTemplate( P_DATASET, dataSetId).queryParam(P_CLOUDID,"sampleCloudID"); response = dataSetWebTarget.request().get(); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); // dataSetWebTarget = dataSetWebTarget.resolveTemplate(P_PROVIDER, dataProvider.getId()).resolveTemplate( P_DATASET, dataSetId).queryParam(P_REPRESENTATIONNAME,"sampleRepName"); response = dataSetWebTarget.request().get(); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); // dataSetWebTarget = dataSetWebTarget.resolveTemplate(P_PROVIDER, dataProvider.getId()).resolveTemplate( P_DATASET, dataSetId).queryParam(P_REVISION_NAME,"sampleRevisionName"); response = dataSetWebTarget.request().get(); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); } @Test public void shouldReturnPropperVersionValue() throws DataSetNotExistsException { Mockito.doReturn("sample").when(dataSetService).getLatestVersionForGivenRevision(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString()); String dataSetId = "dataset"; dataSetWebTarget = dataSetWebTarget.resolveTemplate(P_PROVIDER, dataProvider.getId()).resolveTemplate( P_DATASET, dataSetId).path("/latelyRevisionedVersion").queryParam(F_CLOUDID,"sampleCloudID").queryParam(F_REPRESENTATIONNAME,"sampleRepName").queryParam(F_REVISION_NAME,"sampleRevisionName").queryParam(F_REVISION_PROVIDER_ID,"samplerevProvider"); Response response = dataSetWebTarget.request().get(); assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); assertEquals("sample",response.readEntity(String.class)); } @Test public void shouldReturnNoContent() throws DataSetNotExistsException { Mockito.doReturn(null).when(dataSetService) .getLatestVersionForGivenRevision(Mockito.anyString(),Mockito.anyString(),Mockito.anyString(),Mockito.anyString(),Mockito.anyString(),Mockito.anyString()); String dataSetId = "dataset"; dataSetWebTarget = dataSetWebTarget.resolveTemplate(P_PROVIDER, dataProvider.getId()).resolveTemplate( P_DATASET, dataSetId).path("/latelyRevisionedVersion").queryParam(F_CLOUDID,"sampleCloudID").queryParam(F_REPRESENTATIONNAME,"sampleRepName").queryParam(F_REVISION_NAME,"sampleRevisionName").queryParam(F_REVISION_PROVIDER_ID,"samplerevProvider"); Response response = dataSetWebTarget.request().get(); assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); } private Representation insertDummyPersistentRepresentation(String cloudId, String schema, String providerId) throws Exception { Representation r = recordService.createRepresentation(cloudId, schema, providerId); byte[] dummyContent = {1, 2, 3}; File f = new File("content.xml", "application/xml", null, null, 0, null); recordService.putContent(cloudId, schema, r.getVersion(), f, new ByteArrayInputStream(dummyContent)); return recordService.persistRepresentation(r.getCloudId(), r.getRepresentationName(), r.getVersion()); } }