/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.everrest; import org.eclipse.che.api.core.rest.ApiExceptionMapper; import org.eclipse.che.api.core.rest.DownloadFileResponseFilter; import org.everrest.core.ApplicationContext; import org.everrest.core.impl.ApplicationProviderBinder; import org.everrest.core.impl.ContainerRequest; import org.everrest.core.impl.ContainerResponse; import org.everrest.core.impl.EverrestConfiguration; import org.everrest.core.impl.EverrestProcessor; import org.everrest.core.impl.RequestDispatcher; import org.everrest.core.impl.RequestHandlerImpl; import org.everrest.core.impl.ResourceBinderImpl; import org.everrest.core.tools.DependencySupplierImpl; import org.everrest.core.tools.ResourceLauncher; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import javax.ws.rs.GET; import javax.ws.rs.HttpMethod; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import java.net.URI; import java.util.Arrays; import java.util.List; import static javax.ws.rs.core.MediaType.APPLICATION_JSON; import static javax.ws.rs.core.Response.Status.OK; import static org.everrest.core.ApplicationContext.anApplicationContext; import static org.testng.Assert.assertEquals; /** * Test the DownloadFileResponseFilter filter * @author Florent Benoit */ public class DownloadFileResponseFilterTest { /** * Base URI */ private static final String BASE_URI = "http://localhost/service"; /** * Base Service */ private static final String SERVICE_PATH = BASE_URI + "/myservice"; /** * Dummy JAX-RS POJO */ @Path("/myservice") public static class MyJaxRSService { @GET @Path("/list") @Produces(APPLICATION_JSON) public List<String> getMembers() { return Arrays.asList("a", "b", "c"); } @GET @Path("/single") @Produces(APPLICATION_JSON) public String getMember() { return "hello"; } @POST @Path("/modify") @Produces(APPLICATION_JSON) public Response myPostMethod() { return Response.ok("helloContent") .build(); } } /** * Resource Launcher */ private ResourceLauncher resourceLauncher; /** * Setup env for launching requests * @throws Exception */ @BeforeMethod public void before() throws Exception { //set up launcher final ResourceBinderImpl resources = new ResourceBinderImpl(); resources.addResource(MyJaxRSService.class, null); final DependencySupplierImpl dependencies = new DependencySupplierImpl(); final ApplicationProviderBinder providers = new ApplicationProviderBinder(); providers.addExceptionMapper(ApiExceptionMapper.class); providers.addResponseFilter(EverrestDownloadFileResponseFilter.class); final URI uri = new URI(BASE_URI); final ContainerRequest req = new ContainerRequest(null, uri, uri, null, null, null); final ApplicationContext context = anApplicationContext().withRequest(req).withProviders(providers).withDependencySupplier(dependencies).build(); ApplicationContext.setCurrent(context); final EverrestProcessor processor = new EverrestProcessor(new EverrestConfiguration(), dependencies, new RequestHandlerImpl(new RequestDispatcher(resources), providers), null); resourceLauncher = new ResourceLauncher(processor); } /** * Check if header is absent when parameter is empty */ @Test public void checkNoParameterTest() throws Exception { final ContainerResponse response = resourceLauncher.service(HttpMethod.GET, SERVICE_PATH + "/list", BASE_URI, null, null, null); assertEquals(response.getStatus(), OK.getStatusCode()); // check entity Assert.assertEquals(response.getEntity(), Arrays.asList("a", "b", "c")); // Check headers MultivaluedMap<String, Object> headerTags = response.getHttpHeaders(); Assert.assertNotNull(headerTags); Assert.assertEquals(headerTags.size(), 1); } /** * Check if header for downloading is added in response if we're also using a custom header */ @Test public void checkDownloadFileWithParameter() throws Exception { final ContainerResponse response = resourceLauncher .service(HttpMethod.GET, SERVICE_PATH + "/list?" + DownloadFileResponseFilter.QUERY_DOWNLOAD_PARAMETER + "=hello.json", BASE_URI, null, null, null); assertEquals(response.getStatus(), OK.getStatusCode()); // check entity Assert.assertEquals(response.getEntity(), Arrays.asList("a", "b", "c")); // headers = 2 Assert.assertEquals(response.getHttpHeaders().size(), 2); // Check custom header List<Object> headers = response.getHttpHeaders().get(HttpHeaders.CONTENT_DISPOSITION); Assert.assertNotNull(headers); Assert.assertEquals(headers.size(), 1); Assert.assertEquals(headers.get(0), "attachment; filename=hello.json"); } /** * Check that parameter is only handled if there is a GET method, not POST */ @Test public void checkOnlyOnGetMethodTest() throws Exception { final ContainerResponse response = resourceLauncher .service(HttpMethod.POST, SERVICE_PATH + "/modify?" + DownloadFileResponseFilter.QUERY_DOWNLOAD_PARAMETER + "=hello.json", BASE_URI, null, null, null); assertEquals(response.getStatus(), OK.getStatusCode()); // check entity Assert.assertEquals(response.getEntity(), "helloContent"); // headers = 2 Assert.assertEquals(response.getHttpHeaders().size(), 1); // Check custom header List<Object> headers = response.getHttpHeaders().get(HttpHeaders.CONTENT_DISPOSITION); Assert.assertNull(headers); } }