/*
* JBoss, Home of Professional Open Source
* Copyright 2010-2014, 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.showcase.notify;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.concurrent.TimeUnit;
import org.jboss.arquillian.graphene.Graphene;
import org.jboss.arquillian.graphene.page.Page;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.interactions.Actions;
import org.richfaces.fragment.common.Utils;
import org.richfaces.fragment.notify.NotifyMessage;
import org.richfaces.showcase.AbstractWebDriverTest;
import org.richfaces.showcase.notify.page.NotifyAttributesPage;
import com.google.common.base.Predicate;
/**
* @author <a href="mailto:jhuska@redhat.com">Juraj Huska</a>
* @author <a href="mailto:jpapouse@redhat.com">Jan Papousek</a>
* @version $Revision$
*/
public class ITestNotifyAttributes extends AbstractWebDriverTest {
@Page
private NotifyAttributesPage page;
@ArquillianResource
private Actions actions;
@Test
public void testStayTime() {
checkStayTime(3500);
checkStayTime(500);
checkStayTime(1500);
}
@Test
public void testSticky() {
page.waitUntilThereIsNoNotify();
page.setSticky(true);
page.showNotification();
try {
page.waitUntilThereIsNoNotify();
fail("The notify message should not dissapear until closed manually, when @sticky=true.");
} catch (RuntimeException ex) {
}
page.getNotify().getItem(0).close();
page.waitUntilThereIsNoNotify();
}
@Test
public void testNonBlockingOpacity() {
checkNonBlockingOpacity(0.5);
checkNonBlockingOpacity(0);
checkNonBlockingOpacity(0.9);
}
@Test
public void testShowShadow() {
page.waitUntilThereIsNoNotify();
page.setShowShadow(true);
page.showNotification();
assertTrue("The shadow should be presented!", isElementPresent(page.getNotify().getItem(0).advanced()
.getShadowElement()));
page.waitUntilThereIsNoNotify();
page.setShowShadow(false);
page.showNotification();
assertFalse("The shadow should not be presented!", isElementPresent(page.getNotify().getItem(0).advanced()
.getShadowElement()));
}
@Test
public void testShowCloseButton() {
page.waitUntilThereIsNoNotify();
page.setShowCloseButton(true);
page.showNotification();
NotifyMessage message = page.getNotify().getItem(0);
actions.moveToElement(message.advanced().getSummaryElement()).perform();
assertTrue("The close button should be visible!", message.advanced().getCloseIconElement().isDisplayed());
page.waitUntilThereIsNoNotify();
page.setShowCloseButton(false);
page.showNotification();
message = page.getNotify().getItem(0);
actions.moveToElement(message.advanced().getSummaryElement()).perform();
assertFalse("The close button should not be visible!", message.advanced().getCloseIconElement().isDisplayed());
}
private void checkNonBlockingOpacity(final double opacity) {
loadPage();
page.setNonBlockingOpacity(opacity);
page.waitUntilThereIsNoNotify();
page.showNotification();
final NotifyMessage message = page.getNotify().getItem(0);
actions.moveToElement(message.advanced().getSummaryElement()).perform();
Graphene.waitAjax().withMessage("The notify should has opacity " + opacity + ".")
.pollingEvery(50, TimeUnit.MILLISECONDS).until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
double actualOpacity = Double.valueOf(message.advanced().getRootElement().getCssValue("opacity"));
boolean succcess = Math.abs(opacity - actualOpacity) <= 0.2;
if (!succcess) {
Utils.triggerJQ("mouseover", message.advanced().getSummaryElement());
}
return succcess;
}
});
}
private void checkStayTime(long stayTime) {
page.setStayTime(stayTime);
page.waitUntilThereIsNoNotify();
page.showNotification();
long timeWhenNotifyIsRendered = System.currentTimeMillis();
page.waitUntilThereIsNoNotify();
long timeWhenNotifyDisappeared = System.currentTimeMillis();
long delta = timeWhenNotifyDisappeared - timeWhenNotifyIsRendered;
// the time should be measured when the notify started to disappear,
// however
// it is measured from the time it fully disappears, therefore there is
// added delay
long moreThan = stayTime;
long lessThan = stayTime + NotifyAttributesPage.NOTIFY_DISAPPEAR_DELAY;
assertTrue("The notify message should stay on the screen more than: " + moreThan + " and less than: " + lessThan
+ " milisec, but was: " + delta + " milisec", (delta > moreThan) && (delta < lessThan));
}
}