/* * 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.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import java.util.List; import java.util.Map; import org.culturegraph.mf.framework.ObjectReceiver; import org.junit.Test; import org.mockito.ArgumentCaptor; /** * Tests for class {@link PojoEncoder}. * * @author Thomas Seidel * @author Christoph Böhme (refactored to Mockito) * */ public class PojoEncoderTest { @Test public void shouldEncodeEmptyEntityStreamToEmptyPojo() { final ObjectReceiver<EmptyPojo> receiver = createObjectReceiverMock(); final PojoEncoder<EmptyPojo> pojoEncoder = new PojoEncoder<>( EmptyPojo.class); pojoEncoder.setReceiver(receiver); pojoEncoder.startRecord("identifier"); pojoEncoder.endRecord(); verify(receiver).process(any(EmptyPojo.class)); } @Test public void shouldEncodeEntityStreamToSimplePojo() { final ObjectReceiver<SimplePojo> receiver = createObjectReceiverMock(); final PojoEncoder<SimplePojo> pojoEncoder = new PojoEncoder<>( SimplePojo.class); pojoEncoder.setReceiver(receiver); pojoEncoder.startRecord("identifier"); pojoEncoder.literal("stringField1", "value1"); pojoEncoder.literal("stringField2", "value2"); pojoEncoder.literal("intField1", "42"); pojoEncoder.literal("intField2", "23"); pojoEncoder.endRecord(); final ArgumentCaptor<SimplePojo> objectCaptor = ArgumentCaptor.forClass(SimplePojo.class); verify(receiver).process(objectCaptor.capture()); final SimplePojo encodedPojo = objectCaptor.getValue(); assertNotNull(encodedPojo); assertEquals("value1", encodedPojo.stringField1); assertEquals("value2", encodedPojo.getStringField2()); assertEquals(42, encodedPojo.intField1); assertEquals(23, encodedPojo.getIntField2()); } @Test public void shouldEncodeEntityStreamToDoubleNestedPojo() { final ObjectReceiver<DoubleNestedPojo> receiver = createObjectReceiverMock(); final PojoEncoder<DoubleNestedPojo> pojoEncoder = new PojoEncoder<>(DoubleNestedPojo.class); pojoEncoder.setReceiver(receiver); pojoEncoder.startRecord("identifier"); pojoEncoder.startEntity("nestedPojo"); pojoEncoder.startEntity("simplePojo"); pojoEncoder.literal("stringField1", "value1"); pojoEncoder.literal("stringField2", "value2"); pojoEncoder.endEntity(); pojoEncoder.literal("attribute", "value3"); pojoEncoder.endEntity(); pojoEncoder.endRecord(); final ArgumentCaptor<DoubleNestedPojo> objectCaptor = ArgumentCaptor.forClass(DoubleNestedPojo.class); verify(receiver).process(objectCaptor.capture()); final DoubleNestedPojo encodedPojo = objectCaptor.getValue(); assertNotNull(encodedPojo); assertNotNull(encodedPojo.nestedPojo); assertEquals("value3", encodedPojo.nestedPojo.attribute); assertNotNull(encodedPojo.nestedPojo.simplePojo); assertEquals("value1", encodedPojo.nestedPojo.simplePojo.stringField1); assertEquals("value2", encodedPojo.nestedPojo.simplePojo.getStringField2()); } @Test public void shouldEncodeEntityStreamToPojoWithStringList() { final ObjectReceiver<StringListPojo> receiver = createObjectReceiverMock(); final PojoEncoder<StringListPojo> pojoEncoder = new PojoEncoder<>(StringListPojo.class); pojoEncoder.setReceiver(receiver); pojoEncoder.startRecord("identifier"); pojoEncoder.startEntity("stringList"); pojoEncoder.literal("firstElement", "value1"); pojoEncoder.literal("secondElement", "value2"); pojoEncoder.endEntity(); pojoEncoder.literal("attribute", "value3"); pojoEncoder.endRecord(); final ArgumentCaptor<StringListPojo> objectCaptor = ArgumentCaptor.forClass(StringListPojo.class); verify(receiver).process(objectCaptor.capture()); final StringListPojo encodedPojo = objectCaptor.getValue(); assertNotNull(encodedPojo); assertEquals("value3", encodedPojo.attribute); assertNotNull(encodedPojo.stringList); assertEquals(2, encodedPojo.stringList.size()); assertEquals("value1", encodedPojo.stringList.get(0)); assertEquals("value2", encodedPojo.stringList.get(1)); } @Test public void shouldEncodeEntityStreamToPojoWithIntegerList() { final ObjectReceiver<IntegerListPojo> receiver = createObjectReceiverMock(); final PojoEncoder<IntegerListPojo> pojoEncoder = new PojoEncoder<>(IntegerListPojo.class); pojoEncoder.setReceiver(receiver); pojoEncoder.startRecord("identifier"); pojoEncoder.startEntity("integerList"); pojoEncoder.literal("firstElement", "42"); pojoEncoder.literal("firstElement", "23"); pojoEncoder.endEntity(); pojoEncoder.endRecord(); final ArgumentCaptor<IntegerListPojo> objectCaptor = ArgumentCaptor.forClass(IntegerListPojo.class); verify(receiver).process(objectCaptor.capture()); final IntegerListPojo encodedPojo = objectCaptor.getValue(); assertNotNull(encodedPojo); assertNotNull(encodedPojo.integerList); assertEquals(2, encodedPojo.integerList.size()); assertEquals(42, encodedPojo.integerList.get(0).intValue()); assertEquals(23, encodedPojo.integerList.get(1).intValue()); } @Test public void shouldEncodeEntityStreamToPojoWithSimplePojoList() { final ObjectReceiver<SimplePojoListPojo> receiver = createObjectReceiverMock(); final PojoEncoder<SimplePojoListPojo> pojoEncoder = new PojoEncoder<>(SimplePojoListPojo.class); pojoEncoder.setReceiver(receiver); pojoEncoder.startRecord("identifier"); pojoEncoder.startEntity("simplePojoList"); pojoEncoder.startEntity("simplePojo"); pojoEncoder.literal("stringField1", "value1"); pojoEncoder.literal("stringField2", "value2"); pojoEncoder.endEntity(); pojoEncoder.startEntity("simplePojo"); pojoEncoder.literal("stringField1", "value3"); pojoEncoder.endEntity(); pojoEncoder.endEntity(); pojoEncoder.endRecord(); final ArgumentCaptor<SimplePojoListPojo> objectCaptor = ArgumentCaptor.forClass(SimplePojoListPojo.class); verify(receiver).process(objectCaptor.capture()); final SimplePojoListPojo encodedPojo = objectCaptor.getValue(); assertNotNull(encodedPojo); assertNotNull(encodedPojo.simplePojoList); assertEquals(2, encodedPojo.simplePojoList.size()); assertEquals("value1", encodedPojo.simplePojoList.get(0).stringField1); assertEquals("value2", encodedPojo.simplePojoList.get(0).getStringField2()); assertEquals("value3", encodedPojo.simplePojoList.get(1).stringField1); } @Test public void shouldEncodeEntityStreamToPojoWithStringMap() { final ObjectReceiver<StringMapPojo> receiver = createObjectReceiverMock(); final PojoEncoder<StringMapPojo> pojoEncoder = new PojoEncoder<StringMapPojo>(StringMapPojo.class); pojoEncoder.setReceiver(receiver); pojoEncoder.startRecord("identifier"); pojoEncoder.startEntity("stringMap"); pojoEncoder.literal("mapKey1", "mapValue1"); pojoEncoder.literal("mapKey2", "mapValue2"); pojoEncoder.endEntity(); pojoEncoder.endRecord(); final ArgumentCaptor<StringMapPojo> objectCaptor = ArgumentCaptor.forClass(StringMapPojo.class); verify(receiver).process(objectCaptor.capture()); final StringMapPojo encodedPojo = objectCaptor.getValue(); assertNotNull(encodedPojo); assertNotNull(encodedPojo.stringMap); assertEquals(2, encodedPojo.stringMap.size()); assertEquals("mapValue1", encodedPojo.stringMap.get("mapKey1")); assertEquals("mapValue2", encodedPojo.stringMap.get("mapKey2")); } @Test public void shouldEncodeEntityStreamToPojoWithSimplePojoMap() { final ObjectReceiver<SimplePojoMapPojo> receiver = createObjectReceiverMock(); final PojoEncoder<SimplePojoMapPojo> pojoEncoder = new PojoEncoder<>(SimplePojoMapPojo.class); pojoEncoder.setReceiver(receiver); pojoEncoder.startRecord("identifier"); pojoEncoder.startEntity("simplePojoMap"); pojoEncoder.startEntity("mapKeyA"); pojoEncoder.literal("stringField1", "stringValueA1"); pojoEncoder.literal("stringField2", "stringValueA2"); pojoEncoder.endEntity(); pojoEncoder.startEntity("mapKeyB"); pojoEncoder.literal("stringField1", "stringValueB1"); pojoEncoder.literal("stringField2", "stringValueB2"); pojoEncoder.endEntity(); pojoEncoder.endEntity(); pojoEncoder.endRecord(); final ArgumentCaptor<SimplePojoMapPojo> objectCaptor = ArgumentCaptor.forClass(SimplePojoMapPojo.class); verify(receiver).process(objectCaptor.capture()); final SimplePojoMapPojo encodedPojo = objectCaptor.getValue(); assertNotNull(encodedPojo); assertNotNull(encodedPojo.simplePojoMap); assertEquals(2, encodedPojo.simplePojoMap.size()); assertEquals("stringValueA1", encodedPojo.simplePojoMap.get("mapKeyA") .stringField1); assertEquals("stringValueA2", encodedPojo.simplePojoMap.get("mapKeyA") .stringField2); assertEquals("stringValueB1", encodedPojo.simplePojoMap.get("mapKeyB") .stringField1); assertEquals("stringValueB2", encodedPojo.simplePojoMap.get("mapKeyB") .stringField2); } private <T> ObjectReceiver<T> createObjectReceiverMock() { // There is no type safe to create a mock with Mockito#mock(Class). // Hence, we have to use an unchecked cast here: return (ObjectReceiver<T>) mock(ObjectReceiver.class); } public static class EmptyPojo { } public static class SimplePojo { public String stringField1; private String stringField2; public int intField1; private int intField2; public void setStringField2(final String stringField2) { this.stringField2 = stringField2; } public String getStringField2() { return stringField2; } public void setIntField2(final int intField2) { this.intField2 = intField2; } public int getIntField2() { return intField2; } } public static class NestedPojo { public String attribute; public SimplePojo simplePojo; } public static class DoubleNestedPojo { public NestedPojo nestedPojo; } public static class StringListPojo { public List<String> stringList; public String attribute; } public static class IntegerListPojo { public List<Integer> integerList; } public static class SimplePojoListPojo { private List<SimplePojo> simplePojoList; public void setSimplePojoList(final List<SimplePojo> simplePojoList) { this.simplePojoList = simplePojoList; } } public static class StringMapPojo { public Map<String, String> stringMap; } public static class SimplePojoMapPojo { public Map<String, SimplePojo> simplePojoMap; } }