package org.jboss.resteasy.test.interception;
import org.jboss.resteasy.annotations.Decorator;
import org.jboss.resteasy.core.interception.DecoratorMatcher;
import org.jboss.resteasy.spi.interception.DecoratorProcessor;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* @tpSubChapter Interception tests
* @tpChapter Unit tests
* @tpTestCaseDetails Test for org.jboss.resteasy.annotations.Decorator class.
* @tpSince RESTEasy 3.0.16
*/
public class DecoratorMatcherTest {
private static final AtomicBoolean called = new AtomicBoolean(false);
private JAXBContext jaxbContext;
private DecoratorMatcher decoratorMatcher;
@Before
public void init() throws JAXBException {
called.set(false);
jaxbContext = JAXBContext.newInstance(AnObject.class);
decoratorMatcher = new DecoratorMatcher();
}
/**
* @tpTestDetails Decorator method should not be called in this test.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void shouldNotThrowOnUnmarshaller() throws JAXBException {
decoratorMatcher.decorate(Unmarshaller.class, jaxbContext.createUnmarshaller(), AnObject.class, new Annotation[0], MediaType.APPLICATION_XML_TYPE);
Assert.assertFalse("Decorate method was called", called.get());
}
/**
* @tpTestDetails Decorator method should be called in this test.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void shouldCallOnMarshaller() throws JAXBException {
decoratorMatcher.decorate(Marshaller.class, jaxbContext.createMarshaller(), AnObject.class, new Annotation[0], MediaType.APPLICATION_XML_TYPE);
Assert.assertTrue("Decorate method was not called", called.get());
}
@Retention(RetentionPolicy.RUNTIME)
@Decorator(processor = MarshallerDecorator.Processor.class, target = Marshaller.class)
public static @interface MarshallerDecorator {
class Processor implements DecoratorProcessor<Marshaller, MarshallerDecorator> {
@Override
public Marshaller decorate(Marshaller target, MarshallerDecorator annotation, Class type, Annotation[] annotations, MediaType mediaType) {
called.set(true);
return target;
}
}
}
@MarshallerDecorator
@XmlRootElement
public static class AnObject {
private String something;
}
}