/* * 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.viewstate; 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.withClientStateSaving; 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 ViewScopedViewStateIT 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; @FindBy(css="#non-ajax > [name='javax.faces.ViewState']") private WebElement nonAjaxViewState; @FindBy(css="#ajax > [name='javax.faces.ViewState']") private WebElement ajaxViewState; @Deployment(testable=false) public static WebArchive createDeployment() { return buildWebArchive(ViewScopedViewStateIT.class) .withWebXml(withClientStateSaving) .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("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("init", messages.getText()); // Navigate then unload. guardHttp(nonAjaxNavigate).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("navigate init", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("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 init", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("init", messages.getText()); // Navigate then submit then unload. guardHttp(nonAjaxNavigate).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("navigate init", messages.getText()); guardHttp(nonAjaxSubmit).click(); assertEquals(previousBean, previousBean = bean.getText()); assertEquals("submit", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("init", messages.getText()); } @Test @InSequence(2) public void ajax() { assertEquals("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("init", messages.getText()); // Navigate then unload. guardAjax(ajaxNavigate).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("navigate init", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("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 init", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("init", messages.getText()); // Navigate then submit then unload. guardAjax(ajaxNavigate).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("navigate init", messages.getText()); guardAjax(ajaxSubmit).click(); assertEquals(previousBean, previousBean = bean.getText()); assertEquals("submit", messages.getText()); guardHttp(unload).click(); assertNotEquals(previousBean, previousBean = bean.getText()); assertEquals("init", messages.getText()); } @Test @InSequence(3) public void copyViewState() { assertEquals("init", messages.getText()); String firstBean = bean.getText(); String firstViewState = ajaxViewState.getAttribute("value"); String firstTab = browser.getWindowHandle(); // Open new tab, copy view state from first tab into second tab and re-execute via ajax. openNewTab(newtab); String secondBean = bean.getText(); String secondViewState = nonAjaxViewState.getAttribute("value"); assertEquals("init", messages.getText()); assertNotEquals(secondBean, firstBean); assertNotEquals(secondViewState, firstViewState); executeScript("document.querySelectorAll(\"#ajax > [name='javax.faces.ViewState']\")[0].value='" + firstViewState + "'"); guardAjax(ajaxSubmit).click(); assertEquals(firstBean, bean.getText()); assertEquals("submit", messages.getText()); // Close second tab, copy view state from second tab into first tab and re-execute via non-ajax. closeCurrentTabAndSwitchTo(firstTab); executeScript("document.querySelectorAll(\"#non-ajax > [name='javax.faces.ViewState']\")[0].value='" + secondViewState + "'"); guardHttp(nonAjaxSubmit).click(); assertEquals(secondBean, bean.getText()); assertEquals("submit", messages.getText()); } }