blob: 9a975ff20800bf5250c4c9156afa6b2ecec8b870 [file] [log] [blame]
// Copyright 2009-2013 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.Form;
import org.apache.tapestry5.corelib.components.Zone;
import org.testng.annotations.Test;
/**
* Tests related to the {@link Zone} component.
*/
public class ZoneTests extends App1TestCase
{
/**
* TAP5-138
*/
@Test
public void select_zone()
{
openLinks("Select Zone Demo");
select("carMaker", "Bmw");
waitForAjaxRequestsToComplete();
click(SUBMIT);
assertTextPresent("You must provide a value for Car Model.");
String selectLocator = "css=#modelZone select";
select(selectLocator, "7 Series");
clickAndWait(SUBMIT);
assertTextPresent("Car Maker: BMW");
assertTextPresent("Car Model: 7 Series");
select("carMaker", "Mercedes");
waitForAjaxRequestsToComplete();
select(selectLocator, "E-Class");
clickAndWait(SUBMIT);
assertTextPresent("Car Maker: MERCEDES");
assertTextPresent("Car Model: E-Class");
}
@Test
public void zone_updates()
{
openLinks("Zone Demo");
assertTextPresent("No name has been selected.");
click("link=Select \"Mr. <Roboto>\"");
waitForAjaxRequestsToComplete();
assertTextPresent("Selected: Mr. <Roboto>");
click("link=Direct JSON response");
}
/**
* TAP5-187
*/
@Test
public void zone_redirect_by_class()
{
openLinks("Zone Demo");
clickAndWait("link=Perform a redirect to another page");
assertText("activePageName", "nested/AssetDemo");
}
/**
* TAP5-108
*/
@Test
public void update_multiple_zones_at_once()
{
openLinks("Multiple Zone Update Demo");
String now = getText("now");
assertText("wilma", "Wilma Flintstone");
assertText("message", "");
click("link=update");
waitForElementToAppear("fredName");
assertText("fredName", "Fred Flintstone");
assertText("dino", "His dog, Dino.");
assertText("wilma", "His Wife, Wilma.");
assertText("message", "Updated");
// Ideally, we'd add checks that the JavaScript for the Palette in the
// Barney Zone was
// updated.
// Make sure it was a partial update
assertText("now", now);
}
/**
* TAP5-573
*/
@Test
public void zone_namespace_interaction_fixed()
{
openLinks("Zone/Namespace Interaction");
String outerNow = getText("outernow");
String innerNow = getText("innernow");
// If we're too fast that innernow doesn't change because its all within
// a single second.
sleep(1200);
click(SUBMIT);
waitForAjaxRequestsToComplete();
waitForElementToAppear("message");
// Make sure it was just an Ajax update.
assertText("outernow", outerNow);
assertFalse(getText("innernow").equals(innerNow));
}
@Test
public void zone_updated_event_triggered_on_client()
{
openLinks("Zone Demo");
assertText("zone-update-message", "");
click("link=Direct JSON response");
// Give it some time to process.
waitForAjaxRequestsToComplete();
assertText("zone-update-message", "Zone updated.");
}
/**
* TAP5-389
*/
@Test
public void link_submit_inside_form_that_updates_a_zone()
{
openLinks("LinkSubmit inside Zone");
String now = getText("now");
waitForElementToAppear("mySubmit");
click("//a[@id='mySubmit']");
type("value", "robot chicken");
click("//a[@id='mySubmit']");
waitForElementToAppear("outputvalue");
assertText("outputvalue", "robot chicken");
assertText("eventfired", "true");
// Make sure it was a partial update
assertText("now", now);
}
@Test
public void zone_inject_component_from_template()
{
openLinks("Inject Component Demo");
assertTextPresent(Form.class.getName() + "[form--form]");
}
/**
* TAP5-1084
*/
@Test
public void update_zone_inside_form()
{
openLinks("Zone/Form Update Demo");
click("link=Update the form");
waitForElementToAppear("updated");
type("//INPUT[@type='text']", "Tapestry 5.2");
clickAndWait(SUBMIT);
assertText("output", "Tapestry 5.2");
}
/**
* TAP5-1109
*/
@Test
public void update_to_zone_inside_form()
{
openLinks("MultiZone Update inside a Form");
select("selectValue1", "3 pre ajax");
waitForAjaxRequestsToComplete();
select("//div[@id='select2ValueZone']//select", "4 post ajax, number 013, retention policy RUNTIME");
}
@Test
public void multi_zone_update_using_string_in_loop()
{
openLinks("MultiZone String Body Demo");
String[] numbers = new String[]{
"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"
};
for (int i = 0; i <= 10; i++)
{
assertText("row-" + i, numbers[i]);
}
click("link=click 7");
waitForElementToAppear("row-7");
// 0-6 are unchanged
for (int i = 0; i < 7; i++)
{
assertText("row-" + i, numbers[i]);
}
// 7+ are modified
for (int i = 7; i <= 10; i++)
{
assertText("row-" + i, i + " is the integer value");
}
click("link=Reset Zones");
waitForElementToAppear("wholeLoopZone");
// all elements reset via AJAX
for (int i = 0, numbersLength = numbers.length; i < numbersLength; i++)
{
assertText("row-" + i, numbers[i]);
}
}
private void assertCSSStartsWith(String elementId, String cssProperty, String expected)
{
String actual = selenium.getEval(String.format("window.document.defaultView.getComputedStyle(window.document.getElementById('%s'), null).getPropertyValue('%s')",
elementId, cssProperty));
assertTrue(actual.startsWith("underline"), String.format("CSS property '%s' of '%s' should start with '%s'.", cssProperty, elementId, expected));
}
private void assertCSS(String elementId, String cssProperty, String expected)
{
// See http://groups.google.com/group/selenium-users/browse_thread/thread/f21e0a43c9913d42
String actual = selenium.getEval(String.format("window.document.defaultView.getComputedStyle(window.document.getElementById('%s'), null).getPropertyValue('%s')",
elementId, cssProperty));
assertEquals(actual, expected, String.format("CSS property '%s' of '%s' should be '%s'.", cssProperty, elementId, expected));
}
@Test
public void css_insertion_point()
{
openLinks("Zone Demo");
click("link=Select \"CSS Injection\"");
// First check that the update arrived
waitForElementToAppear("demo-aip");
assertText("demo-aip", "This should be styled GREEN.");
// Next see if we can verify that the presentation matches the exceptations; greend and underlined. Underlined from
// zonedemo-viaajax.css; green from zonedmeo-overrides.css (not blue as defined in zonedemo-viaajax.css).
assertCSS("demo-aip", "color", "rgb(0, 128, 0)");
assertCSSStartsWith("demo-aip", "text-decoration", "underline");
}
/**
* TAP5-1890
*/
@Test
public void update_zone_with_empty_body()
{
openLinks("Zone Demo");
assertText("zone-update-message", "");
click("link=Update zone with empty body");
waitForAjaxRequestsToComplete();
assertText("zone-update-message", "Zone updated.");
}
/**
* TAP5-2330
*/
@Test
public void update_zone_with_no_clientid()
{
openLinks("Zone Demo");
assertText("zone-update-message", "");
click("link=Update via AjaxResponseRenderer");
waitForAjaxRequestsToComplete();
assertText("zone-update-message", "Zone updated.");
assertEquals("Selected: AjaxResponseRenderer", getText("output"));
}
}