/* * Copyright 2000-2016 Vaadin Ltd. * * 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 com.vaadin.v7.tests.components.grid.basicfeatures.server; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import com.vaadin.testbench.TestBenchElement; import com.vaadin.testbench.elements.GridElement.GridCellElement; public class GridEditorUnbufferedTest extends GridEditorTest { private static final String[] TOGGLE_EDITOR_BUFFERED = new String[] { "Component", "Editor", "Buffered mode" }; private static final String[] CANCEL_EDIT = new String[] { "Component", "Editor", "Cancel edit" }; @Override @Before public void setUp() { super.setUp(); selectMenuPath(TOGGLE_EDITOR_BUFFERED); } @Test public void testEditorShowsNoButtons() { selectMenuPath(EDIT_ITEM_5); assertEditorOpen(); assertFalse("Save button should not be visible in unbuffered mode.", isElementPresent(BY_EDITOR_SAVE)); assertFalse("Cancel button should not be visible in unbuffered mode.", isElementPresent(BY_EDITOR_CANCEL)); } @Test public void testToggleEditorUnbufferedWhileOpen() { selectMenuPath(EDIT_ITEM_5); assertEditorOpen(); selectMenuPath(TOGGLE_EDITOR_BUFFERED); boolean thrown = logContainsText( "Exception occured, java.lang.IllegalStateException"); assertTrue("IllegalStateException thrown", thrown); } @Test public void testEditorMoveWithMouse() { selectMenuPath(EDIT_ITEM_5); assertEditorOpen(); String firstFieldValue = getEditorWidgets().get(0) .getAttribute("value"); assertEquals("Editor should be at row 5", "(5, 0)", firstFieldValue); getGridElement().getCell(10, 0).click(); firstFieldValue = getEditorWidgets().get(0).getAttribute("value"); assertEquals("Editor should be at row 10", "(10, 0)", firstFieldValue); } @Test public void testEditorMoveWithKeyboard() throws InterruptedException { selectMenuPath(EDIT_ITEM_100); assertEditorOpen(); getEditorWidgets().get(0).click(); new Actions(getDriver()).sendKeys(Keys.ENTER).perform(); String firstFieldValue = getEditorWidgets().get(0) .getAttribute("value"); assertEquals("Editor should move to row 101", "(101, 0)", firstFieldValue); for (int i = 0; i < 10; i++) { new Actions(getDriver()).keyDown(Keys.SHIFT).sendKeys(Keys.ENTER) .keyUp(Keys.SHIFT).perform(); firstFieldValue = getEditorWidgets().get(0).getAttribute("value"); int row = 100 - i; assertEquals("Editor should move to row " + row, "(" + row + ", 0)", firstFieldValue); } } @Test public void testValidationErrorPreventsMove() throws InterruptedException { // Because of "out of view" issues, we need to move this for easy access selectMenuPath("Component", "Columns", "Column 7", "Column 7 Width", "50px"); for (int i = 0; i < 6; ++i) { selectMenuPath("Component", "Columns", "Column 7", "Move left"); } selectMenuPath(EDIT_ITEM_5); getEditorWidgets().get(1).click(); String faultyInt = "not a number"; getEditorWidgets().get(1).sendKeys(faultyInt); getGridElement().getCell(10, 0).click(); assertEquals("Editor should not move from row 5", "(5, 0)", getEditorWidgets().get(0).getAttribute("value")); getEditorWidgets().get(1).sendKeys(Keys.chord(Keys.CONTROL, "a")); getEditorWidgets().get(1).sendKeys("5"); // FIXME: Needs to trigger one extra validation round-trip for now getGridElement().sendKeys(Keys.ENTER); getGridElement().getCell(10, 0).click(); assertEquals("Editor should move to row 10", "(10, 0)", getEditorWidgets().get(0).getAttribute("value")); } @Test public void testErrorMessageWrapperHidden() { selectMenuPath(EDIT_ITEM_5); assertEditorOpen(); WebElement editorFooter = getEditor() .findElement(By.className("v-grid-editor-footer")); assertTrue("Editor footer should not be visible when there's no error", editorFooter.getCssValue("display").equalsIgnoreCase("none")); } @Test public void testScrollEnabledOnProgrammaticOpen() { int originalScrollPos = getGridVerticalScrollPos(); selectMenuPath(EDIT_ITEM_5); scrollGridVerticallyTo(100); assertGreater( "Grid should scroll vertically while editing in unbuffered mode", getGridVerticalScrollPos(), originalScrollPos); } @Test public void testScrollEnabledOnMouseOpen() { int originalScrollPos = getGridVerticalScrollPos(); GridCellElement cell_5_0 = getGridElement().getCell(5, 0); new Actions(getDriver()).doubleClick(cell_5_0).perform(); scrollGridVerticallyTo(100); assertGreater( "Grid should scroll vertically while editing in unbuffered mode", getGridVerticalScrollPos(), originalScrollPos); } @Test public void testScrollEnabledOnKeyboardOpen() { int originalScrollPos = getGridVerticalScrollPos(); GridCellElement cell_5_0 = getGridElement().getCell(5, 0); cell_5_0.click(); new Actions(getDriver()).sendKeys(Keys.ENTER).perform(); scrollGridVerticallyTo(100); assertGreater( "Grid should scroll vertically while editing in unbuffered mode", getGridVerticalScrollPos(), originalScrollPos); } @Test public void testEditorInDisabledGrid() { selectMenuPath(EDIT_ITEM_5); selectMenuPath("Component", "State", "Enabled"); assertEditorOpen(); assertTrue("Editor text field should be disabled", null != getEditorWidgets().get(2).getAttribute("disabled")); selectMenuPath("Component", "State", "Enabled"); assertEditorOpen(); assertFalse("Editor text field should not be disabled", null != getEditorWidgets().get(2).getAttribute("disabled")); } @Test public void testMouseOpeningClosing() { getGridElement().getCell(4, 0).doubleClick(); assertEditorOpen(); selectMenuPath(CANCEL_EDIT); selectMenuPath(TOGGLE_EDIT_ENABLED); getGridElement().getCell(4, 0).doubleClick(); assertEditorClosed(); } @Test public void testProgrammaticOpeningWhenOpen() { selectMenuPath(EDIT_ITEM_5); assertEditorOpen(); assertEquals("Editor should edit row 5", "(5, 0)", getEditorWidgets().get(0).getAttribute("value")); selectMenuPath(EDIT_ITEM_100); assertEditorOpen(); assertEquals("Editor should edit row 100", "(100, 0)", getEditorWidgets().get(0).getAttribute("value")); } @Test public void testExternalValueChangePassesToEditor() { selectMenuPath(EDIT_ITEM_5); assertEditorOpen(); selectMenuPath("Component", "State", "ReactiveValueChanger"); getEditorWidgets().get(0).click(); getEditorWidgets().get(0).sendKeys("changing value"); // Focus another field to cause the value to be sent to the server getEditorWidgets().get(2).click(); assertEquals("Value of Column 2 in the editor was not changed", "Modified", getEditorWidgets().get(2).getAttribute("value")); } @Test public void testEditorClosedOnUserSort() { selectMenuPath(EDIT_ITEM_5); getGridElement().getHeaderCell(0, 0).click(); assertEditorClosed(); } @Test public void testEditorSaveOnRowChange() { // Double click sets the focus programmatically getGridElement().getCell(5, 2).doubleClick(); TestBenchElement editor = getGridElement().getEditor().getField(2); editor.clear(); // Click to ensure IE focus... editor.click(5, 5); editor.sendKeys("Foo", Keys.ENTER); assertEquals("Editor did not move.", "(6, 0)", getGridElement().getEditor().getField(0).getAttribute("value")); assertEquals("Editor field value did not update from server.", "(6, 2)", getGridElement().getEditor().getField(2).getAttribute("value")); assertEquals("Edited value was not saved.", "Foo", getGridElement().getCell(5, 2).getText()); } }