Author: nbelaevski
Date: 2010-10-19 13:11:30 -0400 (Tue, 19 Oct 2010)
New Revision: 19606
Added:
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTest.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java
branches/RF-8742/ui/validator/ui/src/test/resources/org/
branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/
branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/
branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/test.xhtml
branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/testConverter.js
Log:
https://jira.jboss.org/browse/RF-9511
Added:
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTest.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTest.java
(rev 0)
+++
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/BaseConverterTest.java 2010-10-19
17:11:30 UTC (rev 19606)
@@ -0,0 +1,282 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.convert;
+
+import java.text.MessageFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TimeZone;
+
+import javax.el.ExpressionFactory;
+import javax.el.ValueExpression;
+import javax.el.VariableMapper;
+import javax.faces.component.UIComponent;
+import javax.faces.component.html.HtmlInputText;
+import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
+import javax.faces.convert.ConverterException;
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
+
+import net.sourceforge.htmlunit.corejs.javascript.Scriptable;
+
+import org.ajax4jsf.javascript.JSFunction;
+import org.ajax4jsf.javascript.ScriptUtils;
+import org.jboss.test.faces.htmlunit.HtmlUnitEnvironment;
+import org.testng.Assert;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeTest;
+
+import com.gargoylesoftware.htmlunit.ScriptResult;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public abstract class BaseConverterTest {
+
+ public static final String TEST_COMPONENT_LABEL = "input";
+
+ public class TestBean {
+
+ private static final String CONVERTER_VAR = "__converter";
+
+ private String converterId;
+
+ private String clientConverterClassName;
+
+ private String submittedValue;
+
+ private String convertedValueAsScript;
+
+ private String conversionErrorMessage;
+
+ private ConverterException converterException;
+
+ private Map<String, Object> attributes = new HashMap<String,
Object>();
+
+ private String converterParametersString;
+
+ public void setClientConverterClassName(String clientConverterClassName) {
+ this.clientConverterClassName = clientConverterClassName;
+ }
+
+ public String getClientConverterClassName() {
+ return clientConverterClassName;
+ }
+
+ public void setConverterId(String converterId) {
+ this.converterId = converterId;
+ }
+
+ public String getSubmittedValue() {
+ return submittedValue;
+ }
+
+ public String getSubmittedValueAsScript() {
+ return ScriptUtils.toScript(submittedValue);
+ }
+
+ public String getConversionErrorMessage() {
+ return conversionErrorMessage;
+ }
+
+ public void setConversionErrorMessage(String conversionErrorMessage) {
+ this.conversionErrorMessage = conversionErrorMessage;
+ }
+
+ public void setAttribute(String name, Object value) {
+ attributes.put(name, value);
+ }
+
+ public void setSubmittedValue(String submittedValue) {
+ this.submittedValue = submittedValue;
+ }
+
+ public String getConverterParametersString() {
+ return converterParametersString;
+ }
+
+ public ConverterException getConverterException() {
+ return converterException;
+ }
+
+ private void configure(FacesContext facesContext, Converter converter) {
+ ExpressionFactory expressionFactory =
facesContext.getApplication().getExpressionFactory();
+
+ VariableMapper varMapper = facesContext.getELContext().getVariableMapper();
+ ValueExpression originalExpr = varMapper.resolveVariable(CONVERTER_VAR);
+ try {
+ varMapper.setVariable(CONVERTER_VAR,
expressionFactory.createValueExpression(converter, Converter.class));
+
+ for (Entry<String, Object> mapEntry: attributes.entrySet()) {
+
+ String exprString =
MessageFormat.format("#'{'{0}.{1}'}'", CONVERTER_VAR,
mapEntry.getKey());
+ ValueExpression ve =
expressionFactory.createValueExpression(facesContext.getELContext(), exprString,
Object.class);
+
+ ve.setValue(facesContext.getELContext(), mapEntry.getValue());
+ }
+ } finally {
+ varMapper.setVariable(CONVERTER_VAR, originalExpr);
+ }
+ }
+
+ private Converter createConverter(FacesContext facesContext) {
+ Converter converter =
facesContext.getApplication().createConverter(converterId);
+ configure(facesContext, converter);
+ return converter;
+ }
+
+ private UIComponent createTestComponent() {
+ HtmlInputText testComponent = new HtmlInputText();
+ testComponent.setLabel(TEST_COMPONENT_LABEL);
+ return testComponent;
+ }
+
+ public String getConvertedValueAsScript() {
+ return convertedValueAsScript != null ? convertedValueAsScript :
"null";
+ }
+
+ public void init() {
+ if (converterId == null || clientConverterClassName == null) {
+ throw new NullPointerException();
+ }
+
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ Converter converter = createConverter(facesContext);
+ try {
+ Object convertedObject = converter.getAsObject(facesContext,
createTestComponent(), submittedValue);
+ convertedValueAsScript = serializeObjectToScript(convertedObject);
+ } catch (ConverterException e) {
+ this.converterException = e;
+ }
+
+ converterParametersString = ScriptUtils.toScript(attributes);
+ }
+ }
+
+ private TestBean testBean;
+
+ private HtmlUnitEnvironment environment;
+
+ private String converterScriptName;
+
+ public BaseConverterTest(String converterScriptName) {
+ this.converterScriptName = converterScriptName;
+ }
+
+ @BeforeTest
+ public void setUp() throws Exception {
+ testBean = new TestBean();
+
+ environment = new HtmlUnitEnvironment();
+ environment.getServer().addResource("/test.xhtml",
BaseConverterTest.class.getResource("test.xhtml"));
+ environment.getServer().addResource("/resources/converter.js",
converterScriptName);
+ environment.getServer().addWebListener(new ServletRequestListener() {
+
+ public void requestInitialized(ServletRequestEvent sre) {
+ sre.getServletRequest().setAttribute("testBean", testBean);
+ }
+
+ public void requestDestroyed(ServletRequestEvent sre) {
+ }
+ });
+
+ environment.start();
+ }
+
+ @AfterTest
+ public void tearDown() throws Exception {
+ testBean = null;
+
+ environment.release();
+ environment = null;
+ }
+
+ protected String serializeObjectToScript(Object object) {
+ if (object instanceof Date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime((Date) object);
+ calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
+
+ return new JSFunction("new Date", calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
+ calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR),
calendar.get(Calendar.MINUTE),
+ calendar.get(Calendar.SECOND),
calendar.get(Calendar.MILLISECOND)).toScript();
+ }
+
+ return ScriptUtils.toScript(object);
+ }
+
+ public void setConversionErrorMessage(String conversionErrorMessage) {
+ testBean.setConversionErrorMessage(conversionErrorMessage);
+ }
+
+ public void setConverterId(String converterId) {
+ testBean.setConverterId(converterId);
+ }
+
+ public void setClientConverterClassName(String clientConverterClassName) {
+ testBean.setClientConverterClassName(clientConverterClassName);
+ }
+
+ public void setAttribute(String name, Object value) {
+ testBean.setAttribute(name, value);
+ }
+
+ public void assertConversionOk(String submittedValue) throws Exception {
+ testBean.setSubmittedValue(submittedValue);
+
+ HtmlPage page = environment.getPage("/test.jsf");
+
+ Assert.assertTrue(page.getWebClient().isJavaScriptEnabled());
+ ScriptResult conversionMessageResult =
page.executeJavaScript("verifyConversion()");
+ if (!ScriptResult.isUndefined(conversionMessageResult)) {
+ Assert.fail(conversionMessageResult.getJavaScriptResult().toString());
+ }
+ }
+
+ public void assertConversionFailure(String submittedValue, String failureMessage)
throws Exception {
+ testBean.setSubmittedValue(submittedValue);
+
+ HtmlPage page = environment.getPage("/test.jsf");
+
+ Assert.assertNotNull(testBean.getConverterException());
+ Assert.assertEquals(testBean.getConverterException().getMessage(),
failureMessage);
+
+ Assert.assertTrue(page.getWebClient().isJavaScriptEnabled());
+ ScriptResult conversionErrorResult =
page.executeJavaScript("window.conversionError");
+
+ if (ScriptResult.isUndefined(conversionErrorResult)) {
+ Assert.fail("converter has not thrown an error");
+ return;
+ }
+
+ Scriptable conversionError = (Scriptable)
conversionErrorResult.getJavaScriptResult();
+ Assert.assertEquals(conversionError.get("message", conversionError),
failureMessage);
+
+ }
+
+}
Added:
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java
(rev 0)
+++
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/convert/DateTimeConverterTest.java 2010-10-19
17:11:30 UTC (rev 19606)
@@ -0,0 +1,71 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.convert;
+
+import javax.faces.convert.DateTimeConverter;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class DateTimeConverterTest extends BaseConverterTest {
+
+ public DateTimeConverterTest() {
+ super("org/richfaces/csv/testConverter.js");
+ }
+
+ @DataProvider(name = "successTest")
+ public Object[][] getSuccessTestData() {
+ return new Object[][]{
+ {"17-10-2010"}
+ };
+ }
+
+ @DataProvider(name = "failuresTest")
+ public Object[][] getFailuresTestData() {
+ return new Object[][]{
+ {"10/17/2010", "Date should be in dd-MM-yyyy format"}
+ };
+ }
+
+ @Test(dataProvider = "successTest")
+ public void testSuccess(String submittedValue) throws Exception {
+ setClientConverterClassName("org.rf.DateTimeConverter");
+ setConverterId(DateTimeConverter.CONVERTER_ID);
+ setAttribute("pattern", "dd-MM-yyyy");
+
+ assertConversionOk(submittedValue);
+ }
+
+ @Test(dataProvider = "failuresTest")
+ public void testFailures(String submittedValue, String conversionErrorMessage) throws
Exception {
+ setClientConverterClassName("org.rf.DateTimeConverter");
+ setConverterId(DateTimeConverter.CONVERTER_ID);
+ setAttribute("pattern", "dd-MM-yyyy");
+
+ assertConversionFailure(submittedValue, conversionErrorMessage);
+ }
+}
Added:
branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/test.xhtml
===================================================================
--- branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/test.xhtml
(rev 0)
+++
branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/test.xhtml 2010-10-19
17:11:30 UTC (rev 19606)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html
xmlns="http://www.w3.org/1999/xhtml"
+
xmlns:f="http://java.sun.com/jsf/core"
+
xmlns:h="http://java.sun.com/jsf/html">
+<f:view>
+ <f:metadata>
+ <f:event type="preRenderView" listener="#{testBean.init}"/>
+ </f:metadata>
+<h:head>
+ <h:outputScript name="converter.js" />
+</h:head>
+<h:body>
+ <script type="text/javascript">
+ window.expected = #{testBean.convertedValueAsScript};
+
+ try {
+ window.actual =
#{testBean.clientConverterClassName}(#{testBean.submittedValueAsScript},
+ "#{testBean.conversionErrorMessage}",
#{testBean.converterParametersString});
+ } catch (e) {
+ window.conversionError = e;
+ }
+
+ function verifyConversion() {
+ if (window.conversionError) {
+ return "conversion error caught: " + window.conversionError.message;
+ }
+
+ //TODO - implement equality checking for all supported objects in a proper way
+ if (window.actual != window.expected) {
+ return "expected [" + window.expected + "] but was [" +
window.actual + "]";
+ }
+ }
+ </script>
+</h:body>
+</f:view>
+</html>
\ No newline at end of file
Added:
branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/testConverter.js
===================================================================
---
branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/testConverter.js
(rev 0)
+++
branches/RF-8742/ui/validator/ui/src/test/resources/org/richfaces/convert/testConverter.js 2010-10-19
17:11:30 UTC (rev 19606)
@@ -0,0 +1,6 @@
+window.org = {
+ rf: {
+ DateTimeConverter: function() {
+ }
+ }
+}
\ No newline at end of file