package nl.hsac.fitnesse.fixture.util;
import fit.exception.FitFailureException;
import nl.hsac.fitnesse.fixture.Environment;
import nl.hsac.fitnesse.fixture.leanapps.LalPolicyXPaths;
import org.junit.Test;
import javax.xml.namespace.NamespaceContext;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* Tests XPathHelper.
*/
public class XPathHelperTest {
private static final NamespaceContext NS_CONTEXT = Environment.getInstance().getNamespaceContext();
private XPathHelper xPathHelper = new XPathHelper();
@Test
public void testXPathWithNamespace() {
LalPolicyXPaths.registerNamespace();
String responseString = FileUtil.loadFile("leanapps/getPolicyCheckResponse.xml");
assertEquals("OK", xPathHelper.getXPath(NS_CONTEXT, responseString, "//lal:status/lal:status"));
}
@Test
public void testBadXPath() {
String responseString = FileUtil.loadFile("leanapps/getPolicyCheckResponse.xml");
assertEquals("", xPathHelper.getXPath(null, responseString, "//status"));
try {
xPathHelper.getXPath(null, responseString, "\\status");
fail("expected exception");
} catch (FitFailureException e) {
String message = e.getMessage();
assertTrue("Bad message start: " + message, message.startsWith("Unable to compile xpath: \\status\n"));
assertTrue("Bad message end: " + message, message.endsWith("A location path was expected, but the following token was encountered: \\"));
}
}
@Test
public void testBadXml() {
try {
xPathHelper.getXPath(null, "bla", "//status");
fail("expected exception");
} catch (FitFailureException e) {
assertEquals("Cannot perform XPATH on non-xml: bla", e.getMessage());
}
}
@Test
public void testBadXml2() {
try {
xPathHelper.getXPath(null, "<bla", "//status");
fail("expected exception");
} catch (FitFailureException e) {
String message = e.getMessage();
assertTrue("Bad message start: " + message, message.startsWith("Unable to evaluate xpath: //status\n"));
assertTrue("Bad message end: " + message, message.endsWith("XML document structures must start and end within the same entity."));
}
}
@Test
public void testAllXmlNoText() {
LalPolicyXPaths.registerNamespace();
String responseString = FileUtil.loadFile("leanapps/getPolicyCheckResponse.xml");
List<String> all = xPathHelper.getAllXPath(NS_CONTEXT, responseString, "//*/@xsi:type");
assertEquals(13, all.size());
assertEquals("ns:PostalAddress", all.get(1));
}
@Test
public void testAllXmlWithText() {
LalPolicyXPaths.registerNamespace();
String responseString = FileUtil.loadFile("leanapps/getPolicyCheckResponse.xml");
List<String> all = xPathHelper.getAllXPath(NS_CONTEXT, responseString, "//lal:key/text()");
assertEquals(17, all.size());
assertEquals("20000541", all.get(0));
}
}