]> source.dussan.org Git - vaadin-framework.git/blob
b4acb7f161c2386513f8ae312c6683f429ddaf63
[vaadin-framework.git] /
1 /*
2  * Copyright 2000-2016 Vaadin Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License. You may obtain a copy of
6  * the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 package com.vaadin.tests.components.grid.basicfeatures.server;
17
18 import static org.junit.Assert.assertFalse;
19 import static org.junit.Assert.assertTrue;
20
21 import java.util.List;
22
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.openqa.selenium.By;
26 import org.openqa.selenium.WebElement;
27 import org.openqa.selenium.interactions.Actions;
28
29 import com.vaadin.testbench.TestBenchElement;
30 import com.vaadin.testbench.elements.GridElement.GridCellElement;
31 import com.vaadin.tests.components.grid.basicfeatures.GridBasicFeaturesTest;
32
33 /**
34  * Tests that Grid columns can be reordered by user with drag and drop #16643.
35  *
36  * @author Vaadin Ltd
37  */
38 public class GridColumnReorderTest extends GridBasicFeaturesTest {
39
40     private static final String[] COLUMN_REORDERING_PATH = { "Component",
41             "State", "Column Reordering Allowed" };
42     private static final String[] COLUMN_REORDER_LISTENER_PATH = { "Component",
43             "State", "ColumnReorderListener" };
44
45     @Before
46     public void setUp() {
47         setDebug(true);
48     }
49
50     @Test
51     public void testColumnReordering_firstColumnDroppedOnThird_dropOnLeftSide() {
52         // given
53         openTestURL();
54         assertColumnHeaderOrder(0, 1, 2);
55         toggleColumnReordering();
56
57         // when
58         dragAndDropDefaultColumnHeader(0, 2, CellSide.LEFT);
59
60         // then
61         assertColumnHeaderOrder(1, 0, 2);
62     }
63
64     @Test
65     public void testColumnReordering_firstColumnDroppedOnThird_dropOnRightSide() {
66         // given
67         openTestURL();
68         assertColumnHeaderOrder(0, 1, 2);
69         toggleColumnReordering();
70
71         // when
72         dragAndDropDefaultColumnHeader(0, 2, CellSide.RIGHT);
73
74         // then
75         assertColumnHeaderOrder(1, 2, 0);
76     }
77
78     @Test
79     public void testColumnReordering_reorderingTwiceBackForth_reordered() {
80         // given
81         openTestURL();
82         selectMenuPath("Component", "Size", "Width", "800px");
83         assertColumnHeaderOrder(0, 1, 2, 3, 4);
84         toggleColumnReordering();
85
86         // when
87         dragAndDropDefaultColumnHeader(2, 0, CellSide.LEFT);
88
89         // then
90         assertColumnHeaderOrder(2, 0, 1, 3, 4);
91
92         // when
93         dragAndDropDefaultColumnHeader(1, 3, CellSide.RIGHT);
94
95         // then
96         assertColumnHeaderOrder(2, 1, 3, 0);
97     }
98
99     @Test
100     public void testColumnReordering_notEnabled_noReordering() {
101         // given
102         openTestURL();
103         assertColumnHeaderOrder(0, 1, 2);
104
105         // when
106         dragAndDropDefaultColumnHeader(0, 2, CellSide.RIGHT);
107
108         // then
109         assertColumnHeaderOrder(0, 1, 2);
110     }
111
112     @Test
113     public void testColumnReordering_userChangesRevertedByServer_columnsAreUpdated() {
114         // given
115         openTestURL();
116         assertColumnHeaderOrder(0, 1, 2);
117         toggleColumnReordering();
118
119         // when
120         dragAndDropDefaultColumnHeader(0, 2, CellSide.LEFT);
121         assertColumnHeaderOrder(1, 0, 2);
122         moveColumnManuallyLeftByOne(0);
123
124         // then
125         assertColumnHeaderOrder(0, 1, 2);
126     }
127
128     @Test
129     public void testColumnReordering_concurrentUpdatesFromServer_columnOrderFromServerUsed() {
130         // given
131         openTestURL();
132         assertColumnHeaderOrder(0, 1, 2);
133         toggleColumnReordering();
134
135         // when
136         selectMenuPath(new String[] { "Component", "Internals",
137                 "Update column order without updating client" });
138         dragAndDropDefaultColumnHeader(2, 0, CellSide.LEFT);
139
140         // then
141         assertColumnHeaderOrder(1, 0, 2);
142     }
143
144     @Test
145     public void testColumnReordering_triggersReorderEvent_isUserInitiated() {
146         // given
147         openTestURL();
148         toggleColumnReordering();
149
150         // when
151         toggleColumnReorderListener();
152         dragAndDropDefaultColumnHeader(0, 2, CellSide.LEFT);
153
154         // then
155         assertColumnReorderEvent(true);
156     }
157
158     @Test
159     public void testColumnReordering_addAndRemoveListener_registerUnRegisterWorks() {
160         // given
161         openTestURL();
162         toggleColumnReordering();
163         dragAndDropDefaultColumnHeader(0, 2, CellSide.LEFT);
164         assertNoColumnReorderEvent();
165
166         // when
167         toggleColumnReorderListener();
168         dragAndDropDefaultColumnHeader(0, 2, CellSide.RIGHT);
169
170         // then
171         assertColumnReorderEvent(true);
172
173         // when
174         toggleColumnReorderListener();
175         dragAndDropDefaultColumnHeader(0, 3, CellSide.LEFT);
176
177         // then
178         assertNoColumnReorderEvent();
179     }
180
181     @Test
182     public void testColumnReorderingEvent_serverSideReorder_triggersReorderEvent() {
183         openTestURL();
184
185         // when
186         toggleColumnReorderListener();
187         moveColumnManuallyLeftByOne(3);
188
189         // then
190         assertColumnReorderEvent(false);
191     }
192
193     @Test
194     public void testColumnReorder_draggingFrozenColumns_impossible() {
195         // given
196         openTestURL();
197         toggleColumnReordering();
198         setFrozenColumns(2);
199         assertColumnHeaderOrder(0, 1, 2, 3);
200
201         // when
202         dragAndDropDefaultColumnHeader(0, 2, CellSide.LEFT);
203
204         // then
205         assertColumnHeaderOrder(0, 1, 2, 3);
206         assertTrue(getGridElement().getHeaderCell(0, 0).isFrozen());
207         assertTrue(getGridElement().getHeaderCell(0, 1).isFrozen());
208         assertFalse(getGridElement().getHeaderCell(0, 2).isFrozen());
209     }
210
211     @Test
212     public void testColumnReorder_draggingColumnOnTopOfFrozenColumn_columnDroppedRightOfFrozenColumns() {
213         // given
214         openTestURL();
215         toggleColumnReordering();
216         setFrozenColumns(1);
217         assertColumnHeaderOrder(0, 1, 2, 3);
218
219         // when
220         dragAndDropDefaultColumnHeader(2, 0, CellSide.LEFT);
221
222         // then
223         assertColumnHeaderOrder(0, 2, 1, 3);
224     }
225
226     @Test
227     public void testColumnReorder_draggingColumnLeftOfMultiSelectionColumn_columnDroppedRight() {
228         // given
229         openTestURL();
230         toggleColumnReordering();
231         selectMenuPath("Component", "State", "Selection mode", "multi");
232         List<TestBenchElement> gridHeaderRowCells = getGridHeaderRowCells();
233         assertTrue(gridHeaderRowCells.get(0).getText().equals(""));
234         assertColumnHeader("Column 0", gridHeaderRowCells.get(1));
235         assertColumnHeader("Column 1", gridHeaderRowCells.get(2));
236         assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
237
238         // when
239         dragAndDropDefaultColumnHeader(2, 0, CellSide.LEFT);
240
241         // then
242         gridHeaderRowCells = getGridHeaderRowCells();
243         assertTrue(gridHeaderRowCells.get(0).getText().equals(""));
244         assertColumnHeader("Column 1", gridHeaderRowCells.get(1));
245         assertColumnHeader("Column 0", gridHeaderRowCells.get(2));
246         assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
247     }
248
249     @Test
250     public void testColumnReorder_multiSelectionAndFrozenColumns_columnDroppedRight() {
251         // given
252         openTestURL();
253         toggleColumnReordering();
254         selectMenuPath("Component", "State", "Selection mode", "multi");
255         setFrozenColumns(1);
256         List<TestBenchElement> gridHeaderRowCells = getGridHeaderRowCells();
257         assertTrue(gridHeaderRowCells.get(0).getText().equals(""));
258         assertColumnHeader("Column 0", gridHeaderRowCells.get(1));
259         assertColumnHeader("Column 1", gridHeaderRowCells.get(2));
260         assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
261
262         // when
263         dragAndDropDefaultColumnHeader(3, 0, CellSide.LEFT);
264
265         // then
266         gridHeaderRowCells = getGridHeaderRowCells();
267         assertTrue(gridHeaderRowCells.get(0).getText().equals(""));
268         assertColumnHeader("Column 0", gridHeaderRowCells.get(1));
269         assertColumnHeader("Column 2", gridHeaderRowCells.get(2));
270         assertColumnHeader("Column 1", gridHeaderRowCells.get(3));
271     }
272
273     @Test
274     public void testColumnReordering_multiSelectionColumnNotFrozen_stillCantDropLeftSide() {
275         // given
276         openTestURL();
277         toggleColumnReordering();
278         selectMenuPath("Component", "State", "Selection mode", "multi");
279         setFrozenColumns(-1);
280         List<TestBenchElement> gridHeaderRowCells = getGridHeaderRowCells();
281         assertTrue(gridHeaderRowCells.get(0).getText().equals(""));
282         assertColumnHeader("Column 0", gridHeaderRowCells.get(1));
283         assertColumnHeader("Column 1", gridHeaderRowCells.get(2));
284         assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
285
286         // when
287         dragAndDropDefaultColumnHeader(2, 0, CellSide.LEFT);
288
289         // then
290         gridHeaderRowCells = getGridHeaderRowCells();
291         assertTrue(gridHeaderRowCells.get(0).getText().equals(""));
292         assertColumnHeader("Column 1", gridHeaderRowCells.get(1));
293         assertColumnHeader("Column 0", gridHeaderRowCells.get(2));
294         assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
295     }
296
297     @Test
298     public void testColumnReordering_twoHeaderRows_dndReorderingPossibleFromFirstRow() {
299         // given
300         openTestURL();
301         toggleColumnReordering();
302         selectMenuPath("Component", "Header", "Append row");
303         assertColumnHeaderOrder(0, 1, 2, 3);
304
305         // when
306         dragAndDropColumnHeader(0, 0, 2, CellSide.RIGHT);
307
308         // then
309         assertColumnHeaderOrder(1, 2, 0, 3);
310     }
311
312     @Test
313     public void testColumnReordering_twoHeaderRows_dndReorderingPossibleFromSecondRow() {
314         // given
315         openTestURL();
316         toggleColumnReordering();
317         selectMenuPath("Component", "Header", "Append row");
318         assertColumnHeaderOrder(0, 1, 2, 3);
319
320         // when
321         dragAndDropColumnHeader(1, 0, 2, CellSide.RIGHT);
322
323         // then
324         assertColumnHeaderOrder(1, 2, 0, 3);
325     }
326
327     @Test
328     public void testColumnReordering_bigWidth_dragElementPositionCorrect() {
329         openTestURL();
330         toggleColumnReordering();
331         selectMenuPath("Component", "Size", "Width", "900px");
332         assertColumnHeaderOrder(0, 1, 2, 3);
333
334         GridCellElement draggedHeaderCell = getGridElement().getHeaderCell(0,
335                 1);
336         final int xOffset = 500;
337         new Actions(getDriver()).moveToElement(draggedHeaderCell, 20, 10)
338                 .clickAndHold().moveByOffset(xOffset, 0).build().perform();
339
340         WebElement floatingDragElement = findElement(
341                 By.className("dragged-column-header"));
342
343         int expectedLeft = draggedHeaderCell.getLocation().getX() + xOffset + 20
344                 - (floatingDragElement.getSize().getWidth() / 2);
345         int realLeft = floatingDragElement.getLocation().getX();
346
347         assertTrue(
348                 "Dragged element location wrong, expected " + expectedLeft
349                         + " was " + realLeft,
350                 Math.abs(expectedLeft - realLeft) < 10);
351     }
352
353     @Test
354     public void testDropMarker_sidebarOpenButtonVisible_dropMarkerOnCorrectPosition() {
355         // using runo since there the sidebar opening button is wider than the
356         // scroll deco, and because using Valo has some TB issues
357         openTestURL("theme=runo");
358
359         selectMenuPath("Component", "Size", "Width", "100%");
360         selectMenuPath("Component", "Columns", "All columns hidable");
361         toggleColumnReordering();
362         scrollGridHorizontallyTo(100000);
363
364         new Actions(getDriver()).clickAndHold(getDefaultColumnHeader(10))
365                 .moveByOffset(800, 0).build().perform();
366
367         WebElement dragDropMarker = findElement(
368                 By.className("v-grid-drop-marker"));
369         WebElement sidebar = findElement(By.className("v-grid-sidebar"));
370
371         int dragDropMarkerX = dragDropMarker.getLocation().getX();
372         int sidebarX = sidebar.getLocation().getX();
373         assertTrue(
374                 "Drop marker misplaced " + dragDropMarkerX
375                         + " compared to sidebar open button " + sidebarX,
376                 dragDropMarkerX <= sidebarX);
377     }
378
379     private void toggleColumnReordering() {
380         selectMenuPath(COLUMN_REORDERING_PATH);
381     }
382
383     private void toggleColumnReorderListener() {
384         selectMenuPath(COLUMN_REORDER_LISTENER_PATH);
385     }
386
387     private void moveColumnManuallyLeftByOne(int index) {
388         selectMenuPath(new String[] { "Component", "Columns", "Column " + index,
389                 "Move left" });
390     }
391
392     private void assertColumnReorderEvent(boolean userOriginated) {
393         final String logRow = getLogRow(0);
394         assertTrue(logRow.contains(
395                 "Columns reordered, userOriginated: " + userOriginated));
396     }
397
398     private void assertNoColumnReorderEvent() {
399         final String logRow = getLogRow(0);
400         assertFalse(logRow.contains("Columns reordered"));
401     }
402
403 }