package moulder.moulds;
import moulder.Moulder;
import moulder.Value;
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 org.mockito.InOrder;
import java.io.StringReader;
import java.util.Arrays;
import java.util.List;
import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
import static org.mockito.Mockito.*;
public class IfMoulderTest extends BaseMoulderTest {
@Test
public void testThen() throws Exception {
test(true, "<body><b>text</b>text</body>");
}
@Test
public void testElse() throws Exception {
test(false, "<body><c>content</c>text</body>");
}
private void test(boolean res, String expected) throws Exception {
Value<Boolean> condition = mock(Value.class);
when(condition.get()).thenReturn(res);
Document document = Jsoup
.parseBodyFragment("<html><body><outer a='v'><a>test</a></outer></body></html>");
Element element = document.getElementsByTag("outer").first();
Moulder thenMoulder = mock(Moulder.class);
ArgumentCaptor<Element> ifMoulderCaptor = ArgumentCaptor
.forClass(Element.class);
when(
thenMoulder.process(ifMoulderCaptor.capture())).thenReturn(
Arrays.asList(parseNode("<b>text</b>"),
parseNode("text")));
Moulder elseMoulder = mock(Moulder.class);
ArgumentCaptor<Element> elseMoulderCaptor = ArgumentCaptor
.forClass(Element.class);
when(
elseMoulder.process(elseMoulderCaptor.capture())).thenReturn(
Arrays.asList(parseNode("<c>content</c>"),
parseNode("text")));
IfMoulder a = new IfMoulder(condition, thenMoulder, elseMoulder);
List<Node> processed = a.process(element);
// verify that bind and get were called, in this order
InOrder inOrder = inOrder(condition);
inOrder.verify(condition).get();
// check that the sub moulder called if ifMoulder and returned its
// result
assertXMLEqual(new StringReader(expected),
new StringReader(html(processed)));
}
}