package org.neo4j.smack.routing;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import java.util.List;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import org.junit.Test;
import org.neo4j.smack.routing.annotation.DeserializeWith;
import org.neo4j.smack.routing.annotation.SerializeWith;
import org.neo4j.smack.routing.annotation.Transactional;
import org.neo4j.smack.serialization.strategy.NodeSerializationStrategy;
import org.neo4j.smack.serialization.strategy.PropertyContainerDeserializationStrategy;
public class TestAnnotationBasedRoutingDefinition {
@Test
public void shouldPickUpJaxRSVerbAnnotations() {
Object annotatedObject = new Object() {
@GET
@SuppressWarnings("unused")
public void a() { }
@POST
@SuppressWarnings("unused")
public void b() { }
@PUT
@SuppressWarnings("unused")
public void c() { }
@DELETE
@SuppressWarnings("unused")
public void d() { }
@HEAD
@SuppressWarnings("unused")
public void e() { }
};
AnnotationBasedRoutingDefinition rd = new AnnotationBasedRoutingDefinition(annotatedObject);
List<RouteDefinitionEntry> entries = rd.getRouteDefinitionEntries();
assertThat(entries.size(), is(5));
assertThat(entries.get(0).getPath(), is(""));
}
@Test
public void shouldPickupPathAnnotation() {
Object annotatedObject = new Object() {
@GET
@Path("/hello/world")
@SuppressWarnings("unused")
public void a() { }
};
AnnotationBasedRoutingDefinition rd = new AnnotationBasedRoutingDefinition(annotatedObject);
List<RouteDefinitionEntry> entries = rd.getRouteDefinitionEntries();
assertThat(entries.size(), is(1));
assertThat(entries.get(0).getPath(), is("/hello/world"));
}
@Test
public void shouldPickUpTransactionalAnnotation() {
Object transactionalAnnotatedObject = new Object() {
@PUT
@Path("/{tx_id}/state")
@Transactional
@SuppressWarnings("unused")
public void someRandomMethod() { }
};
Object notTransactionalAnnotatedObject = new Object() {
@PUT
@Path("/{tx_id}/state")
@SuppressWarnings("unused")
public void someRandomMethod() { }
};
AnnotationBasedRoutingDefinition transactionalDef = new AnnotationBasedRoutingDefinition(transactionalAnnotatedObject);
AnnotationBasedRoutingDefinition nonTransactionalDef = new AnnotationBasedRoutingDefinition(notTransactionalAnnotatedObject);
Endpoint transactional = transactionalDef.getRouteDefinitionEntries().get(0).getEndpoint();
Endpoint nontransactional = nonTransactionalDef.getRouteDefinitionEntries().get(0).getEndpoint();
assertThat(transactional.isTransactional(), is(true));
assertThat(nontransactional.isTransactional(), is(false));
}
@Test
public void shouldPickUpAppropriateSerializationAndDeserializationStrategies() {
Object annotatedObject = new Object() {
@GET
@Path("/hello/world")
@SuppressWarnings("unused")
@SerializeWith(NodeSerializationStrategy.class)
@DeserializeWith(PropertyContainerDeserializationStrategy.class)
public void a() { }
};
AnnotationBasedRoutingDefinition rd = new AnnotationBasedRoutingDefinition(annotatedObject);
RouteDefinitionEntry route = rd.getRouteDefinitionEntries().get(0);
assertThat(route.getEndpoint().getSerializationStrategy(), is(NodeSerializationStrategy.class));
assertThat(route.getEndpoint().getDeserializationStrategy(), is(PropertyContainerDeserializationStrategy.class));
}
}