| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 org.apache.wink.common.model.wadl; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNull; |
| import static org.junit.Assert.assertTrue; |
| |
| import java.util.Collections; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Set; |
| |
| import javax.ws.rs.Consumes; |
| import javax.ws.rs.GET; |
| import javax.ws.rs.HeaderParam; |
| import javax.ws.rs.HttpMethod; |
| import javax.ws.rs.POST; |
| import javax.ws.rs.Path; |
| import javax.ws.rs.PathParam; |
| import javax.ws.rs.QueryParam; |
| import javax.ws.rs.core.MediaType; |
| import javax.xml.bind.JAXBContext; |
| import javax.xml.bind.JAXBException; |
| import javax.xml.bind.Marshaller; |
| |
| import org.apache.wink.common.internal.registry.metadata.ClassMetadata; |
| import org.apache.wink.common.internal.registry.metadata.MethodMetadata; |
| import org.jmock.Expectations; |
| import org.jmock.Mockery; |
| import org.jmock.lib.legacy.ClassImposteriser; |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| public class WADLGeneratorTest { |
| |
| @Test |
| public void testInit() throws Exception { |
| new WADLGenerator(); |
| } |
| |
| private void marshalIt(Application app) throws JAXBException { |
| Marshaller marshaller = JAXBContext.newInstance(ObjectFactory.class).createMarshaller(); |
| marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); |
| marshaller.marshal(app, System.out); |
| } |
| |
| @Test |
| public void testGenerateEmptyApp() throws Exception { |
| WADLGenerator generator = new WADLGenerator(); |
| Application app = generator.generate(null, null); |
| Assert.assertNotNull(app); |
| |
| Assert.assertEquals(0, app.getAny().size()); |
| Assert.assertEquals(0, app.getDoc().size()); |
| Assert.assertEquals(0, app.getResources().size()); |
| Assert.assertEquals(0, app.getResourceTypeOrMethodOrRepresentation().size()); |
| Assert.assertNull(app.getGrammars()); |
| } |
| |
| @Path("resource1/{pp}") |
| @Consumes(value = {MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN}) |
| @WADLDoc(value = "this is resource1 title", content = "this is resource1 content") |
| static class Resource1 { |
| |
| @GET |
| @WADLDoc("this is the hello method with only default title value and no content") |
| public String hello(@WADLDoc("request doc") String abcd, |
| @WADLDoc("q2 parameter doc") @QueryParam("q2") String q, |
| @QueryParam("q3") int q2, |
| @HeaderParam("h1234") String h1, |
| @PathParam("pp") String somePath) { |
| return null; |
| } |
| |
| } |
| |
| @Path("resource2") |
| static class Resource2 { |
| @GET |
| public String world() { |
| return null; |
| } |
| |
| @POST |
| public String post() { |
| return null; |
| } |
| } |
| |
| @Path("resourcePath") |
| static class ResourceNoMethods { |
| } |
| |
| static class NotAResourceWithPath { |
| @GET |
| public String world() { |
| return null; |
| } |
| } |
| |
| static class BasicResourceWithVoidReturn { |
| |
| @GET |
| public void basicReturn() { |
| |
| } |
| } |
| |
| @Path("some/path/{id}") |
| static interface MyInterface { |
| |
| @GET |
| public void somePath(@PathParam("id") String someId); |
| } |
| |
| @Test |
| public void testBuildClassMetadataResource1() { |
| WADLGenerator generator = new WADLGenerator(); |
| Set<Class<?>> classes = new HashSet<Class<?>>(); |
| classes.add(Resource1.class); |
| Set<ClassMetadata> metadataSet = generator.buildClassMetdata(classes); |
| Assert.assertEquals(1, metadataSet.size()); |
| |
| ClassMetadata metadata = metadataSet.iterator().next(); |
| assertEquals(Resource1.class.getAnnotation(Path.class).value(), metadata.getPath()); |
| |
| List<MethodMetadata> methodMetadata = metadata.getResourceMethods(); |
| assertEquals(1, methodMetadata.size()); |
| assertEquals(HttpMethod.GET, methodMetadata.get(0).getHttpMethod()); |
| } |
| |
| @Test |
| public void testBuildClassMetadataResource2() { |
| WADLGenerator generator = new WADLGenerator(); |
| Set<Class<?>> classes = new HashSet<Class<?>>(); |
| classes.add(Resource2.class); |
| Set<ClassMetadata> metadataSet = generator.buildClassMetdata(classes); |
| Assert.assertEquals(1, metadataSet.size()); |
| |
| ClassMetadata metadata = metadataSet.iterator().next(); |
| assertEquals(Resource2.class.getAnnotation(Path.class).value(), metadata.getPath()); |
| |
| List<MethodMetadata> methodMetadata = metadata.getResourceMethods(); |
| assertEquals(2, methodMetadata.size()); |
| assertEquals(HttpMethod.GET, methodMetadata.get(0).getHttpMethod()); |
| assertEquals(HttpMethod.POST, methodMetadata.get(1).getHttpMethod()); |
| } |
| |
| @Test |
| public void testBuildClassMetadata2Resources() { |
| WADLGenerator generator = new WADLGenerator(); |
| Set<Class<?>> classes = new HashSet<Class<?>>(); |
| classes.add(Resource1.class); |
| classes.add(Resource2.class); |
| Set<ClassMetadata> metadataSet = generator.buildClassMetdata(classes); |
| Assert.assertEquals(2, metadataSet.size()); |
| } |
| |
| @Test |
| public void testBuildClassMetadataNoResources() { |
| WADLGenerator generator = new WADLGenerator(); |
| Set<Class<?>> classes = new HashSet<Class<?>>(); |
| Set<ClassMetadata> metadataSet = generator.buildClassMetdata(classes); |
| Assert.assertEquals(0, metadataSet.size()); |
| |
| classes.add(NotAResourceWithPath.class); |
| metadataSet = generator.buildClassMetdata(classes); |
| Assert.assertEquals(0, metadataSet.size()); |
| } |
| |
| @Test |
| public void testBuildResourceWithNoMethodsWithMock() throws Exception { |
| WADLGenerator generator = new WADLGenerator(); |
| Mockery mockContext = new Mockery() { |
| { |
| setImposteriser(ClassImposteriser.INSTANCE); |
| } |
| }; |
| |
| final ClassMetadata metadata = mockContext.mock(ClassMetadata.class); |
| |
| mockContext.checking(new Expectations() { |
| { |
| oneOf(metadata).getResourceClass(); |
| will(returnValue(null)); |
| |
| oneOf(metadata).getPath(); |
| will(returnValue("myPath")); |
| |
| oneOf(metadata).getResourceMethods(); |
| will(returnValue(null)); |
| |
| oneOf(metadata).getInjectableFields(); |
| will(returnValue(null)); |
| |
| oneOf(metadata).getSubResourceMethods(); |
| will(returnValue(null)); |
| |
| oneOf(metadata).getSubResourceLocators(); |
| will(returnValue(null)); |
| } |
| }); |
| |
| Resource actualRes = generator.buildResource(metadata); |
| assertNull(actualRes.getId()); |
| assertEquals(MediaType.APPLICATION_FORM_URLENCODED, actualRes.getQueryType()); |
| assertEquals(0, actualRes.getType().size()); |
| assertEquals(0, actualRes.getDoc().size()); |
| assertEquals("myPath", actualRes.getPath()); |
| assertEquals(0, actualRes.getParam().size()); |
| assertEquals(0, actualRes.getMethodOrResource().size()); |
| |
| mockContext.assertIsSatisfied(); |
| } |
| |
| @Test |
| public void testBuildResourceWithMock() throws Exception { |
| WADLGenerator generator = new WADLGenerator(); |
| Mockery mockContext = new Mockery() { |
| { |
| setImposteriser(ClassImposteriser.INSTANCE); |
| } |
| }; |
| |
| final ClassMetadata metadata = mockContext.mock(ClassMetadata.class); |
| final MethodMetadata methodMeta = mockContext.mock(MethodMetadata.class); |
| final java.lang.reflect.Method method = |
| BasicResourceWithVoidReturn.class.getMethod("basicReturn"); |
| |
| mockContext.checking(new Expectations() { |
| { |
| oneOf(metadata).getResourceClass(); |
| will(returnValue(BasicResourceWithVoidReturn.class)); |
| |
| oneOf(metadata).getPath(); |
| will(returnValue("myResourcePath")); |
| |
| oneOf(metadata).getResourceMethods(); |
| will(returnValue(Collections.singletonList(methodMeta))); |
| |
| oneOf(methodMeta).getHttpMethod(); |
| will(returnValue(HttpMethod.GET)); |
| |
| oneOf(methodMeta).getFormalParameters(); |
| will(returnValue(Collections.emptyList())); |
| |
| oneOf(methodMeta).getProduces(); |
| will(returnValue(Collections.emptySet())); |
| |
| exactly(2).of(methodMeta).getReflectionMethod(); |
| will(returnValue(method)); |
| |
| oneOf(methodMeta).getFormalParameters(); |
| will(returnValue(null)); |
| |
| oneOf(metadata).getInjectableFields(); |
| will(returnValue(null)); |
| |
| oneOf(metadata).getSubResourceMethods(); |
| will(returnValue(null)); |
| |
| oneOf(metadata).getSubResourceLocators(); |
| will(returnValue(null)); |
| } |
| }); |
| |
| Resource actualRes = generator.buildResource(metadata); |
| assertNull(actualRes.getId()); |
| assertEquals(MediaType.APPLICATION_FORM_URLENCODED, actualRes.getQueryType()); |
| assertEquals(0, actualRes.getType().size()); |
| assertEquals(0, actualRes.getDoc().size()); |
| assertEquals("myResourcePath", actualRes.getPath()); |
| assertEquals(0, actualRes.getParam().size()); |
| |
| /* method */ |
| assertEquals(1, actualRes.getMethodOrResource().size()); |
| Method m = ((Method)actualRes.getMethodOrResource().get(0)); |
| assertEquals(HttpMethod.GET, m.getName()); |
| assertNull(m.getId()); |
| assertEquals(0, m.getDoc().size()); |
| assertNull(m.getHref()); |
| assertNull(m.getRequest()); |
| assertEquals(1, m.getResponse().size()); |
| List<Response> resps = m.getResponse(); |
| assertEquals(Collections.singletonList(Long.valueOf(204)), resps.get(0).getStatus()); |
| assertEquals(0, resps.get(0).getAny().size()); |
| assertEquals(0, resps.get(0).getDoc().size()); |
| assertEquals(0, resps.get(0).getOtherAttributes().size()); |
| assertEquals(0, resps.get(0).getParam().size()); |
| |
| mockContext.assertIsSatisfied(); |
| } |
| |
| @Test |
| public void testBuildBasicMethodMetadataWithMock() throws Exception { |
| WADLGenerator generator = new WADLGenerator(); |
| Mockery mockContext = new Mockery() { |
| { |
| setImposteriser(ClassImposteriser.INSTANCE); |
| } |
| }; |
| final MethodMetadata metadata = mockContext.mock(MethodMetadata.class); |
| final ClassMetadata classMeta = mockContext.mock(ClassMetadata.class); |
| final java.lang.reflect.Method method = |
| BasicResourceWithVoidReturn.class.getMethod("basicReturn"); |
| |
| mockContext.checking(new Expectations() { |
| { |
| oneOf(metadata).getHttpMethod(); |
| will(returnValue("myHttpMethod")); |
| |
| oneOf(metadata).getFormalParameters(); |
| will(returnValue(null)); |
| |
| oneOf(metadata).getProduces(); |
| will(returnValue(Collections.emptySet())); |
| |
| exactly(2).of(metadata).getReflectionMethod(); |
| will(returnValue(method)); |
| } |
| }); |
| |
| Method m = generator.buildMethod(classMeta, metadata); |
| assertEquals("myHttpMethod", m.getName()); |
| assertEquals(0, m.getDoc().size()); |
| assertEquals(0, m.getAny().size()); |
| assertNull(m.getHref()); |
| assertNull(m.getId()); |
| assertNull(m.getRequest()); |
| assertEquals(1, m.getResponse().size()); |
| List<Response> resps = m.getResponse(); |
| assertEquals(Collections.singletonList(Long.valueOf(204)), resps.get(0).getStatus()); |
| assertEquals(0, resps.get(0).getAny().size()); |
| assertEquals(0, resps.get(0).getDoc().size()); |
| assertEquals(0, resps.get(0).getOtherAttributes().size()); |
| assertEquals(0, resps.get(0).getParam().size()); |
| |
| mockContext.assertIsSatisfied(); |
| } |
| |
| @Test |
| public void testBuildBasicRequestWithMock() { |
| WADLGenerator generator = new WADLGenerator(); |
| Mockery mockContext = new Mockery() { |
| { |
| setImposteriser(ClassImposteriser.INSTANCE); |
| } |
| }; |
| final MethodMetadata metadata = mockContext.mock(MethodMetadata.class); |
| final ClassMetadata classMeta = mockContext.mock(ClassMetadata.class); |
| |
| mockContext.checking(new Expectations() { |
| { |
| oneOf(metadata).getFormalParameters(); |
| will(returnValue(null)); |
| } |
| }); |
| |
| Request r = generator.buildRequest(classMeta, metadata); |
| /* |
| * should be null otherwise a no-value request element might be added |
| */ |
| assertNull(r); |
| mockContext.assertIsSatisfied(); |
| } |
| |
| @Test |
| public void testGenerate1Resource() throws Exception { |
| WADLGenerator generator = new WADLGenerator(); |
| Set<Class<?>> classes = new HashSet<Class<?>>(); |
| classes.add(Resource1.class); |
| classes.add(Resource2.class); |
| classes.add(MyInterface.class); |
| Application app = generator.generate("", classes); |
| Assert.assertNotNull(app); |
| marshalIt(app); |
| } |
| |
| @Test |
| public void testWADLDocResource1() throws Exception { |
| WADLGenerator generator = new WADLGenerator(); |
| Set<Class<?>> classes = new HashSet<Class<?>>(); |
| classes.add(Resource1.class); |
| Application app = generator.generate("", classes); |
| Resource res = app.getResources().get(0).getResource().get(0); |
| assertEquals(1, res.getDoc().size()); |
| assertEquals("this is resource1 title", res.getDoc().get(0).getTitle()); |
| assertEquals(res.getDoc().get(0).getContent().size(), 1); |
| assertEquals("this is resource1 content", res.getDoc().get(0).getContent().get(0)); |
| Method m = (Method)res.getMethodOrResource().get(0); |
| assertEquals(1, m.getDoc().size()); |
| assertEquals("this is the hello method with only default title value and no content", m.getDoc().get(0) |
| .getTitle()); |
| assertEquals(0, m.getDoc().get(0).getContent().size()); |
| |
| assertEquals(1, m.getRequest().getDoc().size()); |
| assertEquals("request doc", m.getRequest().getDoc().get(0).getTitle()); |
| |
| boolean isFound = false; |
| List<Param> params = m.getRequest().getParam(); |
| for (Param p : params) { |
| if (p.getName().equals("q2")) { |
| isFound = true; |
| assertEquals(1, p.getDoc().size()); |
| assertEquals("q2 parameter doc", p.getDoc().get(0).getTitle()); |
| } else { |
| assertEquals(0, p.getDoc().size()); |
| } |
| } |
| assertTrue(isFound); |
| } |
| } |