package dk.statsbiblioteket.medieplatform.autonomous.iterator.eventhandlers;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.AttributeParsingEvent;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.NodeBeginsParsingEvent;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.NodeEndParsingEvent;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.ParsingEventType;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.TreeIterator;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.List;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
/** Test of the EventRunner class. */
public class EventRunnerTest {
/**
* Verifies that the BatchStructureChecker correctly passes the event for a simple batch with two leafs
* to the attached event handlers.
*/
@Test
public void testStructureCalls() throws Exception {
// Setup fixture
TreeIterator treeIteratorMock = mock(TreeIterator.class);
when(treeIteratorMock.hasNext()).
thenReturn(true).thenReturn(true).thenReturn(true).//Begins
thenReturn(true).thenReturn(true). //Attributes
thenReturn(true).thenReturn(true).thenReturn(true).//Ends
thenReturn(false);
NodeBeginsParsingEvent batchNodeBegin = new NodeBeginsParsingEvent("BatchNode", null);
NodeBeginsParsingEvent reelNodeBegin = new NodeBeginsParsingEvent("ReelNode", null);
NodeBeginsParsingEvent dateNodeBegin = new NodeBeginsParsingEvent("DateNode", null);
AttributeParsingEvent pageJp2Attribute = createAttributeParsingEventStub("pageJp2Attribute");
AttributeParsingEvent pageXmlAttribute = createAttributeParsingEventStub("pageXmlAttribute");
NodeEndParsingEvent dateNodeEnd = new NodeEndParsingEvent("DateNode", null);
NodeEndParsingEvent reelNodeEnd = new NodeEndParsingEvent("ReelNode", null);
NodeEndParsingEvent batchNodeEnd = new NodeEndParsingEvent("BatchNode", null);
when(treeIteratorMock.next()).
thenReturn(batchNodeBegin).
thenReturn(reelNodeBegin).
thenReturn(dateNodeBegin).
thenReturn(pageJp2Attribute).
thenReturn(pageXmlAttribute).
thenReturn(dateNodeEnd).
thenReturn(reelNodeEnd).
thenReturn(batchNodeEnd);
TreeEventHandler treeEventHandlerMock = mock(TreeEventHandler.class);
//Perform test
List<TreeEventHandler> eventHandlers = Arrays.asList(new TreeEventHandler[]{treeEventHandlerMock});
EventRunner batchStructureCheckerUT = new EventRunner(treeIteratorMock, eventHandlers,null);
batchStructureCheckerUT.run();
//Verify
verify(treeEventHandlerMock).handleNodeBegin(batchNodeBegin);
verify(treeEventHandlerMock).handleNodeBegin(reelNodeBegin);
verify(treeEventHandlerMock).handleNodeBegin(dateNodeBegin);
verify(treeEventHandlerMock).handleAttribute(pageJp2Attribute);
verify(treeEventHandlerMock).handleAttribute(pageXmlAttribute);
verify(treeEventHandlerMock).handleNodeEnd(dateNodeEnd);
verify(treeEventHandlerMock).handleNodeEnd(reelNodeEnd);
verify(treeEventHandlerMock).handleNodeEnd(batchNodeEnd);
verify(treeEventHandlerMock).handleFinish();
verifyNoMoreInteractions(treeEventHandlerMock);
}
/**
* Verifies that the BatchStructureChecker correctly passes the event for a simple batch with two leafs
* to the attached event handlers.
*/
@Test
public void testInjection() throws Exception {
// Setup fixture
TreeIterator treeIteratorMock = mock(TreeIterator.class);
NodeBeginsParsingEvent batchNodeBegin = new NodeBeginsParsingEvent("BatchNode", null);
NodeBeginsParsingEvent reelNodeBegin = new NodeBeginsParsingEvent("ReelNode", null);
NodeBeginsParsingEvent dateNodeBegin = new NodeBeginsParsingEvent("DateNode", null);
AttributeParsingEvent pageJp2Attribute = createAttributeParsingEventStub("pageJp2Attribute");
AttributeParsingEvent pageXmlAttribute = createAttributeParsingEventStub("pageXmlAttribute");
NodeEndParsingEvent dateNodeEnd = new NodeEndParsingEvent("DateNode", null);
NodeEndParsingEvent reelNodeEnd = new NodeEndParsingEvent("ReelNode", null);
NodeEndParsingEvent batchNodeEnd = new NodeEndParsingEvent("BatchNode", null);
when(treeIteratorMock.hasNext()).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(false);
when(treeIteratorMock.next()).
thenReturn(batchNodeBegin).
thenReturn(reelNodeBegin).
thenReturn(dateNodeBegin).
thenReturn(pageJp2Attribute).
thenReturn(pageXmlAttribute).
thenReturn(dateNodeEnd).
thenReturn(reelNodeEnd).
thenReturn(batchNodeEnd);
final AttributeParsingEvent injected = createAttributeParsingEventStub("injectedAttribute");
final InjectingTreeEventHandler treeEventHandlerMock = mock(InjectingTreeEventHandler.class);
//Perform test
List<TreeEventHandler> eventHandlers = Arrays.asList(new TreeEventHandler[]{treeEventHandlerMock});
EventRunner batchStructureCheckerUT = new EventRunner(treeIteratorMock, eventHandlers, null);
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
InjectingTreeEventHandler mock = (InjectingTreeEventHandler) invocation.getMock();
mock.pushEvent(injected);
return null;
}
}).when(treeEventHandlerMock).handleAttribute(pageJp2Attribute);
batchStructureCheckerUT.run();
//Verify
verify(treeEventHandlerMock).handleNodeBegin(batchNodeBegin );
verify(treeEventHandlerMock).handleNodeBegin(reelNodeBegin);
verify(treeEventHandlerMock).handleNodeBegin(dateNodeBegin);
verify(treeEventHandlerMock).handleAttribute(pageJp2Attribute);
verify(treeEventHandlerMock).handleAttribute(injected);
verify(treeEventHandlerMock).handleAttribute(pageXmlAttribute);
verify(treeEventHandlerMock).handleNodeEnd(dateNodeEnd);
verify(treeEventHandlerMock).handleNodeEnd(reelNodeEnd);
verify(treeEventHandlerMock).handleNodeEnd(batchNodeEnd);
verify(treeEventHandlerMock).handleFinish();
verifyNoMoreInteractions(treeEventHandlerMock);
}
/** @return Creates a attribute event and marks is as type 'Attribute'. */
private AttributeParsingEvent createAttributeParsingEventStub(final String name) {
AttributeParsingEvent event = mock(AttributeParsingEvent.class);
when(event.getType()).thenReturn(ParsingEventType.Attribute);
return event;
}
}