/* * Copyright (C) 2014 Stefan Niederhauser (nidin@gmx.ch) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package guru.nidi.ramltester; import guru.nidi.ramltester.jaxrs.CheckingWebTarget; import guru.nidi.ramltester.jaxrs.JaxrsContextRamlRequest; import guru.nidi.ramltester.jaxrs.JaxrsContextRamlResponse; import guru.nidi.ramltester.junit.ExpectedUsage; import guru.nidi.ramltester.model.RamlRequest; import guru.nidi.ramltester.model.RamlResponse; import guru.nidi.ramltester.util.ServerTest; import org.apache.catalina.Context; import org.apache.catalina.startup.Tomcat; import org.glassfish.jersey.client.JerseyClientBuilder; import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.client.*; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.List; import static guru.nidi.ramltester.util.TestUtils.valuesOf; import static org.hamcrest.CoreMatchers.startsWith; import static org.junit.Assert.*; /** * */ @RunWith(Parameterized.class) public class JaxrsTest extends ServerTest { private static final RamlDefinition raml = RamlLoaders.fromClasspath(JaxrsTest.class).load("jaxrs.raml"); private final Client client; private static final MultiReportAggregator aggregator = new MultiReportAggregator(); @ClassRule public static final ExpectedUsage expectedUsage = new ExpectedUsage(aggregator.usageProvider(raml)); public JaxrsTest(Client client) { this.client = client; } @Parameterized.Parameters(name = "{0}") public static List<Client> clients() { return Arrays.asList( JerseyClientBuilder.createClient(), new ResteasyClientBuilder().build()); } @Test public void model() { final RamlRequest[] request = new RamlRequest[1]; final RamlResponse[] response = new RamlResponse[1]; final CheckingWebTarget checking = raml.createWebTarget(client.target(baseUrlWithPort())).aggregating(aggregator); checking.register(new ClientResponseFilter() { @Override public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { request[0] = new JaxrsContextRamlRequest(requestContext); response[0] = new JaxrsContextRamlResponse(responseContext); } }); final Invocation invocation = checking.path("/app/path").queryParam("qp", "true") .request().header("h", "h2") .buildPost(Entity.entity("data", "text/plain")); final String s = invocation.invoke(String.class); assertEquals("\"json string\"", s); assertEquals("POST", request[0].getMethod()); assertEquals(valuesOf("qp", "true"), request[0].getQueryValues()); assertEquals(Arrays.asList("h2"), request[0].getHeaderValues().get("h")); assertEquals(url("app/path"), request[0].getRequestUrl(null, false)); assertEquals("text/plain", request[0].getContentType()); assertArrayEquals("data".getBytes(), request[0].getContent()); assertEquals(200, response[0].getStatus()); assertEquals(Arrays.asList("true"), response[0].getHeaderValues().get("res")); assertThat(response[0].getContentType(), startsWith("application/json")); assertArrayEquals("\"json string\"".getBytes(), response[0].getContent()); } @Test public void client() { final CheckingWebTarget checking = raml.createWebTarget(client.target(baseUrlWithPort())); checking.path("/app/path").queryParam("qp", "true") .request().header("h", "h2") .post(Entity.entity("data", "text/plain")); assertTrue(checking.getLastReport().isEmpty()); } @Override protected void init(Context ctx) { Tomcat.addServlet(ctx, "app", new TestServlet()); ctx.addServletMapping("/app/path/*", "app"); } private static class TestServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { assertEquals("d".getBytes()[0], req.getInputStream().read()); resp.setContentType("application/json"); resp.setHeader("res", "true"); final PrintWriter out = resp.getWriter(); out.write(req.getParameter("param") == null ? "\"json string\"" : "illegal json"); out.flush(); } } }