package moulder.moulds;
import moulder.Moulder;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import java.io.StringReader;
import java.util.Arrays;
import java.util.List;
import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class SubMoulderTest extends BaseMoulderTest {
@Test
public void test() throws Exception {
Document document = Jsoup
.parseBodyFragment("<html><body><outer a='v'><a>test</a></outer></body></html>");
Element element = document.getElementsByTag("outer").first();
Element subElement = document.getElementsByTag("a").first();
Moulder moulder = mock(Moulder.class);
ArgumentCaptor<Element> edc = ArgumentCaptor
.forClass(Element.class);
when(moulder.process(edc.capture()))
.thenReturn(
Arrays.asList(parseNode("<b>text</b>"), parseNode("text")));
SubMoulder sm = new SubMoulder();
sm.register("a", moulder);
List<Node> processed = sm.process(element);
//check that the sub moulder called its registered moulder with the correct params: the child element <a> and "data"
assertEquals(subElement.outerHtml(), edc.getValue().outerHtml());
//check that the sub moulder correctly applied its registered moulder result
assertXMLEqual(new StringReader("<body><outer a='v'><b>text</b>text</outer></body>"), new StringReader(
html(processed)));
}
}