/*
* Copyright 2016 Christoph Böhme
*
* 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 org.culturegraph.mf.javaintegration.pojo;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verifyZeroInteractions;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.culturegraph.mf.framework.StreamReceiver;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
/**
* Tests for class {@link PojoDecoder}.
*
* @author Thomas Seidel
* @author Christoph Böhme (refactored to Mockito)
*
*/
public class PojoDecoderTest {
@Mock
private StreamReceiver receiver;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void shouldDecodeNullObject() {
final PojoDecoder<Object> pojoDecoder = new PojoDecoder<>();
pojoDecoder.setReceiver(receiver);
pojoDecoder.process(null);
verifyZeroInteractions(receiver);
}
@Test
public void shouldDecodeEmptyPojo() {
final PojoDecoder<EmptyPojo> pojoDecoder = new PojoDecoder<>();
pojoDecoder.setReceiver(receiver);
pojoDecoder.process(new EmptyPojo());
final InOrder ordered = inOrder(receiver);
ordered.verify(receiver).startRecord("");
ordered.verify(receiver).endRecord();
}
@Test
public void shouldDecodeSimplePojo() {
final PojoDecoder<SimplePojo> pojoDecoder = new PojoDecoder<>();
pojoDecoder.setReceiver(receiver);
final SimplePojo simplePojo = new SimplePojo();
simplePojo.setFirstField("value1");
simplePojo.secondField = "value2";
pojoDecoder.process(simplePojo);
final InOrder ordered = inOrder(receiver);
ordered.verify(receiver).startRecord("");
ordered.verify(receiver).literal("secondField", "value2");
ordered.verify(receiver).literal("firstField", "value1");
ordered.verify(receiver).endRecord();
}
@Test
public void shouldDecodeNestedPojo() {
final PojoDecoder<NestedPojo> pojoDecoder = new PojoDecoder<>();
pojoDecoder.setReceiver(receiver);
final SimplePojo simplePojo = new SimplePojo();
simplePojo.setFirstField("value1");
simplePojo.secondField = "value2";
final NestedPojo nestedPojo = new NestedPojo();
nestedPojo.setInnerPojo(simplePojo);
pojoDecoder.process(nestedPojo);
final InOrder ordered = inOrder(receiver);
ordered.verify(receiver).startRecord("");
ordered.verify(receiver).startEntity("innerPojo");
ordered.verify(receiver).literal("secondField", "value2");
ordered.verify(receiver).literal("firstField", "value1");
ordered.verify(receiver).endEntity();
ordered.verify(receiver).endRecord();
}
@Test
public void shouldDecodePojoWithMetafactureSource() {
final PojoDecoder<MetafactureSourcePojo> pojoDecoder = new PojoDecoder<>();
pojoDecoder.setReceiver(receiver);
final MetafactureSourcePojo mfSourcePojo = new MetafactureSourcePojo();
mfSourcePojo.setMetafactureSourceField(
streamReceiver -> streamReceiver.literal("literal", "value"));
pojoDecoder.process(mfSourcePojo);
final InOrder ordered = inOrder(receiver);
ordered.verify(receiver).startRecord("");
ordered.verify(receiver).startEntity("metafactureSourceField");
ordered.verify(receiver).literal("literal", "value");
ordered.verify(receiver).endEntity();
ordered.verify(receiver).endRecord();
}
@Test
public void shouldDecodeSimpleArrayPojo() {
final PojoDecoder<SimpleArrayPojo> pojoDecoder = new PojoDecoder<>();
pojoDecoder.setReceiver(receiver);
final String[] valueArray = { "array-value1", "array-value2"};
final SimpleArrayPojo simpleArrayPojo = new SimpleArrayPojo();
simpleArrayPojo.setArrayField(valueArray);
pojoDecoder.process(simpleArrayPojo);
final InOrder ordered = inOrder(receiver);
ordered.verify(receiver).startRecord("");
ordered.verify(receiver).literal("arrayField", "array-value1");
ordered.verify(receiver).literal("arrayField", "array-value2");
ordered.verify(receiver).endRecord();
}
@Test
public void shouldDecodeSimpleListPojo() {
final PojoDecoder<SimpleListPojo> pojoDecoder = new PojoDecoder<>();
pojoDecoder.setReceiver(receiver);
final List<String> valueList = Arrays.asList("list-value1", "list-value2");
final SimpleListPojo simpleListPojo = new SimpleListPojo();
simpleListPojo.setListField(valueList);
pojoDecoder.process(simpleListPojo);
final InOrder ordered = inOrder(receiver);
ordered.verify(receiver).startRecord("");
ordered.verify(receiver).literal("listField", "list-value1");
ordered.verify(receiver).literal("listField", "list-value2");
ordered.verify(receiver).endRecord();
}
@Test
public void shouldDecodeSimpleSetPojo() {
final PojoDecoder<SimpleSetPojo> pojoDecoder = new PojoDecoder<>();
pojoDecoder.setReceiver(receiver);
final Set<String> valueSet = new HashSet<>(Arrays.asList(
"set-value1", "set-value2"));
final SimpleSetPojo simpleSetPojo = new SimpleSetPojo();
simpleSetPojo.setSetField(valueSet);
pojoDecoder.process(simpleSetPojo);
final InOrder ordered = inOrder(receiver);
ordered.verify(receiver).startRecord("");
ordered.verify(receiver).literal("setField", "set-value1");
ordered.verify(receiver).literal("setField", "set-value2");
ordered.verify(receiver).endRecord();
}
@Test
public void shouldDecodeSimpleMapPojo() {
final PojoDecoder<SimpleMapPojo> pojoDecoder = new PojoDecoder<>();
pojoDecoder.setReceiver(receiver);
final Map<String, String> mapField = new HashMap<>();
mapField.put("key1", "value1");
mapField.put("key2", "value2");
final SimpleMapPojo simpleMapPojo = new SimpleMapPojo();
simpleMapPojo.setMapField(mapField);
pojoDecoder.process(simpleMapPojo);
final ArgumentCaptor<String> nameCaptor =
ArgumentCaptor.forClass(String.class);
final ArgumentCaptor<String> valueCaptor =
ArgumentCaptor.forClass(String.class);
final InOrder ordered = inOrder(receiver);
ordered.verify(receiver).startRecord("");
ordered.verify(receiver).startEntity("mapField");
ordered.verify(receiver, times(2)).literal(
nameCaptor.capture(), valueCaptor.capture());
assertEquals(mapField.get(nameCaptor.getAllValues().get(0)),
valueCaptor.getAllValues().get(0));
assertEquals(mapField.get(nameCaptor.getAllValues().get(1)),
valueCaptor.getAllValues().get(1));
ordered.verify(receiver).endEntity();
ordered.verify(receiver).endRecord();
}
private static class EmptyPojo {
}
private static class SimplePojo {
private String firstField;
public String secondField;
public String getFirstField() {
return firstField;
}
public void setFirstField(final String firstField) {
this.firstField = firstField;
}
}
private static class NestedPojo {
private SimplePojo innerPojo;
public SimplePojo getInnerPojo() {
return innerPojo;
}
public final void setInnerPojo(final SimplePojo innerPojo) {
this.innerPojo = innerPojo;
}
}
private static class MetafactureSourcePojo {
private MetafactureSource metafactureSourceField;
public MetafactureSource getMetafactureSourceField() {
return metafactureSourceField;
}
public void setMetafactureSourceField(
final MetafactureSource metafactureSourceField) {
this.metafactureSourceField = metafactureSourceField;
}
}
private static class SimpleArrayPojo {
private String[] arrayField;
public String[] getArrayField() {
return arrayField;
}
public void setArrayField(final String[] arrayField) {
this.arrayField = arrayField;
}
}
private static class SimpleListPojo {
private List<String> listField;
public List<String> getListField() {
return listField;
}
public void setListField(final List<String> listField) {
this.listField = listField;
}
}
private static class SimpleSetPojo {
private Set<String> setField;
public Set<String> getSetField() {
return setField;
}
public void setSetField(final Set<String> setField) {
this.setField = setField;
}
}
private static class SimpleMapPojo {
private Map<String, String> mapField;
public Map<String, String> getMapField() {
return mapField;
}
public void setMapField(final Map<String, String> mapField) {
this.mapField = mapField;
}
}
}