package org.jboss.resteasy.test.providers.atom;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.resteasy.category.NotForForwardCompatibility;
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.plugins.providers.atom.Content;
import org.jboss.resteasy.plugins.providers.atom.Entry;
import org.jboss.resteasy.plugins.providers.atom.Person;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelArchived;
import org.jboss.resteasy.test.providers.atom.resource.AtomAssetMetadata;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelAtomAssetMetadataDecorators;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelAtomAssetMetadtaProcessor;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelCategories;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelCheckinComment;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelCreated;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelDisabled;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelEntryResource;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelFormat;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelNote;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelState;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelUuid;
import org.jboss.resteasy.test.providers.atom.resource.AtomComplexModelVersionNumber;
import org.jboss.resteasy.util.HttpResponseCodes;
import org.jboss.resteasy.utils.PortProviderUtil;
import org.jboss.resteasy.utils.TestUtil;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.DataOutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.util.Date;
import static junit.framework.TestCase.assertEquals;
import static org.junit.Assert.assertNotNull;
/**
* @tpSubChapter Atom provider
* @tpChapter Integration tests
* @tpTestCaseDetails Check complex model with Atom Provider
* @tpSince RESTEasy 3.0.16
*/
@RunWith(Arquillian.class)
@RunAsClient
public class AtomComplexModelTest {
static ResteasyClient client;
@Deployment
public static Archive<?> deploy() {
WebArchive war = TestUtil.prepareArchive(AtomComplexModelTest.class.getSimpleName());
war.addClasses(AtomComplexModelArchived.class,
AtomAssetMetadata.class,
AtomComplexModelAtomAssetMetadataDecorators.class,
AtomComplexModelAtomAssetMetadtaProcessor.class,
AtomComplexModelCategories.class,
AtomComplexModelCheckinComment.class,
AtomComplexModelCreated.class,
AtomComplexModelDisabled.class,
AtomComplexModelEntryResource.class,
AtomComplexModelFormat.class,
AtomComplexModelNote.class,
AtomComplexModelState.class,
AtomComplexModelUuid.class,
AtomComplexModelVersionNumber.class);
return TestUtil.finishContainerPrepare(war, null, AtomComplexModelEntryResource.class);
}
@Before
public void init() {
client = new ResteasyClientBuilder().build();
}
@After
public void after() throws Exception {
client.close();
}
private String generateURL(String path) {
return PortProviderUtil.generateURL(path, AtomComplexModelTest.class.getSimpleName());
}
/**
* @tpTestDetails Check complex type
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testComplexType() throws Exception {
URI baseUri = new URI("resteasy-test");
Entry entry = new Entry();
entry.setTitle("testtitle");
entry.setSummary("testdesc");
entry.setPublished(new Date());
entry.getAuthors().add(new Person("testperson"));
entry.setId(baseUri);
AtomAssetMetadata atomAssetMetadata = entry.getAnyOtherJAXBObject(AtomAssetMetadata.class);
if (atomAssetMetadata == null) {
atomAssetMetadata = new AtomAssetMetadata();
}
atomAssetMetadata.setArchived(false);
atomAssetMetadata.setUuid("testuuid");
atomAssetMetadata.setCategories(new String[]{"a", "b", "c"});
entry.setAnyOtherJAXBObject(atomAssetMetadata);
Content content = new Content();
content.setSrc(UriBuilder.fromUri(baseUri).path("binary").build());
content.setType(MediaType.APPLICATION_OCTET_STREAM_TYPE);
entry.setContent(content);
Class[] classes = new Class[]{AtomAssetMetadata.class, Entry.class};
JAXBContext jaxbContext = JAXBContext.newInstance(classes);
Marshaller marshaller = jaxbContext.createMarshaller();
Writer xmlWriter = new StringWriter();
marshaller.marshal(entry, xmlWriter);
String xmlOut = xmlWriter.toString();
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader xmlReader = new StringReader(xmlOut);
Entry newEntry = (Entry) unmarshaller.unmarshal(xmlReader);
atomAssetMetadata = newEntry.getAnyOtherJAXBObject(AtomAssetMetadata.class);
assertNotNull("Metadata of complex type is null", atomAssetMetadata);
assertNotNull("Categories from metadata is missing", atomAssetMetadata.getCategories());
}
/**
* @tpTestDetails Check new client
* @tpInfo Not for forward compatibility due to 3.1.0.Final, see the migration notes
* @tpSince RESTEasy 3.0.16
*/
@Test
@Category({NotForForwardCompatibility.class})
public void testNewClient() throws Exception {
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
"<entry xmlns=\"http://www.w3.org/2005/Atom\">" +
"<title>testCreatePackageFromAtom7</title>" +
"<summary>desc for testCreatePackageFromAtom</summary>" +
"<metadata xmlns=\"\"><categories><value>c1</value></categories> <note><value>meta</value> </note></metadata>" +
"</entry>";
{
URL url = new URL(generateURL("/entry"));
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Accept", MediaType.APPLICATION_ATOM_XML);
connection.setRequestProperty("Content-Type", MediaType.APPLICATION_ATOM_XML);
connection.setRequestProperty("Content-Length", Integer.toString(xml.getBytes().length));
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
//Send request
DataOutputStream wr = new DataOutputStream(
connection.getOutputStream());
wr.writeBytes(xml);
wr.flush();
wr.close();
assertEquals(HttpResponseCodes.SC_OK, connection.getResponseCode());
}
{
Response response = client.target(generateURL("/entry2")).request()
.header("Accept", MediaType.APPLICATION_ATOM_XML)
.header("Content-Type", MediaType.APPLICATION_ATOM_XML)
.get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
assertNotNull("Wrong content of response", response.readEntity(Entry.class).getAnyOtherJAXBObject(AtomAssetMetadata.class));
response.close();
}
{
URL url = new URL(generateURL("/entry3"));
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Accept", MediaType.APPLICATION_XML);
connection.setRequestProperty("Content-Type", MediaType.APPLICATION_XML);
connection.setRequestProperty("Content-Length", Integer.toString(xml.getBytes().length));
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
//Send request
DataOutputStream wr = new DataOutputStream(
connection.getOutputStream());
wr.writeBytes(xml);
wr.flush();
wr.close();
assertEquals(HttpResponseCodes.SC_OK, connection.getResponseCode());
}
{
Response response = client.target(generateURL("/entry4")).request()
.header("Accept", MediaType.APPLICATION_XML)
.header("Content-Type", MediaType.APPLICATION_XML)
.get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
assertNotNull("Wrong content of response", response.readEntity(Entry.class).getAnyOtherJAXBObject(AtomAssetMetadata.class));
response.close();
}
}
}