blob: e3020a0fb762cff76acb5a45b6ac3ee43875cc30 [file] [log] [blame]
// Copyright 2009 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.tapestry5.integration.app1;
import org.apache.tapestry5.corelib.components.Grid;
import org.apache.tapestry5.integration.TapestryCoreTestCase;
import org.testng.annotations.Test;
/**
* Tests for the {@link Grid} component.
*/
public class GridTests extends TapestryCoreTestCase
{
/**
* Basic Grid rendering, with a column render override. Also tests sorting.
*/
@Test
public void basic_grid()
{
clickThru("Grid Demo");
// "Sort Rating" via the header cell override (TAPESTRY-2081)
assertTextSeries("//th[%d]", 1, "Title", "Album", "Artist", "Genre", "Play Count", "Sort Rating");
// Strange: I thought tr[1] was the header row ???
assertTextSeries("//tr[1]/td[%d]", 1, "Bug Juice", "Late Lounge (2 of 2)", "45 Dip", "Electronica", "4", "-");
// Here were checking that the page splits are correct
clickAndWait("link=3");
// Last on page 3:
assertText("//tr[25]/td[1]", "Blood Red River");
clickAndWait("link=4");
assertText("//tr[1]/td[1]", "Devil Song");
clickAndWait("link=7");
clickAndWait("link=10");
// Here's one with a customized rating cell
assertTextSeries("//tr[25]/td[%d]", 1, "Smoked", "London (Original Motion Picture Soundtrack)",
"The Crystal Method", "Soundtrack", "30", "****");
clickAndWait("link=69");
assertText("//tr[22]/td[1]", "radioioAmbient");
// Sort ascending (and we're on the last page, with the highest
// ratings).
clickAndWait("link=Sort Rating");
assertTextSeries("//tr[22]/td[%d]", 1, "Mona Lisa Overdrive", "Labyrinth", "Juno Reactor", "Dance", "31",
"*****");
// Toggle to sort descending
clickAndWait("link=Sort Rating");
assertTextSeries("//tr[1]/td[%d]", 1, "Hey Blondie", "Out from Out Where");
clickAndWait("link=Title");
assertAttributeValueEndsWith("//img[@class='t-sort-icon']/@src", "/sort-asc.png");
assertAttribute("//img[@class='t-sort-icon']/@alt", "[Asc]");
clickAndWait("link=1");
assertText("//tr[1]/td[1]", "(untitled hidden track)");
clickAndWait("link=Title");
assertAttributeValueEndsWith("//img[@class='t-sort-icon']/@src", "/sort-desc.png");
assertAttribute("//img[@class='t-sort-icon']/@alt", "[Desc]");
clickAndWait("link=reset the Grid");
// Back to where we started.
assertTextSeries("//tr[1]/td[%d]", 1, "Bug Juice", "Late Lounge (2 of 2)", "45 Dip", "Electronica", "4", "-");
}
private void assertAttributeValueEndsWith(String attributeLocator, String suffix)
{
String value = getAttribute(attributeLocator);
assertTrue(value.endsWith(suffix), String.format("Value for attribute %s (%s) should end with '%s'.",
attributeLocator, value, suffix));
}
@Test
public void grid_remove_reorder()
{
clickThru("Grid Remove/Reorder Demo");
assertTextSeries("//th[%d]", 1, "Rating", "Title", "Album", "Artist", "Genre");
}
@Test
public void grid_set() throws Exception
{
clickThru("Grid Set Demo");
assertFalse(isTextPresent("Exception"));
// Also check for TAPESTRY-2228
assertAttribute("//table/@informal", "supported");
}
@Test
public void grid_from_explicit_interface_model()
{
clickThru("SimpleTrack Grid Demo");
assertTextSeries("//th[%d]", 1, "Title", "Album", "Rating");
assertTextSeries("//tr[1]/td[%d]", 1, "Bug Juice", "Late Lounge (2 of 2)", "-");
}
@Test
public void grid_enum_display()
{
clickThru("Grid Enum Demo", "reset");
assertTextSeries("//tr[1]/td[%d]", 1, "End World Hunger", "Medium");
assertTextSeries("//tr[2]/td[%d]", 1, "Develop Faster-Than-Light Travel", "Ultra Important");
assertTextSeries("//tr[3]/td[%d]", 1, "Cure Common Cold", "Low");
}
@Test
public void null_grid() throws Exception
{
clickThru("Null Grid");
assertTextPresent("There is no data to display.");
}
@Test
public void grid_inside_form()
{
clickThru("Grid Form Demo", "reset", "2");
// The first input field is the form's hidden field.
assertFieldValue("title", "ToDo # 6");
assertFieldValueSeries("title_%d", 0, "ToDo # 7", "ToDo # 8", "ToDo # 9", "ToDo # 10");
type("title_0", "Cure Cancer");
select("urgency_0", "Top Priority");
type("title_1", "Pay Phone Bill");
select("urgency_1", "Low");
clickAndWait(SUBMIT);
assertFieldValueSeries("title_%d", 0, "Cure Cancer", "Pay Phone Bill");
assertFieldValueSeries("urgency_%d", 0, "HIGH", "LOW");
}
@Test
public void grid_inside_form_with_encoder()
{
clickThru("Grid Form Encoder Demo", "reset", "2");
// The first input field is the form's hidden field.
// Note the difference: same data sorted differently (there's a default
// sort).
assertFieldValue("title", "ToDo # 14");
assertFieldValueSeries("title_%d", 0, "ToDo # 15", "ToDo # 16", "ToDo # 17", "ToDo # 18");
type("title_0", "Cure Cancer");
select("urgency_0", "Top Priority");
type("title_1", "Pay Phone Bill");
select("urgency_1", "Low");
clickAndWait(SUBMIT);
// Because of the sort, the updated items shift to page #1
clickAndWait("link=1");
assertFieldValue("title", "Cure Cancer");
assertFieldValue("title_0", "Pay Phone Bill");
assertFieldValue("urgency", "HIGH");
assertFieldValue("urgency_0", "LOW");
}
/**
* TAPESTRY-2021
*/
@Test
public void lean_grid()
{
clickThru("Lean Grid Demo");
assertTextSeries("//th[%d]", 1, "Title", "Album", "Artist", "Genre", "Play Count", "Rating");
// Selenium makes it pretty hard to check for a missing class.
// assertText("//th[1]/@class", "");
}
/**
* TAPESTRY-1310
*/
@Test
public void grid_row_and_column_indexes()
{
clickThru("Lean Grid Demo", "2");
// Use page 2 to ensure that the row index is the row in the Grid, not
// the row index of the data
assertText("//th[7]", "Indexes (6)");
assertText("//tr[1]/td[7]", "0,6");
assertText("//tr[2]/td[7]", "1,6");
}
/**
* TAPESTRY-1416
*/
@Test
public void adding_new_columns_to_grid_programattically()
{
clickThru("Added Grid Columns Demo", "Title Length");
assertTextSeries("//th[%d]", 1, "Title", "View", "Title Length", "Dummy");
// The rendered   becomes just a blank string.
assertTextSeries("//tr[1]/td[%d]", 1, "7", "view", "1", "");
}
@Test
public void inplace_grid()
{
clickThru("In-Place Grid Demo");
String timestamp = getText("lastupdate");
click("link=2");
sleep(100);
click("link=Album");
sleep(100);
assertEquals(getText("lastupdate"), timestamp,
"Timestamp should not have changed because updates are in-place.");
}
/**
* TAPESTRY-2502
*/
@Test
public void short_grid()
{
clickThru("Short Grid");
for (int i = 0; i < 6; i++)
{
String locator = String.format("grid.%d.0", i + 1);
String expected = String.format("Index #%d", i);
assertEquals(getTable(locator), expected);
}
String count = getEval("window.document.getElementById('grid').rows.length");
assertEquals(count, "7", "Expected seven rows: the header and six data rows.");
}
/**
* TAPESTRY-1901
*/
@Test
public void delete_rows_from_grid()
{
clickThru("Delete From Grid", "setup the database", "2");
for (int i = 6; i <= 10; i++)
clickAndWait("link=ToDo #" + i);
// A rather clumsy way to ensure we're back on the first page.
for (int i = 1; i <= 5; i++)
assertTextPresent("ToDo #" + i);
}
}