/*
* JBoss, Home of Professional Open Source
* Copyright ${year}, 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.renderkit;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import javax.faces.application.ViewHandler;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewDeclarationLanguage;
import org.jboss.test.faces.FacesEnvironment.FacesRequest;
import org.jboss.test.faces.htmlunit.HtmlUnitEnvironment;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.richfaces.CustomizedHtmlUnitEnvironment;
import org.richfaces.component.AbstractExtendedDataTable;
import org.richfaces.component.SortOrder;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author Konstantin Mishin
*
*/
public class ExtendedDataTableRendererTest {
private HtmlUnitEnvironment environment;
@Before
public void setUp() {
environment = new CustomizedHtmlUnitEnvironment();
environment.withWebRoot(new File("src/test/resources"));
environment.start();
environment.getWebClient().getOptions().setJavaScriptEnabled(false);
}
@After
public void tearDown() {
environment.release();
environment = null;
}
private FacesRequest startFacesRequest() throws IOException {
FacesRequest facesRequest = environment.createFacesRequest("http://localhost/extendedDataTableTest.jsf");
facesRequest.withViewId("/extendedDataTableTest.jsf");
facesRequest.start();
FacesContext facesContext = FacesContext.getCurrentInstance();
ViewHandler vh = facesContext.getApplication().getViewHandler();
ViewDeclarationLanguage vdl = vh.getViewDeclarationLanguage(facesContext, facesContext.getViewRoot().getViewId());
vdl.buildView(facesContext, facesContext.getViewRoot());
return facesRequest;
}
/**
* Test method for {@link org.richfaces.renderkit.ExtendedDataTableRenderer#getComponentClass()}.
*
* @throws IOException
*/
@Test
public final void testGetComponentClass() throws IOException {
FacesRequest facesRequest = startFacesRequest();
FacesContext facesContext = FacesContext.getCurrentInstance();
AbstractExtendedDataTable component = (AbstractExtendedDataTable) facesContext.getViewRoot().findComponent("table");
ExtendedDataTableRenderer renderer = (ExtendedDataTableRenderer) FacesContext.getCurrentInstance().getRenderKit()
.getRenderer(component.getFamily(), component.getRendererType());
assertEquals(AbstractExtendedDataTable.class, renderer.getComponentClass());
facesRequest.release();
}
/**
* Test method for
* {@link org.richfaces.renderkit.ExtendedDataTableRenderer#doEncodeBegin(javax.faces.context.ResponseWriter, javax.faces.context.FacesContext, javax.faces.component.UIComponent)}
* .
*
* @throws IOException
*/
@Test
public final void testDoEncodeBegin() throws IOException {
HtmlPage page = environment.getPage("/extendedDataTableTest.jsf");
HtmlElement table = (HtmlElement) page.getElementById("table");
assertEquals("rf-edt", table.getAttribute("class"));
assertEquals("headerFacet", page.getElementById("table:headerFacet").getTextContent());
}
/**
* Test method for
* {@link org.richfaces.renderkit.ExtendedDataTableRenderer#doEncodeChildren(javax.faces.context.ResponseWriter, javax.faces.context.FacesContext, javax.faces.component.UIComponent)}
* .
*
* @throws IOException
*/
@Test
public final void testDoEncodeChildren() throws IOException {
HtmlPage page = environment.getPage("/extendedDataTableTest.jsf");
HtmlElement table = (HtmlElement) page.getElementById("table");
String text = table.getElementsByTagName("style").get(0).getTextContent();
assertTrue(text.contains(".rf-edt-cnt"));
assertTrue(text.contains("rf-edt-c"));
HtmlElement header = table.getFirstByXPath("div[@class='rf-edt-hdr']");
DomElement frozenHeader = page.getElementById("table:frozenHeader");
DomElement normalHeader = page.getElementById("table:header");
assertTrue(normalHeader.getAttribute("class").contains("rf-edt-cnt"));
assertNotNull(frozenHeader.getFirstByXPath("descendant::*[@class='rf-edt-rsz']"));
assertNotNull(normalHeader.getFirstByXPath("descendant::*[@class='rf-edt-rsz']"));
assertEquals("headerColumnFacet1",
((HtmlElement) frozenHeader.getFirstByXPath("//*[@class='rf-edt-hdr-c-cnt']//*[@id='table:headerColumnFacet1']"))
.getTextContent());
assertEquals("headerColumnFacet2",
((HtmlElement) normalHeader.getFirstByXPath("//*[@class='rf-edt-hdr-c-cnt']//*[@id='table:headerColumnFacet2']"))
.getTextContent());
DomElement body = page.getElementById("table:b");
assertEquals("rf-edt-b", body.getAttribute("class"));
assertNotNull(body.getFirstByXPath("descendant::*[@class='rf-edt-spcr']"));
assertNotNull(body.getFirstByXPath("descendant::*[@class='rf-edt-cnt']//*[@id='table:tbn']"));
assertEquals("noDataFacet",
((HtmlElement) page.getFirstByXPath("//*[@id='table2']//*[@id='table2:b']//*[@id='table2:noDataFacet']"))
.getTextContent());
HtmlElement footer = table.getFirstByXPath("div[@class='rf-edt-ftr']");
HtmlElement frozenFooter = footer.getFirstByXPath("descendant::*[@class='rf-edt-ftr-fzn']/div");
DomElement normalFooter = page.getElementById("table:footer");
assertTrue(normalFooter.getAttribute("class").contains("rf-edt-ftr-cnt"));
assertEquals("footerColumnFacet1",
((HtmlElement) frozenFooter
.getFirstByXPath("descendant::*[@class='rf-edt-ftr-c-cnt']//*[@id='table:footerColumnFacet1']"))
.getTextContent());
assertEquals("footerColumnFacet2",
((HtmlElement) normalFooter
.getFirstByXPath("descendant::*[@class='rf-edt-ftr-c-cnt']//*[@id='table:footerColumnFacet2']"))
.getTextContent());
}
/**
* Test method for
* {@link org.richfaces.renderkit.ExtendedDataTableRenderer#doEncodeEnd(javax.faces.context.ResponseWriter, javax.faces.context.FacesContext, javax.faces.component.UIComponent)}
* .
*
* @throws IOException
*/
@Test
public final void testDoEncodeEnd() throws IOException {
HtmlPage page = environment.getPage("/extendedDataTableTest.jsf");
HtmlElement table = (HtmlElement) page.getElementById("table");
assertEquals("footerFacet", page.getElementById("table:footerFacet").getTextContent());
assertEquals("rf-edt-rsz-mkr", page.getElementById("table:d").getAttribute("class"));
assertEquals("rf-edt-rord rf-edt-tbl", page.getElementById("table:r").getAttribute("class"));
assertEquals("rf-edt-rord-mkr", page.getElementById("table:rm").getAttribute("class"));
assertEquals("table:wi", page.getElementById("table:wi").getAttribute("name"));
assertTrue(table.getElementsByTagName("script").get(0).getTextContent().contains("RichFaces.ui.ExtendedDataTable"));
}
/**
* Test method for
* {@link org.richfaces.renderkit.ExtendedDataTableRenderer#encodeRow(org.richfaces.renderkit.RowHolderBase)}.
*
* @throws IOException
*/
@Test
public final void testEncodeRow() throws IOException {
HtmlPage page = environment.getPage("/extendedDataTableTest.jsf");
HtmlElement table = (HtmlElement) page.getElementById("table");
HtmlElement cell = page.getElementById("table:0:f").getElementsByTagName("div").get(0);
assertTrue(cell.getAttribute("class").contains("rf-edt-c"));
HtmlElement cellContent = cell.getElementsByTagName("div").get(0);
assertEquals("rf-edt-c-cnt", cellContent.getAttribute("class"));
assertEquals("value", page.getElementById("table:0:outputText").getTextContent());
}
/**
* Test method for
* {@link org.richfaces.renderkit.ExtendedDataTableRenderer#encodePartially(javax.faces.component.UIComponent, javax.faces.component.visit.VisitContext, javax.faces.component.visit.VisitCallback, java.util.Collection)}
* .
*/
@Test
public final void testEncodePartially() {
// TODO fail("Not yet implemented");
}
@Test
public final void testFilteringWithoutClean() throws IOException {
FacesRequest facesRequest = startFacesRequest();
FacesContext facesContext = FacesContext.getCurrentInstance();
AbstractExtendedDataTable component = (AbstractExtendedDataTable) facesContext.getViewRoot().findComponent("table");
ExtendedDataTableRenderer renderer = (ExtendedDataTableRenderer) FacesContext.getCurrentInstance().getRenderKit()
.getRenderer(component.getFamily(), component.getRendererType());
Map<String, Object> column1Attributes = component.findComponent("column1").getAttributes();
Map<String, Object> column2Attributes = component.findComponent("column2").getAttributes();
String clientId = component.getClientId(facesContext);
assertNull(column1Attributes.get("filterValue"));
assertEquals("filterValue2", column2Attributes.get("filterValue"));
facesRequest.withParameter(clientId, clientId);
facesRequest.withParameter(clientId + "rich:filtering", "column1:filterValue1:null");
renderer.doDecode(facesContext, component);
assertEquals("filterValue1", column1Attributes.get("filterValue"));
assertEquals("filterValue2", column2Attributes.get("filterValue"));
assertTrue(facesContext.getPartialViewContext().getRenderIds().contains(clientId));
facesRequest.release();
}
@Test
public final void testFilteringWithClean() throws IOException {
FacesRequest facesRequest = startFacesRequest();
FacesContext facesContext = FacesContext.getCurrentInstance();
AbstractExtendedDataTable component = (AbstractExtendedDataTable) facesContext.getViewRoot().findComponent("table");
ExtendedDataTableRenderer renderer = (ExtendedDataTableRenderer) FacesContext.getCurrentInstance().getRenderKit()
.getRenderer(component.getFamily(), component.getRendererType());
Map<String, Object> column1Attributes = component.findComponent("column1").getAttributes();
Map<String, Object> column2Attributes = component.findComponent("column2").getAttributes();
String clientId = component.getClientId(facesContext);
assertNull(column1Attributes.get("filterValue"));
assertEquals("filterValue2", column2Attributes.get("filterValue"));
facesRequest.withParameter(clientId, clientId);
facesRequest.withParameter(clientId + "rich:filtering", "column1:filterValue1:true");
renderer.doDecode(facesContext, component);
assertEquals("filterValue1", column1Attributes.get("filterValue"));
assertNull(column2Attributes.get("filterValue"));
assertTrue(facesContext.getPartialViewContext().getRenderIds().contains(clientId));
facesRequest.release();
}
@Test
public final void testColumnResizing() throws IOException {
FacesRequest facesRequest = startFacesRequest();
FacesContext facesContext = FacesContext.getCurrentInstance();
AbstractExtendedDataTable component = (AbstractExtendedDataTable) facesContext.getViewRoot().findComponent("table");
ExtendedDataTableRenderer renderer = (ExtendedDataTableRenderer) FacesContext.getCurrentInstance().getRenderKit()
.getRenderer(component.getFamily(), component.getRendererType());
Map<String, Object> column1Attributes = component.findComponent("column1").getAttributes();
assertNull(column1Attributes.get("width"));
facesRequest.withParameter(component.getClientId(facesContext) + ":wi", "column1:200px");
renderer.doDecode(facesContext, component);
assertEquals("200px", column1Attributes.get("width"));
facesRequest.release();
}
@Test
public final void testColumnReordering() throws IOException {
FacesRequest facesRequest = startFacesRequest();
FacesContext facesContext = FacesContext.getCurrentInstance();
AbstractExtendedDataTable component = (AbstractExtendedDataTable) facesContext.getViewRoot().findComponent("table");
ExtendedDataTableRenderer renderer = (ExtendedDataTableRenderer) FacesContext.getCurrentInstance().getRenderKit()
.getRenderer(component.getFamily(), component.getRendererType());
Map<String, Object> componentAttributes = component.getAttributes();
String clientId = component.getClientId(facesContext);
assertNull(componentAttributes.get("columnsOrder"));
facesRequest.withParameter(clientId, clientId);
facesRequest.withParameter("rich:columnsOrder", "column2,column1");
renderer.doDecode(facesContext, component);
assertTrue(facesContext.getPartialViewContext().getRenderIds().contains(clientId));
assertTrue(Arrays.equals(new String[] { "column2", "column1" }, (String[]) componentAttributes.get("columnsOrder")));
facesRequest.release();
}
@Test
public final void testSortingWithoutClean() throws IOException {
FacesRequest facesRequest = startFacesRequest();
FacesContext facesContext = FacesContext.getCurrentInstance();
AbstractExtendedDataTable component = (AbstractExtendedDataTable) facesContext.getViewRoot().findComponent("table");
ExtendedDataTableRenderer renderer = (ExtendedDataTableRenderer) FacesContext.getCurrentInstance().getRenderKit()
.getRenderer(component.getFamily(), component.getRendererType());
Map<String, Object> column1Attributes = component.findComponent("column1").getAttributes();
Map<String, Object> column2Attributes = component.findComponent("column2").getAttributes();
String clientId = component.getClientId(facesContext);
assertNull(column1Attributes.get("sortOrder"));
assertEquals(SortOrder.ascending, column2Attributes.get("sortOrder"));
facesRequest.withParameter(clientId, clientId);
facesRequest.withParameter(clientId + "rich:sorting", "column1:null:null");
renderer.doDecode(facesContext, component);
assertEquals(SortOrder.ascending, column1Attributes.get("sortOrder"));
assertEquals(SortOrder.ascending, column2Attributes.get("sortOrder"));
assertTrue(facesContext.getPartialViewContext().getRenderIds().contains(clientId));
facesRequest.release();
}
@Test
public final void testSortingWithClean() throws IOException {
FacesRequest facesRequest = startFacesRequest();
FacesContext facesContext = FacesContext.getCurrentInstance();
AbstractExtendedDataTable component = (AbstractExtendedDataTable) facesContext.getViewRoot().findComponent("table");
ExtendedDataTableRenderer renderer = (ExtendedDataTableRenderer) FacesContext.getCurrentInstance().getRenderKit()
.getRenderer(component.getFamily(), component.getRendererType());
Map<String, Object> column1Attributes = component.findComponent("column1").getAttributes();
Map<String, Object> column2Attributes = component.findComponent("column2").getAttributes();
String clientId = component.getClientId(facesContext);
assertNull(column1Attributes.get("sortOrder"));
assertEquals(SortOrder.ascending, column2Attributes.get("sortOrder"));
facesRequest.withParameter(clientId, clientId);
facesRequest.withParameter(clientId + "rich:sorting", "column1:descending:true");
renderer.doDecode(facesContext, component);
assertEquals(SortOrder.descending, column1Attributes.get("sortOrder"));
assertEquals(SortOrder.unsorted, column2Attributes.get("sortOrder"));
assertTrue(facesContext.getPartialViewContext().getRenderIds().contains(clientId));
facesRequest.release();
}
@Test
public final void testScrolling() throws IOException {
FacesRequest facesRequest = startFacesRequest();
FacesContext facesContext = FacesContext.getCurrentInstance();
AbstractExtendedDataTable component = (AbstractExtendedDataTable) facesContext.getViewRoot().findComponent("table");
ExtendedDataTableRenderer renderer = (ExtendedDataTableRenderer) FacesContext.getCurrentInstance().getRenderKit()
.getRenderer(component.getFamily(), component.getRendererType());
Map<String, Object> componentAttributes = component.getAttributes();
String clientId = component.getClientId(facesContext);
assertNull(componentAttributes.get(AbstractExtendedDataTable.SUBMITTED_CLIENT_FIRST));
facesRequest.withParameter(clientId, clientId);
facesRequest.withParameter("rich:clientFirst", "28");
renderer.doDecode(facesContext, component);
assertEquals(28, componentAttributes.get(AbstractExtendedDataTable.SUBMITTED_CLIENT_FIRST));
assertTrue(facesContext.getPartialViewContext().getRenderIds()
.contains(clientId + "@" + AbstractExtendedDataTable.SCROLL));
facesRequest.release();
}
}