package org.jboss.seam.test.unit; import java.util.Date; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.IntegerConverter; import javax.faces.validator.Validator; import javax.faces.validator.ValidatorException; import javax.validation.constraints.Size; import org.jboss.seam.contexts.Contexts; import org.jboss.seam.core.Expressions; import org.jboss.seam.core.Validators; import org.jboss.seam.faces.DateConverter; import org.jboss.seam.mock.EnhancedMockHttpServletRequest; import org.jboss.seam.navigation.Pages; import org.jboss.seam.navigation.Param; import org.testng.annotations.Test; /** * Verifies that page parameters are setup properly and report the correct information * about validators and converters. * * @author Dan Allen */ public class PageParamTest extends AbstractPageTest { @Test public void testGetConverterById() { String converterId = "javax.faces.Integer"; String converterClass = "javax.faces.convert.IntegerConverter"; Param param = new Param("param"); param.setConverterId(converterId); assert param.getConverter() instanceof IntegerConverter : "expecting: " + converterClass + "; got: " + param.getConverter(); } /** * Verify EL expression disability in actionOutcome parameter */ @Test(expectedExceptions = IllegalArgumentException.class ) public void testGetCallAction() { EnhancedMockHttpServletRequest request = new EnhancedMockHttpServletRequest(); request.addParameter("actionOutcome", "#{variable}"); FacesContext.getCurrentInstance().getExternalContext().setRequest(request); Pages.instance().preRender(FacesContext.getCurrentInstance()); } @Test(expectedExceptions = IllegalArgumentException.class ) public void testGetCallActionEscaped() { EnhancedMockHttpServletRequest request = new EnhancedMockHttpServletRequest(); request.addParameter("actionOutcome", "%3d%23%7dvariable%7b"); FacesContext.getCurrentInstance().getExternalContext().setRequest(request); Pages.instance().preRender(FacesContext.getCurrentInstance()); } /** * Verify that converter is null when the parameter value is a value expression and * we are operating outside of a FacesContext. * @jira JBSEAM-3674 */ @Test public void testConverterIsNullForNonFacesValueExpression() { Param param = new Param("param"); param.setValueExpression(Expressions.instance().createValueExpression("#{variable}")); assert param.getConverter() == null; } @Test public void testDateConverter() { Param param = setupParam(false); assert DateConverter.class.equals(param.getConverter().getClass()); } @Test public void testGetValidatorById() throws ClassNotFoundException { String validatorId = "TestValidator"; String validatorClass= "org.jboss.seam.test.unit.PageParamTest$TestValidator"; FacesContext.getCurrentInstance().getApplication().addValidator(validatorId, validatorClass); Param param = new Param("param"); param.setValidatorId(validatorId); assert param.getValidator() instanceof TestValidator : "expecting: " + validatorClass + "; got: " + param.getValidator(); } @Test(expectedExceptions = ValidatorException.class) public void testValidateModelWithInvalidValue() { setupParamToValidate(false).validateConvertedValue(FacesContext.getCurrentInstance(), "a"); } @Test public void testValidateModelWithValidValue() { setupParamToValidate(false).validateConvertedValue(FacesContext.getCurrentInstance(), "aaa"); } @Test public void testValidateModelDisabled() { setupParamToValidate(true).validateConvertedValue(FacesContext.getCurrentInstance(), "a"); } protected Param setupParamToValidate(boolean disableModelValidator) { installComponent(Contexts.getApplicationContext(), Validators.class); Param param = new Param("value"); param.setValueExpression(Expressions.instance().createValueExpression("#{bean.value}")); Contexts.getEventContext().set("bean", new Bean()); if (disableModelValidator) { param.setValidateModel(false); } return param; } protected Param setupParam(boolean disableModelValidator) { installComponent(Contexts.getApplicationContext(), DateConverter.class); Param param = new Param("birthDate"); param.setValueExpression(Expressions.instance().createValueExpression("#{bean.birthDate}")); Bean bean = new Bean(); bean.setBirthDate(new Date()); Contexts.getEventContext().set("bean", bean); if (disableModelValidator) { param.setValidateModel(false); } return param; } public static class TestValidator implements Validator { public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { } } class Bean { private String value; private Date birthDate; public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birth) { this.birthDate = birth; } @Size(min = 3, max = 10) public String getValue() { return value; } public void setValue(String value) { this.value = value; } } }