/*
* Copyright 2016 Christoph Böhme
* Copyright 2013, 2014 Deutsche Nationalbibliothek
*
* 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.metamorph;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import java.util.HashMap;
import java.util.Map;
import org.culturegraph.mf.framework.helpers.DefaultStreamReceiver;
import org.culturegraph.mf.metamorph.api.Maps;
import org.culturegraph.mf.metamorph.api.NamedValueReceiver;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
/**
* Tests for class {@link Metamorph}.
*
* @author Markus Michael Geipel
* @author Christoph Böhme (rewrite)
*/
public final class MetamorphTest {
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock
private NamedValueReceiver namedValueReceiver;
private Metamorph metamorph;
@Before
public void createSystemUnderTest() {
metamorph = new Metamorph();
metamorph.setReceiver(new DefaultStreamReceiver());
}
@Test
public void shouldMapMatchingPath() {
setupSimpleMappingMorph();
metamorph.startRecord("");
metamorph.literal("testEntity.testLiteral", "testValue");
verify(namedValueReceiver).receive(eq("outName"), eq("testValue"),
any(), anyInt(), anyInt());
}
@Test
public void shouldNotMapNonMatchingPath() {
setupSimpleMappingMorph();
metamorph.startRecord("");
metamorph.literal("nonMatching.path", "testValue");
verify(namedValueReceiver, never()).receive(any(), any(), any(), anyInt(),
anyInt());
}
@Test
public void shouldMapMatchingLiteralInMatchingEntity() {
setupSimpleMappingMorph();
metamorph.startRecord("");
metamorph.startEntity("testEntity");
metamorph.literal("testLiteral", "testValue");
verify(namedValueReceiver).receive(eq("outName"), eq("testValue"),
any(), anyInt(), anyInt());
}
@Test
public void shouldNotMapNonMatchingLiteralInMatchingEntity() {
setupSimpleMappingMorph();
metamorph.startRecord("");
metamorph.startEntity("testEntity");
metamorph.literal("nonMatching", "testValue");
verify(namedValueReceiver, never()).receive(any(), any(), any(), anyInt(),
anyInt());
}
@Test
public void shouldNotMapMatchingLiteralInNonMatchingEntity() {
setupSimpleMappingMorph();
metamorph.startRecord("");
metamorph.startEntity("nonMatching");
metamorph.literal("testLiteral", "testValue");
verify(namedValueReceiver, never()).receive(any(), any(), any(), anyInt(),
anyInt());
}
@Test
public void shouldNotMapLiteralWithoutMatchingEntity() {
setupSimpleMappingMorph();
metamorph.startRecord("");
metamorph.literal("testLiteral", "testValue");
verify(namedValueReceiver, never()).receive(any(), any(), any(), anyInt(),
anyInt());
}
/**
* Creates the Metamorph structure that corresponds to the Metamorph XML
* statement {@code <data source="testEntity.testLiteral" name="outName" />}.
*/
private void setupSimpleMappingMorph() {
final Data data = new Data();
data.setName("outName");
data.setNamedValueReceiver(namedValueReceiver);
metamorph.registerNamedValueReceiver("testEntity" + '.' + "testLiteral", data);
}
@Test
public void shouldReturnValueFromNestedMap() {
final Map<String, String> map = new HashMap<>();
map.put("outName", "testValue");
metamorph.putMap("testMap", map);
assertNotNull(metamorph.getMap("testMap"));
assertEquals("testValue", metamorph.getValue("testMap", "outName"));
}
@Test
public void shouldReturnDefaultValueIfMapIsKnownButNameIsUnknown() {
final Map<String, String> map = new HashMap<>();
map.put(Maps.DEFAULT_MAP_KEY, "defaultValue");
metamorph.putMap("testMap", map);
assertEquals("defaultValue", metamorph.getValue("testMap", "nameNotInMap"));
}
@Test
public void shouldFedbackLiteralsStartingWithAtIntoMetamorph() {
final Data data1;
data1 = new Data();
data1.setName("@feedback");
metamorph.addNamedValueSource(data1);
metamorph.registerNamedValueReceiver("testLiteral", data1);
final Data data2 = new Data();
data2.setName("outName");
data2.setNamedValueReceiver(namedValueReceiver);
metamorph.registerNamedValueReceiver("@feedback", data2);
metamorph.startRecord("");
metamorph.literal("testLiteral", "testValue");
verify(namedValueReceiver).receive(eq("outName"), eq("testValue"),
any(), anyInt(), anyInt());
}
@Test(expected=IllegalStateException.class)
public void shouldThrowIllegalStateExceptionIfEntityIsNotClosed() {
metamorph.startRecord("");
metamorph.startEntity("testEntity");
metamorph.startEntity("testEntity");
metamorph.endEntity();
metamorph.endRecord(); // Exception expected
}
}