// Copyright � 2002-2005 Canoo Engineering AG, Switzerland.
package com.canoo.webtest.steps.store;
import javax.xml.xpath.XPathException;
import com.canoo.webtest.self.ThrowAssert;
import com.canoo.webtest.steps.BaseStepTestCase;
import com.canoo.webtest.steps.Step;
/**
* Tests for {@link StoreXPath}.
* @author Walter Rumsby (wrumsby@netscape.net)
* @version 1.0, 29/10/2002
* @author Marc Guillemot
* @version 3.0, 11/08/2003
* @author Denis N. Antonioli
*/
public class StoreXPathTest extends BaseStepTestCase {
private StoreXPath fStep;
public static final String PROPERTY_NAME = "result";
protected void setUp() throws Exception {
super.setUp();
fStep = (StoreXPath) getStep();
fStep.setProperty(PROPERTY_NAME);
}
private static final String DOCUMENT = "<html><body><form><input type=\"hidden\" id=\"id\" value=\"1\"/><input/></form></body></html>";
protected Step createStep() {
return new StoreXPath();
}
public void testHandleHtmlPage() throws Exception {
String document = "<html><head></head><body><h1>hello</h1></body></html>";
getContext().setDefaultResponse(document);
fStep.setXpath("/html/body/h1");
executeStep(fStep);
assertEquals("hello", fStep.getComputedValue());
}
public void testHandleXmlPage() throws Exception {
getContext().setDefaultResponse("<xml><body><h1>hello</h1></body></xml>", "text/xml");
fStep.setXpath("/xml/body/h1");
executeStep(fStep);
assertEquals("hello", fStep.getComputedValue());
}
/**
* Tests on an XmlPage containing an badly formed xml document
* @throws Exception if the test fails
*/
public void testHandleInvalidXmlPageIllegalChar() throws Exception {
getContext().setDefaultResponse("<xml type='foo & fii'></xml>", "text/xml");
fStep.setXpath("/xml");
assertFailOnExecute(fStep, "", "");
}
public void testHandleInvalidXmlPageNotWellFormed() throws Exception {
getContext().setDefaultResponse("<xml></html>", "text/xml");
fStep.setXpath("/xml");
assertFailOnExecute(fStep, "", "");
}
public void testHandleMissingPage() throws Exception {
getContext().fakeLastResponse(null);
fStep.setXpath("'valeur'='value'");
executeStep(fStep);
assertEquals("false", fStep.getComputedValue());
fStep.setXpath("/not/here");
assertThrowOnExecute(fStep, "", "", XPathException.class);
fStep.setXpath("/");
assertThrowOnExecute(fStep, "", "", XPathException.class);
}
public void testHandleUnknownPage() {
getContext().setDefaultResponse("hello", "text/plain");
fStep.setXpath("/html/head/title");
assertFailOnExecute(fStep, "", "");
}
public void testHandleMalformedXmlPage() {
getContext().setDefaultResponse("hello", "text/xml");
fStep.setXpath("/html/head/title");
assertFailOnExecute(fStep, "", "");
}
public void testVerifyParameters() throws Exception {
fStep.setXpath("some xpath");
fStep.setProperty(null);
assertStepRejectsEmptyParam("property", getExecuteStepTestBlock());
fStep.setXpath(null);
fStep.setProperty(PROPERTY_NAME);
assertStepRejectsNullParam("xpath", getExecuteStepTestBlock());
}
public void testExceptionIfNoMatch() throws Exception {
getContext().setDefaultResponse(DOCUMENT);
fStep.setXpath("/html/foot");
assertFailOnExecute(fStep, "No match for xpath expression", "");
// no exception if default value is provided
fStep.setDefault("bla");
fStep.execute();
}
public void testStringExpressionInMatch() throws Exception {
getContext().setDefaultResponse(DOCUMENT);
fStep.setXpath("count(/html)");
ThrowAssert.assertPasses("xpath evaluates to string - not node", getExecuteStepTestBlock());
assertEquals("1", fStep.getWebtestProperty(PROPERTY_NAME));
}
/**
* This test proves that there is a bug now.
* It will fail after the installation of a newer, correct version of jaxen.
* @throws Exception if the test fails
*/
public void testWT52() throws Exception {
String document
= "<html><body>"
+ "<p><a href='no'><img src='no.gif'></a></p>"
+ "<p><a href='yes'><img src='yes.gif'></a></p>"
+ "</body></html> ";
getContext().setDefaultResponse(document);
fStep.setXpath("(//a/img[contains(@src,'gif')])[2]/../@href");
executeStep(fStep);
assertEquals("yes", fStep.getWebtestProperty(PROPERTY_NAME));
}
/**
* This test proves that there is a bug now.
* It will fail after the installation of a newer, correct version of jaxen.
* @throws Exception if the test fails
*/
public void testStoreEmtpyString() throws Exception {
String document
= "<html><body>"
+ "<form><select><option value=''></option>"
+ "<option value='1'>first</option>"
+ "<option value='2'>second</option>"
+ "</form>"
+ "</body></html> ";
getContext().setDefaultResponse(document);
fStep.setXpath("//select/option[1]");
executeStep(fStep);
assertEquals("", fStep.getWebtestProperty(PROPERTY_NAME));
fStep.setXpath("//div[@id='notExisting']");
fStep.setDefault("bla bla");
executeStep(fStep);
assertEquals("bla bla", fStep.getWebtestProperty(PROPERTY_NAME));
}
}