package eu.europeana.cloud.service.mcs.rest;
import com.google.common.collect.Lists;
import eu.europeana.cloud.common.model.File;
import eu.europeana.cloud.common.model.Record;
import eu.europeana.cloud.common.model.Representation;
import eu.europeana.cloud.common.response.ErrorInfo;
import eu.europeana.cloud.service.mcs.ApplicationContextUtils;
import eu.europeana.cloud.service.mcs.RecordService;
import eu.europeana.cloud.service.mcs.exception.RecordNotExistsException;
import eu.europeana.cloud.service.mcs.status.McsErrorCode;
import eu.europeana.cloud.service.mcs.rest.exceptionmappers.RecordNotExistsExceptionMapper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import junitparams.JUnitParamsRunner;
import static junitparams.JUnitParamsRunner.$;
import junitparams.Parameters;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import org.springframework.context.ApplicationContext;
@RunWith(JUnitParamsRunner.class)
public class RepresentationsResourceTest extends JerseyTest {
private RecordService recordService;
static final private String globalId = "1";
static final private String schema = "DC";
static final private String version = "1.0";
static final private Record record = new Record(globalId, Lists.newArrayList(new Representation(globalId, schema,
version, null, null, "DLF", Arrays.asList(new File("1.xml", "text/xml", "91162629d258a876ee994e9233b2ad87",
"2013-01-01", 12345, null)),null, true, new Date())));
@Override
public Application configure() {
return new ResourceConfig().registerClasses(RepresentationsResource.class)
.registerClasses(RecordNotExistsExceptionMapper.class)
.property("contextConfigLocation", "classpath:testContext.xml");
}
@Before
public void mockUp() {
ApplicationContext applicationContext = ApplicationContextUtils.getApplicationContext();
recordService = applicationContext.getBean(RecordService.class);
Mockito.reset(recordService);
}
@SuppressWarnings("unused")
private Object[] mimeTypes() {
return $($(MediaType.APPLICATION_XML_TYPE), $(MediaType.APPLICATION_JSON_TYPE));
}
@Test
@Parameters(method = "mimeTypes")
public void getRepresentations(MediaType mediaType)
throws Exception {
Record expected = new Record(record);
Representation expectedRepresentation = expected.getRepresentations().get(0);
expectedRepresentation.setUri(URITools.getVersionUri(getBaseUri(), globalId, schema, version));
expectedRepresentation.setAllVersionsUri(URITools.getAllVersionsUri(getBaseUri(), globalId, schema));
expectedRepresentation.setFiles(new ArrayList<File>());
when(recordService.getRecord(globalId)).thenReturn(new Record(record));
Response response = target(URITools.getRepresentationsPath(globalId).toString()).request(mediaType).get();
assertThat(response.getStatus(), is(200));
assertThat(response.getMediaType(), is(mediaType));
List<Representation> entity = response.readEntity(new GenericType<List<Representation>>() {
});
assertThat(entity, is(expected.getRepresentations()));
verify(recordService, times(1)).getRecord(globalId);
verifyNoMoreInteractions(recordService);
}
@Test
public void getRepresentationsReturns404IfRecordDoesNotExists()
throws Exception {
Throwable exception = new RecordNotExistsException();
when(recordService.getRecord(globalId)).thenThrow(exception);
Response response = target().path(URITools.getRepresentationsPath(globalId).toString())
.request(MediaType.APPLICATION_XML).get();
assertThat(response.getStatus(), is(404));
ErrorInfo errorInfo = response.readEntity(ErrorInfo.class);
assertThat(errorInfo.getErrorCode(), is(McsErrorCode.RECORD_NOT_EXISTS.toString()));
verify(recordService, times(1)).getRecord(globalId);
verifyNoMoreInteractions(recordService);
}
@Test
public void getRepresentationsReturns406ForUnsupportedFormat() {
Response response = target().path(URITools.getRepresentationsPath(globalId).toString())
.request(MediaType.APPLICATION_SVG_XML_TYPE).get();
assertThat(response.getStatus(), is(406));
}
}