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.response.ErrorInfo; import eu.europeana.cloud.service.mcs.ApplicationContextUtils; import eu.europeana.cloud.service.mcs.DataSetService; import eu.europeana.cloud.service.mcs.UISClientHandler; import eu.europeana.cloud.service.mcs.exception.DataSetAlreadyExistsException; import eu.europeana.cloud.service.mcs.exception.ProviderNotExistsException; import eu.europeana.cloud.service.mcs.status.McsErrorCode; import eu.europeana.cloud.test.CassandraTestRunner; 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.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.net.URI; import java.util.List; import static eu.europeana.cloud.common.web.ParamConstants.*; import static org.junit.Assert.assertEquals; /** * DataSetResourceTest */ @RunWith(CassandraTestRunner.class) public class DataSetsResourceTest extends JerseyTest { private DataSetService dataSetService; private WebTarget dataSetsWebTarget; private UISClientHandler uisHandler; private DataProvider dataProvider = new DataProvider(); @Override public Application configure() { return new JerseyConfig().property("contextConfigLocation", "classpath:spiedPersistentServicesTestContext.xml"); } @Before public void mockUp() throws Exception { ApplicationContext applicationContext = ApplicationContextUtils .getApplicationContext(); dataProvider.setId("provId"); dataSetService = applicationContext.getBean(DataSetService.class); uisHandler = applicationContext.getBean(UISClientHandler.class); dataSetsWebTarget = target(DataSetsResource.class.getAnnotation( Path.class).value()); } @After public void cleanUp() throws Exception { Mockito.reset(uisHandler); } @Test public void shouldCreateDataset() throws Exception { Mockito.doReturn(new DataProvider()).when(uisHandler) .getProvider("provId"); // given String datasetId = "dataset"; String description = "dataset description"; // when you add data set for a provider dataSetsWebTarget = dataSetsWebTarget.resolveTemplate(P_PROVIDER, "provId"); Response createResponse = dataSetsWebTarget.request().post( Entity.form(new Form(F_DATASET, datasetId).param(F_DESCRIPTION, description))); // then location of dataset should be given in response assertEquals(Response.Status.CREATED.getStatusCode(), createResponse.getStatus()); URI expectedObjectUri = dataSetsWebTarget.path("{" + P_DATASET + "}") .resolveTemplate(P_PROVIDER, "provId") .resolveTemplate(P_DATASET, datasetId).getUri(); assertEquals(expectedObjectUri, createResponse.getLocation()); // and then this set should be visible in service List<DataSet> dataSetsForPrivider = dataSetService.getDataSets( "provId", 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 shouldRequireDatasetIdParameterOnCreate() { // given Mockito.doReturn(new DataProvider()).when(uisHandler) .getProvider("notexisting"); String description = "dataset description"; // when you try to add data set without id dataSetsWebTarget = dataSetsWebTarget.resolveTemplate(P_PROVIDER, "provId"); Response createResponse = dataSetsWebTarget.request().post( Entity.form(new Form(F_DESCRIPTION, description))); // then you should get error assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), createResponse.getStatus()); ErrorInfo errorInfo = createResponse.readEntity(ErrorInfo.class); assertEquals(McsErrorCode.OTHER.toString(), errorInfo.getErrorCode()); } @Test public void shouldNotCreateTwoDatasetsWithSameId() throws Exception { Mockito.doReturn(new DataProvider()).when(uisHandler) .getProvider("provId"); // given that there is a dataset with certain id String dataSetId = "dataset"; dataSetService.createDataSet("provId", dataSetId, ""); // when you try to add a dataset for the same provider with this id dataSetsWebTarget = dataSetsWebTarget.resolveTemplate(P_PROVIDER, "provId"); Response createResponse = dataSetsWebTarget.request().post( Entity.form(new Form(F_DATASET, dataSetId))); // then you should get information about conflict assertEquals(Response.Status.CONFLICT.getStatusCode(), createResponse.getStatus()); ErrorInfo errorInfo = createResponse.readEntity(ErrorInfo.class); assertEquals(McsErrorCode.DATASET_ALREADY_EXISTS.toString(), errorInfo.getErrorCode()); } @Test public void shouldNotCreateDatasetForNotexistingProvider() throws DataSetAlreadyExistsException, ProviderNotExistsException { Mockito.doReturn(null).when(uisHandler) .getProvider("notexisting"); // when you try to add dataset to this not existing provider dataSetsWebTarget = dataSetsWebTarget.resolveTemplate(P_PROVIDER, "notexisting"); Response createResponse = dataSetsWebTarget.request().post( Entity.form(new Form(F_DATASET, "dataset"))); // then you should get error assertEquals(Response.Status.NOT_FOUND.getStatusCode(), createResponse.getStatus()); ErrorInfo errorInfo = createResponse.readEntity(ErrorInfo.class); assertEquals(McsErrorCode.PROVIDER_NOT_EXISTS.toString(), errorInfo.getErrorCode()); Mockito.reset(uisHandler); } }