/**
* License Agreement.
*
* JBoss RichFaces - Ajax4jsf Component Library
*
* Copyright (C) 2007 Exadel, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* This library 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 library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.ajax4jsf.component;
import java.util.List;
import javax.faces.component.UIComponent;
import javax.faces.component.UIForm;
import javax.faces.component.UIInput;
import javax.faces.component.UIViewRoot;
import org.ajax4jsf.renderkit.html.scripts.QueueScriptResourceRenderer;
import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
import org.jaxen.JaxenException;
import com.gargoylesoftware.htmlunit.html.DomText;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author Nick Belaevski
* @since 3.3.0
*/
public class QueueRendererTest extends AbstractAjax4JsfTestCase {
private UIForm form;
private static final String dry(String s) {
return s.replace(" ", "");
}
/**
* @param name
*/
public QueueRendererTest(String name) {
super(name);
}
/* (non-Javadoc)
* @see org.ajax4jsf.tests.AbstractAjax4JsfTestCase#setUp()
*/
public void setUp() throws Exception {
super.setUp();
UIViewRoot root = facesContext.getViewRoot();
List<UIComponent> children = root.getChildren();
form = (UIForm) application.createComponent(UIForm.COMPONENT_TYPE);
form.setId("theform");
UIComponent createComponent = application.createComponent(UIInput.COMPONENT_TYPE);
createComponent.getAttributes().put("onchange", "return true;");
form.getChildren().add(createComponent);
children.add(form);
}
/* (non-Javadoc)
* @see org.ajax4jsf.tests.AbstractAjax4JsfTestCase#tearDown()
*/
public void tearDown() throws Exception {
super.tearDown();
form = null;
}
private String getQueueScript(HtmlPage page) throws JaxenException {
List<?> list = page.getByXPath("//head/script[@id='" + QueueScriptResourceRenderer.QUEUE_SCRIPT_ID + "']/text()");
DomText text = (DomText) list.get(0);
String scriptData = text.getData();
return scriptData.replaceAll("^\\Qif (typeof A4J != 'undefined') { if (A4J.AJAX) { with (A4J.AJAX) {\\E|\\Q}}};\\E$", "");
}
private String[] splitScript(String s) {
String[] split = s.split(";");
for (int i = 0; i < split.length; i++) {
split[i] = split[i] + ";";
}
return split;
}
private String createQueueInitString(String queueName, String queueParams, String requestParams) {
StringBuilder builder = new StringBuilder("if (!EventQueue.getQueue('").append(queueName).append("')) { EventQueue.addQueue(new EventQueue('").
append(queueName).append("'");
builder.append(",");
builder.append(String.valueOf(queueParams));
builder.append(",");
builder.append(String.valueOf(requestParams));
builder.append(")) };");
return builder.toString();
}
public void testViewQueueName() throws Exception {
UIQueue queue = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
queue.setName("test_view_queue");
facesContext.getViewRoot().getChildren().add(queue);
HtmlPage page = renderView();
String queueScript = getQueueScript(page);
assertEquals(createQueueInitString("test_view_queue", null, null), queueScript);
}
public void testViewQueueDefaultName() throws Exception {
UIQueue queue = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
facesContext.getViewRoot().getChildren().add(queue);
HtmlPage page = renderView();
String queueScript = getQueueScript(page);
assertEquals(createQueueInitString(UIQueue.GLOBAL_QUEUE_NAME, null, null), queueScript);
}
public void testFormQueueName() throws Exception {
UIQueue queue = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
queue.setName("test_view_queue");
form.getChildren().add(queue);
HtmlPage page = renderView();
String queueScript = getQueueScript(page);
assertEquals(createQueueInitString("theform:test_view_queue", null, null), queueScript);
}
public void testFormQueueDefaultName() throws Exception {
UIQueue queue = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
form.getChildren().add(queue);
HtmlPage page = renderView();
String queueScript = getQueueScript(page);
assertEquals(createQueueInitString("theform", null, null), queueScript);
}
public void testRenderQueueAttributes() throws Exception {
UIQueue queue1 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
queue1.setSize(10);
queue1.setOnsizeexceeded("sizeexceeded_handler()");
queue1.setSizeExceededBehavior("dropNext");
queue1.setOnrequestqueue("request_queue_handler()");
queue1.setOnrequestdequeue("request_de_queue_handler()");
form.getChildren().add(queue1);
UIQueue queue2 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
queue2.setSize(-1);
queue2.setName("unsizedQueue");
form.getChildren().add(queue2);
UIQueue queue3 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
queue3.setName("defaultSizeQueue");
form.getChildren().add(queue3);
HtmlPage page = renderView();
String queueScript = dry(getQueueScript(page));
String[] scripts = splitScript(queueScript);
assertEquals(3, scripts.length);
assertEquals(dry(createQueueInitString("theform",
"{'size':10,'sizeExceededBehavior':'dropNext','onsizeexceeded':function(query,options,event){sizeexceeded_handler()},'onrequestqueue':function(query,options,event){request_queue_handler()},'onrequestdequeue':function(query,options,event){request_de_queue_handler()}}",
null)),
scripts[0]);
assertEquals(dry(createQueueInitString("theform:unsizedQueue", "{'size':-1}", null)), scripts[1]);
assertEquals(dry(createQueueInitString("theform:defaultSizeQueue", null, null)), scripts[2]);
}
public void testRenderRequestAttributes() throws Exception {
UIQueue queue1 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
queue1.setName("queue1");
queue1.setTimeout(50021);
queue1.setOnerror("error_queue_handler()");
queue1.setOnsubmit("submit_queue_handler()");
queue1.setIgnoreDupResponses(false);
form.getChildren().add(queue1);
UIQueue queue2 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
queue2.setName("queue2");
queue2.setRequestDelay(600);
queue2.setIgnoreDupResponses(true);
queue2.setOnbeforedomupdate("beforedomupdate_handler()");
queue2.setOncomplete("complete_handler()");
queue2.setStatus("mystatus");
form.getChildren().add(queue2);
HtmlPage page = renderView();
String queueScript = dry(getQueueScript(page));
String[] scripts = splitScript(queueScript);
assertEquals(2, scripts.length);
assertEquals(dry(createQueueInitString("theform:queue1", null,
"{'timeout':50021,'queueonsubmit':function(request){submit_queue_handler()},'queueonerror':function(request,status,message){error_queue_handler()}}")), scripts[0]);
assertEquals(dry(createQueueInitString("theform:queue2", null,
"{'ignoreDupResponses':true,'requestDelay':600,'status':'mystatus','queueonbeforedomupdate':function(request,event,data){beforedomupdate_handler()},'queueoncomplete':function(request,event,data){complete_handler()}}")),
scripts[1]);
}
public void testInvalidSizeExceededBehavior() throws Exception {
UIQueue queue = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
queue.setSizeExceededBehavior("unknownBehavior");
form.getChildren().add(queue);
try {
renderView();
fail();
} catch (IllegalArgumentException e) {
//ok
}
}
public void testDuplicateQueues() throws Exception {
UIQueue queue1 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
queue1.setName("testQueue");
queue1.setSize(2);
form.getChildren().add(queue1);
UIQueue queue2 = (UIQueue) application.createComponent(UIQueue.COMPONENT_TYPE);
queue2.setName("testQueue");
queue2.setSize(5);
form.getChildren().add(queue2);
HtmlPage page = renderView();
String queueScript = dry(getQueueScript(page));
String[] scripts = splitScript(queueScript);
assertEquals(1, scripts.length);
assertEquals(dry(createQueueInitString("theform:testQueue", "{'size':2}",null)), scripts[0]);
}
}