package br.com.caelum.vraptor.restfulie.serialization;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.typeCompatibleWith;
import static org.junit.Assert.assertThat;
import br.com.caelum.vraptor.serialization.xstream.XStreamBuilderImpl;
import org.junit.Test;
import br.com.caelum.vraptor.restfulie.hypermedia.HypermediaResource;
import br.com.caelum.vraptor.restfulie.relation.RelationBuilder;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.converters.reflection.ReflectionConverter;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
public class RestfulSerializationTest {
class CustomType implements HypermediaResource{
public void configureRelations(RelationBuilder builder) {
}
}
@Test
public void shouldReturnAnXStreamInstanceWithSupportToLinkConvertersBasedOnReflection() {
RestfulSerialization serialization = new RestfulSerialization(null, null, null, null, null, XStreamBuilderImpl.cleanInstance());
XStream xstream = serialization.getXStream();
Converter converter = xstream.getConverterLookup().lookupConverterForType(CustomType.class);
assertThat(converter.getClass(), is(typeCompatibleWith(LinkConverter.class)));
}
class CustomNonHMType {
}
@Test
public void shouldUseTheDefaultConverterForTypesThatAreNotHypermediaAware() {
RestfulSerialization serialization = new RestfulSerialization(null, null, null, null, null, XStreamBuilderImpl.cleanInstance());
XStream xstream = serialization.getXStream();
Converter converter = xstream.getConverterLookup().lookupConverterForType(CustomNonHMType.class);
assertThat(converter.getClass(), is(typeCompatibleWith(ReflectionConverter.class)));
}
class MegaConverter implements Converter {
public void marshal(Object source, HierarchicalStreamWriter writer,
MarshallingContext context) {
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
return null;
}
public boolean canConvert(Class type) {
return true;
}
}
@Test
public void shouldAllowCustomXStreamRetrieval() {
RestfulSerialization serialization = new RestfulSerialization(null, null, null, null, null, XStreamBuilderImpl.cleanInstance()) {
@Override
protected XStream getXStream() {
XStream xStream = super.getXStream();
xStream.registerConverter(new MegaConverter());
return xStream;
}
};
XStream xstream = serialization.getXStream();
Converter converter = xstream.getConverterLookup().lookupConverterForType(CustomType.class);
assertThat(converter.getClass(), is(typeCompatibleWith(MegaConverter.class)));
converter = xstream.getConverterLookup().lookupConverterForType(CustomNonHMType.class);
assertThat(converter.getClass(), is(typeCompatibleWith(MegaConverter.class)));
}
}