/* * Copyright 2017 OmniFaces * * 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.omnifaces.test.cdi.viewscoped; import static org.jboss.arquillian.graphene.Graphene.guardAjax; import static org.jboss.arquillian.graphene.Graphene.guardHttp; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.omnifaces.test.OmniFacesIT.WebXml.withThreeViewsInSession; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.InSequence; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.omnifaces.test.OmniFacesIT; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; public class ViewScopedIT extends OmniFacesIT { @FindBy(id="bean") private WebElement bean; @FindBy(id="messages") private WebElement messages; @FindBy(id="unload") private WebElement unload; @FindBy(id="newtab") private WebElement newtab; @FindBy(id="non-ajax:submit") private WebElement nonAjaxSubmit; @FindBy(id="non-ajax:navigate") private WebElement nonAjaxNavigate; @FindBy(id="ajax:submit") private WebElement ajaxSubmit; @FindBy(id="ajax:navigate") private WebElement ajaxNavigate; @Deployment(testable=false) public static WebArchive createDeployment() { return buildWebArchive(ViewScopedIT.class) .withWebXml(withThreeViewsInSession) .createDeployment(); } @Test @InSequence(1) public void nonAjax() { assertEquals("init", messages.getText()); String previousBean = bean.getText(); // Unload. guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("unload init", messages.getText()); // Submit then unload. guardHttp(nonAjaxSubmit).click(); assertEquals(previousBean, previousBean = bean.getText()); assertEquals("submit", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("unload init", messages.getText()); // Navigate then unload. guardHttp(nonAjaxNavigate).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("navigate destroy init", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("unload init", messages.getText()); // Submit then navigate then unload. guardHttp(nonAjaxSubmit).click(); assertEquals(previousBean, previousBean = bean.getText()); assertEquals("submit", messages.getText()); guardHttp(nonAjaxNavigate).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("navigate destroy init", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("unload init", messages.getText()); // Navigate then submit then unload. guardHttp(nonAjaxNavigate).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("navigate destroy init", messages.getText()); guardHttp(nonAjaxSubmit).click(); assertEquals(previousBean, previousBean = bean.getText()); assertEquals("submit", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("unload init", messages.getText()); } @Test @InSequence(2) public void ajax() { // Unloaded bean is from previous test. assertEquals("unload init", messages.getText()); String previousBean = bean.getText(); // Submit then unload. guardAjax(ajaxSubmit).click(); assertEquals(previousBean, previousBean = bean.getText()); assertEquals("submit", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("unload init", messages.getText()); // Navigate then unload. guardAjax(ajaxNavigate).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("navigate destroy init", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("unload init", messages.getText()); // Submit then navigate then unload. guardAjax(ajaxSubmit).click(); assertEquals(previousBean, previousBean = bean.getText()); assertEquals("submit", messages.getText()); guardAjax(ajaxNavigate).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("navigate destroy init", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("unload init", messages.getText()); // Navigate then submit then unload. guardAjax(ajaxNavigate).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("navigate destroy init", messages.getText()); guardAjax(ajaxSubmit).click(); assertEquals(previousBean, previousBean = bean.getText()); assertEquals("submit", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("unload init", messages.getText()); } @Test @InSequence(3) public void destroyViewState() { // Unloaded bean is from previous test. assertEquals("unload init", messages.getText()); String firstBean = bean.getText(); String firstTab = browser.getWindowHandle(); // Open three new tabs and close them immediately. openNewTab(newtab); assertEquals("init", messages.getText()); assertNotEquals(firstBean, bean.getText()); closeCurrentTabAndSwitchTo(firstTab); openNewTab(newtab); assertEquals("unload init", messages.getText()); // Unload was from previous tab. assertNotEquals(firstBean, bean.getText()); closeCurrentTabAndSwitchTo(firstTab); openNewTab(newtab); assertEquals("unload init", messages.getText()); // Unload was from previous tab. assertNotEquals(firstBean, bean.getText()); closeCurrentTabAndSwitchTo(firstTab); // Submit form in first tab. As JSF is instructed to store only 3 views in session, // and the @ViewScoped unload in three previously opened tabs should also physically // destroy the view state, the submit in first tab should not throw ViewExpiredException. guardAjax(ajaxSubmit).click(); assertEquals(firstBean, bean.getText()); assertEquals("unload submit", messages.getText()); // Unload was from previous tab. } }