package org.datacite.conres;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.filter.LoggingFilter;
import com.sun.jersey.freemarker.FreemarkerViewProcessor;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.WebAppDescriptor;
import org.datacite.conres.service.impl.MockSearchServiceImpl;
import org.datacite.conres.view.Representation;
import org.junit.Test;
import javax.ws.rs.core.MediaType;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class ContentControllerTest extends JerseyTest{
public ContentControllerTest()throws Exception {
super(new WebAppDescriptor.Builder("org.datacite.conres")
.initParam(FreemarkerViewProcessor.FREEMARKER_TEMPLATES_BASE_PATH, "freemarker")
.build());
}
@Test
public void test204() {
WebResource webResource = resource().path(MockSearchServiceImpl.TEST_DOI_NO_XML);
webResource.addFilter(new LoggingFilter());
ClientResponse response = webResource.accept(Representation.APPLICATION_DATACITE_XML.asMediaType()).get(ClientResponse.class);
assertEquals(204, response.getStatus());
}
@Test
public void test404() {
WebResource webResource = resource().path(MockSearchServiceImpl.TEST_DOI_NON_EXISTENT);
webResource.addFilter(new LoggingFilter());
ClientResponse response = webResource.accept(Representation.APPLICATION_DATACITE_XML.asMediaType()).get(ClientResponse.class);
assertEquals(404, response.getStatus());
}
@Test
public void test406() {
WebResource webResource = resource().path(MockSearchServiceImpl.TEST_DOI);
webResource.addFilter(new LoggingFilter());
ClientResponse response = webResource.accept("invalid/invalid").get(ClientResponse.class);
assertEquals(406, response.getStatus());
}
private MediaType[] buildAccept(String[] subtypes, String[] weights) {
if (subtypes == null)
throw new IllegalArgumentException("subtypes cannot be null");
if (weights != null && subtypes.length!=weights.length)
throw new IllegalArgumentException("subtypes and weights must be same size");
MediaType[] result = new MediaType[subtypes.length];
for (int i = 0; i < result.length; i++) {
if (weights != null){
Map<String, String> q = new HashMap<String, String>();
q.put("q", weights[i]);
result[i] = new MediaType("application", subtypes[i], q);
} else {
result[i] = new MediaType("application", subtypes[i]);
}
}
return result;
}
@Test
public void testAcceptQ1() {
WebResource webResource = resource().path(MockSearchServiceImpl.TEST_DOI);
webResource.addFilter(new LoggingFilter());
MediaType[] formats = buildAccept(new String[]{"rdf+xml", "unixref+xml", "x-datacite+xml"},
new String[]{"0.9", "0.8", "0.2"});
ClientResponse response = webResource.accept(formats).get(ClientResponse.class);
assertEquals(200, response.getStatus());
assertEquals("application/rdf+xml", response.getType().toString());
}
@Test
public void testAcceptQ2() {
WebResource webResource = resource().path(MockSearchServiceImpl.TEST_DOI);
webResource.addFilter(new LoggingFilter());
MediaType[] formats = buildAccept(new String[]{"fancy+pants", "rdf+xml", "unixref+xml", "x-datacite+xml"},
new String[]{"1.0", "0.7", "0.2", "0.8"});
ClientResponse response = webResource.accept(formats).get(ClientResponse.class);
assertEquals(200, response.getStatus());
assertEquals("application/x-datacite+xml", response.getType().toString());
}
@Test
public void testAcceptNoQ1() {
WebResource webResource = resource().path(MockSearchServiceImpl.TEST_DOI);
webResource.addFilter(new LoggingFilter());
MediaType[] formats = buildAccept(new String[]{"rdf+xml", "unixref+xml", "x-datacite+xml"}, null);
ClientResponse response = webResource.accept(formats).get(ClientResponse.class);
assertEquals(200, response.getStatus());
assertEquals("application/rdf+xml", response.getType().toString());
}
@Test
public void testAcceptNoQ2() {
WebResource webResource = resource().path(MockSearchServiceImpl.TEST_DOI);
webResource.addFilter(new LoggingFilter());
MediaType[] formats = buildAccept(new String[]{"fancy+pants", "rdf+xml", "unixref+xml", "x-datacite+xml"},null);
ClientResponse response = webResource.accept(formats).get(ClientResponse.class);
assertEquals(200, response.getStatus());
assertEquals("application/rdf+xml", response.getType().toString());
}
@Test
public void testDataCiteXML() {
WebResource webResource = resource().path(MockSearchServiceImpl.TEST_DOI);
webResource.addFilter(new LoggingFilter());
ClientResponse response = webResource.accept(Representation.APPLICATION_DATACITE_XML.asMediaType()).get(ClientResponse.class);
assertEquals(Representation.APPLICATION_DATACITE_XML.asMediaType(), response.getType());
assertArrayEquals(MockSearchServiceImpl.TEST_XML, response.getEntity(byte[].class));
}
@Test
public void testHtml() {
WebResource webResource = resource().path(MockSearchServiceImpl.TEST_DOI);
webResource.addFilter(new LoggingFilter());
String response = webResource.accept(MediaType.TEXT_HTML_TYPE).get(String.class);
assertTrue(response.contains("10.5072/1"));
}
@Test
public void testCustomMedia() throws Exception{
WebResource webResource = resource().path(MockSearchServiceImpl.TEST_DOI);
webResource.addFilter(new LoggingFilter());
webResource.setProperty(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, false);
ClientResponse response = webResource.accept(MockSearchServiceImpl.APPLICATION_PDF).get(ClientResponse.class);
assertEquals(303, response.getStatus());
assertEquals(MockSearchServiceImpl.HTTP_EXAMPLE_COM_A_PDF, response.getLocation());
}
}