package com.temenos.interaction.example.mashup.streaming;
/*
* #%L
* interaction-example-mashup-streaming
* %%
* Copyright (C) 2012 - 2013 Temenos Holdings N.V.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.List;
import javax.ws.rs.core.Response;
import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.UniformInterfaceException;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.multipart.FormDataBodyPart;
import com.sun.jersey.multipart.FormDataMultiPart;
import com.sun.jersey.test.framework.JerseyTest;
import com.temenos.interaction.media.hal.MediaType;
import com.theoryinpractise.halbuilder.api.Link;
import com.theoryinpractise.halbuilder.api.ReadableRepresentation;
import com.theoryinpractise.halbuilder.api.RepresentationFactory;
import com.theoryinpractise.halbuilder.standard.StandardRepresentationFactory;
/**
* This test ensures that we can navigate from one application state
* to another using hypermedia (links).
*
* @author aphethean
*/
public class HypermediaITCase extends JerseyTest {
public HypermediaITCase() throws Exception {
super();
}
@Before
public void initTest() {
// -DTEST_ENDPOINT_URI={someurl} to test with external server
webResource = Client.create().resource(ConfigurationHelper.getTestEndpointUri(Configuration.TEST_ENDPOINT_URI));
}
@After
public void tearDown() {}
@Test
public void testGetEntryPointLinks() {
ClientResponse response = webResource.path("/").accept(MediaType.APPLICATION_HAL_JSON).get(ClientResponse.class);
assertEquals(Response.Status.Family.SUCCESSFUL, Response.Status.fromStatusCode(response.getStatus()).getFamily());
RepresentationFactory representationFactory = new StandardRepresentationFactory();
ReadableRepresentation resource = representationFactory.readRepresentation(MediaType.APPLICATION_HAL_JSON.toString(),new InputStreamReader(response.getEntityInputStream()));
List<Link> links = resource.getLinks();
assertEquals(2, links.size());
for (Link link : links) {
if (link.getRel().equals("self")) {
assertEquals(Configuration.TEST_ENDPOINT_URI + "/", link.getHref());
} else if (link.getName().equals("HOME.home>GET>Profile.profile")) {
assertEquals(Configuration.TEST_ENDPOINT_URI + "/profile", link.getHref());
} else {
fail("unexpected link [" + link.getName() + "]");
}
}
}
@Test
public void testFollowRelsToProfileImage() throws IOException, UniformInterfaceException, URISyntaxException {
RepresentationFactory representationFactory = new StandardRepresentationFactory();
ClientResponse response = webResource.path("/").accept(MediaType.APPLICATION_HAL_JSON).get(ClientResponse.class);
assertEquals(Response.Status.Family.SUCCESSFUL, Response.Status.fromStatusCode(response.getStatus()).getFamily());
ReadableRepresentation homeResource = representationFactory.readRepresentation(MediaType.APPLICATION_HAL_JSON.toString(),new InputStreamReader(response.getEntityInputStream()));
Link profileLink = homeResource.getLinkByRel("http://relations.rimdsl.org/profile");
assertNotNull(profileLink);
response.close();
ClientResponse profileResponse = webResource.uri(new URI(profileLink.getHref())).accept(MediaType.APPLICATION_HAL_JSON).get(ClientResponse.class);
assertEquals(Response.Status.Family.SUCCESSFUL, Response.Status.fromStatusCode(profileResponse.getStatus()).getFamily());
ReadableRepresentation profileResource = representationFactory.readRepresentation(MediaType.APPLICATION_HAL_JSON.toString(),new InputStreamReader(profileResponse.getEntityInputStream()));
assertEquals("someone@somewhere.com", profileResource.getProperties().get("email"));
Link profileImageLink = profileResource.getLinkByRel("http://relations.rimdsl.org/image");
assertNotNull(profileImageLink);
profileResponse.close();
ClientResponse profileImageResponse = webResource.uri(new URI(profileImageLink.getHref())).get(ClientResponse.class);
assertEquals(Response.Status.Family.SUCCESSFUL, Response.Status.fromStatusCode(profileImageResponse.getStatus()).getFamily());
InputStream imageStream = profileImageResponse.getEntityInputStream();
FileOutputStream fos = new FileOutputStream("./testimg.jpg");
try {
IOUtils.copy(imageStream, fos);
} finally {
IOUtils.closeQuietly(imageStream);
}
fos.flush();
fos.close();
// check image received correctly
assertEquals("image/jpeg", profileImageResponse.getHeaders().getFirst("Content-Type"));
long originalFileSize;
InputStream stream = null;
try {
URL url = this.getClass().getResource("/testimg.jpg");
stream = url.openStream();
originalFileSize = stream.available();
} finally {
IOUtils.closeQuietly(stream);
}
File receivedImage = new File("./testimg.jpg");
assertEquals(originalFileSize, receivedImage.length());
profileImageResponse.close();
}
@Test
public void testUploadImage() throws IOException, UniformInterfaceException, URISyntaxException {
String filename = "pdf-sample.pdf";
File uploadedFile = new File(System.getProperty("java.io.tmpdir"), filename);
if(uploadedFile.exists()) {
if(!uploadedFile.delete()) {
throw new IOException("Failed to delete existing uploaded file");
}
}
RepresentationFactory representationFactory = new StandardRepresentationFactory();
ClientResponse response = webResource.path("/").accept(MediaType.APPLICATION_HAL_JSON).get(ClientResponse.class);
assertEquals(Response.Status.Family.SUCCESSFUL, Response.Status.fromStatusCode(response.getStatus()).getFamily());
ReadableRepresentation homeResource = representationFactory.readRepresentation(MediaType.APPLICATION_HAL_JSON.toString(),new InputStreamReader(response.getEntityInputStream()));
Link profileLink = homeResource.getLinkByRel("http://relations.rimdsl.org/profile");
assertNotNull(profileLink);
response.close();
ClientResponse profileResponse = webResource.uri(new URI(profileLink.getHref())).accept(MediaType.APPLICATION_HAL_JSON).get(ClientResponse.class);
assertEquals(Response.Status.Family.SUCCESSFUL, Response.Status.fromStatusCode(profileResponse.getStatus()).getFamily());
ReadableRepresentation profileResource = representationFactory.readRepresentation(MediaType.APPLICATION_HAL_JSON.toString(),new InputStreamReader(profileResponse.getEntityInputStream()));
assertEquals("someone@somewhere.com", profileResource.getProperties().get("email"));
Link profileImageUploadLink = profileResource.getLinkByRel("http://relations.rimdsl.org/imageUpload");
assertNotNull(profileImageUploadLink);
profileResponse.close();
WebResource profileImageUpload = webResource.uri(new URI(profileImageUploadLink.getHref() + "?filename=" + filename));
FormDataMultiPart form = new FormDataMultiPart();
form.field("file", filename);
File dir = new File("src/test/resources");
File srcFile = new File(dir, filename);
InputStream content = new FileInputStream(srcFile);
FormDataBodyPart fdp = new FormDataBodyPart("content", content, javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM_TYPE);
form.bodyPart(fdp);
response = profileImageUpload.type(javax.ws.rs.core.MediaType.MULTIPART_FORM_DATA_TYPE).accept(MediaType.APPLICATION_HAL_JSON).put(ClientResponse.class, form);
content.close();
assertEquals(200, response.getStatus());
assertNotNull(uploadedFile);
assertEquals(srcFile.length(), uploadedFile.length());
}
}