]> source.dussan.org Git - vaadin-framework.git/blob
ed84b9d0561131500dd2e5742e6e61f6634c4afc
[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.v7.tests.components.grid.basicfeatures.server;
17
18 import static org.hamcrest.MatcherAssert.assertThat;
19 import static org.hamcrest.core.IsNot.not;
20 import static org.junit.Assert.assertEquals;
21 import static org.junit.Assert.assertFalse;
22 import static org.junit.Assert.assertNotEquals;
23 import static org.junit.Assert.assertTrue;
24 import static org.junit.Assert.fail;
25
26 import java.util.List;
27
28 import org.junit.Test;
29 import org.openqa.selenium.NoSuchElementException;
30 import org.openqa.selenium.WebElement;
31
32 import com.vaadin.testbench.By;
33 import com.vaadin.testbench.TestBenchElement;
34 import com.vaadin.testbench.elements.GridElement.GridCellElement;
35 import com.vaadin.testbench.elements.NotificationElement;
36 import com.vaadin.v7.testbench.customelements.GridElement;
37 import com.vaadin.v7.tests.components.grid.basicfeatures.GridBasicFeatures;
38 import com.vaadin.v7.tests.components.grid.basicfeatures.GridBasicFeaturesTest;
39
40 public class GridStructureTest extends GridBasicFeaturesTest {
41
42     @Test
43     public void testRemovingAllColumns() {
44         setDebug(true);
45         openTestURL();
46         for (int i = 0; i < GridBasicFeatures.COLUMNS; ++i) {
47             selectMenuPath("Component", "Columns", "Column " + i,
48                     "Add / Remove");
49             assertFalse(isElementPresent(NotificationElement.class));
50         }
51
52         assertEquals("Headers still visible.", 0,
53                 getGridHeaderRowCells().size());
54     }
55
56     @Test
57     public void testRemoveAndAddColumn() {
58         setDebug(true);
59         openTestURL();
60
61         assertEquals("column 0",
62                 getGridElement().getHeaderCell(0, 0).getText().toLowerCase());
63         selectMenuPath("Component", "Columns", "Column 0", "Add / Remove");
64         assertEquals("column 1",
65                 getGridElement().getHeaderCell(0, 0).getText().toLowerCase());
66         selectMenuPath("Component", "Columns", "Column 0", "Add / Remove");
67
68         // Column 0 is now the last column in Grid.
69         assertEquals("Unexpected column content", "(0, 0)",
70                 getGridElement().getCell(0, 11).getText());
71     }
72
73     @Test
74     public void testRemovingColumn() throws Exception {
75         openTestURL();
76
77         // Column 0 should be visible
78         List<TestBenchElement> cells = getGridHeaderRowCells();
79         assertEquals("column 0", cells.get(0).getText().toLowerCase());
80
81         // Hide column 0
82         selectMenuPath("Component", "Columns", "Column 0", "Add / Remove");
83
84         // Column 1 should now be the first cell
85         cells = getGridHeaderRowCells();
86         assertEquals("column 1", cells.get(0).getText().toLowerCase());
87     }
88
89     @Test
90     public void testDataLoadingAfterRowRemoval() throws Exception {
91         openTestURL();
92
93         // Remove columns 2,3,4
94         selectMenuPath("Component", "Columns", "Column 2", "Add / Remove");
95         selectMenuPath("Component", "Columns", "Column 3", "Add / Remove");
96         selectMenuPath("Component", "Columns", "Column 4", "Add / Remove");
97
98         // Scroll so new data is lazy loaded
99         scrollGridVerticallyTo(1000);
100
101         // Let lazy loading do its job
102         sleep(1000);
103
104         // Check that row is loaded
105         assertThat(getGridElement().getCell(11, 0).getText(), not("..."));
106     }
107
108     @Test
109     public void testFreezingColumn() throws Exception {
110         openTestURL();
111
112         // Freeze column 1
113         selectMenuPath("Component", "State", "Frozen column count", "1");
114
115         WebElement cell = getGridElement().getCell(0, 0);
116         assertTrue(cell.getAttribute("class").contains("frozen"));
117
118         cell = getGridElement().getCell(0, 1);
119         assertFalse(cell.getAttribute("class").contains("frozen"));
120     }
121
122     @Test
123     public void testInitialColumnWidths() throws Exception {
124         openTestURL();
125
126         WebElement cell = getGridElement().getCell(0, 0);
127         assertEquals(100, cell.getSize().getWidth());
128
129         cell = getGridElement().getCell(0, 1);
130         assertEquals(150, cell.getSize().getWidth());
131
132         cell = getGridElement().getCell(0, 2);
133         assertEquals(200, cell.getSize().getWidth());
134     }
135
136     @Test
137     public void testColumnWidths() throws Exception {
138         openTestURL();
139
140         // Default column width is 100px
141         WebElement cell = getGridElement().getCell(0, 0);
142         assertEquals(100, cell.getSize().getWidth());
143
144         // Set first column to be 200px wide
145         selectMenuPath("Component", "Columns", "Column 0", "Column 0 Width",
146                 "200px");
147
148         cell = getGridElement().getCell(0, 0);
149         assertEquals(200, cell.getSize().getWidth());
150
151         // Set second column to be 150px wide
152         selectMenuPath("Component", "Columns", "Column 1", "Column 1 Width",
153                 "150px");
154         cell = getGridElement().getCell(0, 1);
155         assertEquals(150, cell.getSize().getWidth());
156
157         selectMenuPath("Component", "Columns", "Column 0", "Column 0 Width",
158                 "Auto");
159
160         // since the column 0 was previously 200, it should've shrunk when
161         // autoresizing.
162         cell = getGridElement().getCell(0, 0);
163         assertLessThan("", cell.getSize().getWidth(), 200);
164     }
165
166     @Test
167     public void testPrimaryStyleNames() throws Exception {
168         openTestURL();
169
170         // v-grid is default primary style namea
171         assertPrimaryStylename("v-grid");
172
173         selectMenuPath("Component", "State", "Primary style name",
174                 "v-escalator");
175         assertPrimaryStylename("v-escalator");
176
177         selectMenuPath("Component", "State", "Primary style name", "my-grid");
178         assertPrimaryStylename("my-grid");
179
180         selectMenuPath("Component", "State", "Primary style name", "v-grid");
181         assertPrimaryStylename("v-grid");
182     }
183
184     /**
185      * Test that the current view is updated when a server-side container change
186      * occurs (without scrolling back and forth)
187      */
188     @Test
189     public void testItemSetChangeEvent() throws Exception {
190         openTestURL();
191
192         final org.openqa.selenium.By newRow = By
193                 .xpath("//td[text()='newcell: 0']");
194
195         assertTrue("Unexpected initial state", !isElementPresent(newRow));
196
197         selectMenuPath("Component", "Body rows", "Add first row");
198         assertTrue("Add row failed", isElementPresent(newRow));
199
200         selectMenuPath("Component", "Body rows", "Remove first row");
201         assertTrue("Remove row failed", !isElementPresent(newRow));
202     }
203
204     /**
205      * Test that the current view is updated when a property's value is reflect
206      * to the client, when the value is modified server-side.
207      */
208     @Test
209     public void testPropertyValueChangeEvent() throws Exception {
210         openTestURL();
211
212         assertEquals("Unexpected cell initial state", "(0, 0)",
213                 getGridElement().getCell(0, 0).getText());
214
215         selectMenuPath("Component", "Body rows",
216                 "Modify first row (getItemProperty)");
217         assertEquals("(First) modification with getItemProperty failed",
218                 "modified: 0", getGridElement().getCell(0, 0).getText());
219
220         selectMenuPath("Component", "Body rows",
221                 "Modify first row (getContainerProperty)");
222         assertEquals("(Second) modification with getItemProperty failed",
223                 "modified: Column 0", getGridElement().getCell(0, 0).getText());
224     }
225
226     @Test
227     public void testRemovingAllItems() throws Exception {
228         openTestURL();
229
230         selectMenuPath("Component", "Body rows", "Remove all rows");
231
232         assertEquals(0, getGridElement().findElement(By.tagName("tbody"))
233                 .findElements(By.tagName("tr")).size());
234     }
235
236     @Test
237     public void testRemoveFirstRowTwice() {
238         openTestURL();
239
240         selectMenuPath("Component", "Body rows", "Remove first row");
241         selectMenuPath("Component", "Body rows", "Remove first row");
242
243         getGridElement().scrollToRow(50);
244         assertFalse("Listener setup problem occurred.",
245                 logContainsText("AssertionError: Value change listeners"));
246     }
247
248     @Test
249     public void testVerticalScrollBarVisibilityWhenEnoughRows()
250             throws Exception {
251         openTestURL();
252
253         assertTrue(verticalScrollbarIsPresent());
254
255         selectMenuPath("Component", "Body rows", "Remove all rows");
256         assertFalse(verticalScrollbarIsPresent());
257
258         selectMenuPath("Component", "Size", "HeightMode Row");
259         selectMenuPath("Component", "Size", "Height by Rows", "2.33 rows");
260         selectMenuPath("Component", "Body rows", "Add first row");
261         selectMenuPath("Component", "Body rows", "Add first row");
262         assertFalse(verticalScrollbarIsPresent());
263
264         selectMenuPath("Component", "Body rows", "Add first row");
265         assertTrue(verticalScrollbarIsPresent());
266     }
267
268     @Test
269     public void testBareItemSetChange() throws Exception {
270         openTestURL();
271         filterSomeAndAssert();
272     }
273
274     @Test
275     public void testBareItemSetChangeRemovingAllRows() throws Exception {
276         openTestURL();
277         selectMenuPath("Component", "Filter", "Impassable filter");
278         assertFalse("A notification shouldn't have been displayed",
279                 $(NotificationElement.class).exists());
280         assertTrue("No body cells should've been found", getGridElement()
281                 .getBody().findElements(By.tagName("td")).isEmpty());
282     }
283
284     @Test
285     public void testBareItemSetChangeWithMidScroll() throws Exception {
286         openTestURL();
287         getGridElement().scrollToRow(GridBasicFeatures.ROWS / 2);
288         filterSomeAndAssert();
289     }
290
291     @Test
292     public void testBareItemSetChangeWithBottomScroll() throws Exception {
293         openTestURL();
294         getGridElement().scrollToRow(GridBasicFeatures.ROWS);
295         filterSomeAndAssert();
296     }
297
298     @Test
299     public void testBareItemSetChangeWithBottomScrollAndSmallViewport()
300             throws Exception {
301         openTestURL();
302         selectMenuPath("Component", "Size", "HeightMode Row");
303         getGridElement().getRow(GridBasicFeatures.ROWS - 1);
304         // filter
305         selectMenuPath("Component", "Filter", "Column 1 starts with \"(23\"");
306
307         String text = getGridElement().getCell(10, 0).getText();
308
309         assertFalse(text.isEmpty());
310     }
311
312     private void filterSomeAndAssert() {
313         selectMenuPath("Component", "Filter", "Column 1 starts with \"(23\"");
314         boolean foundElements = false;
315         for (int row = 0; row < 100; row++) {
316             try {
317                 GridCellElement cell = getGridElement().getCell(row, 1);
318                 foundElements = true;
319                 assertTrue(
320                         "Unexpected cell contents. "
321                                 + "Did the ItemSetChange work after all?",
322                         cell.getText().startsWith("(23"));
323             } catch (NoSuchElementException e) {
324                 assertTrue("No rows were found", foundElements);
325                 return;
326             }
327         }
328         fail("unexpected amount of rows post-filter. Did the ItemSetChange work after all?");
329     }
330
331     @Test
332     public void testRemoveLastColumn() {
333         setDebug(true);
334         openTestURL();
335
336         int col = GridBasicFeatures.COLUMNS;
337         String columnName = "Column " + (GridBasicFeatures.COLUMNS - 1);
338         assertTrue(columnName + " was not present in DOM",
339                 isElementPresent(By.xpath("//th[" + col + "]/div[1]")));
340         selectMenuPath("Component", "Columns", columnName, "Add / Remove");
341         assertFalse(isElementPresent(NotificationElement.class));
342         assertFalse(columnName + " was still present in DOM",
343                 isElementPresent(By.xpath("//th[" + col + "]/div[1]")));
344     }
345
346     @Test
347     public void testReverseColumns() {
348         openTestURL();
349
350         String[] gridData = new String[GridBasicFeatures.COLUMNS];
351         GridElement grid = getGridElement();
352         for (int i = 0; i < gridData.length; ++i) {
353             gridData[i] = grid.getCell(0, i).getAttribute("innerHTML");
354         }
355
356         selectMenuPath("Component", "State", "Reverse Grid Columns");
357
358         // Compare with reversed order
359         for (int i = 0; i < gridData.length; ++i) {
360             final int column = gridData.length - 1 - i;
361             final String newText = grid.getCell(0, column)
362                     .getAttribute("innerHTML");
363             assertEquals(
364                     "Grid contained unexpected values. (0, " + column + ")",
365                     gridData[i], newText);
366         }
367     }
368
369     @Test
370     public void testAddingProperty() {
371         setDebug(true);
372         openTestURL();
373
374         assertNotEquals("property value",
375                 getGridElement().getCell(0, 0).getText());
376         selectMenuPath("Component", "Properties", "Prepend property");
377         assertEquals("property value",
378                 getGridElement().getCell(0, 0).getText());
379     }
380
381     @Test
382     public void testRemovingAddedProperty() {
383         openTestURL();
384
385         assertEquals("(0, 0)", getGridElement().getCell(0, 0).getText());
386         assertNotEquals("property value",
387                 getGridElement().getCell(0, 0).getText());
388
389         selectMenuPath("Component", "Properties", "Prepend property");
390         selectMenuPath("Component", "Properties", "Prepend property");
391
392         assertNotEquals("property value",
393                 getGridElement().getCell(0, 0).getText());
394         assertEquals("(0, 0)", getGridElement().getCell(0, 0).getText());
395     }
396
397     private boolean verticalScrollbarIsPresent() {
398         return "scroll"
399                 .equals(getGridVerticalScrollbar().getCssValue("overflow-y"));
400     }
401
402     @Test
403     public void testAddRowAboveViewport() {
404         setDebug(true);
405         openTestURL();
406
407         GridCellElement cell = getGridElement().getCell(500, 1);
408         String cellContent = cell.getText();
409         selectMenuPath("Component", "Body rows", "Add first row");
410
411         assertFalse("Error notification was present",
412                 isElementPresent(NotificationElement.class));
413
414         assertEquals("Grid scrolled unexpectedly", cellContent, cell.getText());
415     }
416
417     @Test
418     public void testRemoveAndAddRowAboveViewport() {
419         setDebug(true);
420         openTestURL();
421
422         GridCellElement cell = getGridElement().getCell(500, 1);
423         String cellContent = cell.getText();
424         selectMenuPath("Component", "Body rows", "Remove first row");
425
426         assertFalse("Error notification was present after removing row",
427                 isElementPresent(NotificationElement.class));
428
429         assertEquals("Grid scrolled unexpectedly", cellContent, cell.getText());
430
431         selectMenuPath("Component", "Body rows", "Add first row");
432
433         assertFalse("Error notification was present after adding row",
434                 isElementPresent(NotificationElement.class));
435
436         assertEquals("Grid scrolled unexpectedly", cellContent, cell.getText());
437     }
438
439     @Test
440     public void testScrollAndRemoveAll() {
441         setDebug(true);
442         openTestURL();
443
444         getGridElement().scrollToRow(500);
445         selectMenuPath("Component", "Body rows", "Remove all rows");
446
447         assertFalse("Error notification was present after removing all rows",
448                 isElementPresent(NotificationElement.class));
449
450         assertFalse(
451                 getGridElement().isElementPresent(By.vaadin("#cell[0][0]")));
452     }
453
454     private void assertPrimaryStylename(String stylename) {
455         assertTrue(getGridElement().getAttribute("class").contains(stylename));
456
457         String tableWrapperStyleName = getGridElement().getTableWrapper()
458                 .getAttribute("class");
459         assertTrue(tableWrapperStyleName.contains(stylename + "-tablewrapper"));
460
461         String hscrollStyleName = getGridElement().getHorizontalScroller()
462                 .getAttribute("class");
463         assertTrue(hscrollStyleName.contains(stylename + "-scroller"));
464         assertTrue(
465                 hscrollStyleName.contains(stylename + "-scroller-horizontal"));
466
467         String vscrollStyleName = getGridElement().getVerticalScroller()
468                 .getAttribute("class");
469         assertTrue(vscrollStyleName.contains(stylename + "-scroller"));
470         assertTrue(vscrollStyleName.contains(stylename + "-scroller-vertical"));
471     }
472
473     @Test
474     public void testScrollPosDoesNotChangeAfterStateChange() {
475         openTestURL();
476         scrollGridVerticallyTo(1000);
477         int scrollPos = getGridVerticalScrollPos();
478         selectMenuPath("Component", "Editor", "Enabled");
479         assertEquals("Scroll position should've not have changed", scrollPos,
480                 getGridVerticalScrollPos());
481     }
482
483     @Test
484     public void testReloadPage() throws InterruptedException {
485         setDebug(true);
486         openTestURL();
487
488         reopenTestURL();
489
490         // After opening the URL Grid can be stuck in a state where it thinks it
491         // should wait for something that's not going to happen.
492         testBench().disableWaitForVaadin();
493
494         // Wait until page is loaded completely.
495         int count = 0;
496         while (!$(GridElement.class).exists()) {
497             if (count == 100) {
498                 fail("Reloading page failed");
499             }
500             sleep(100);
501             ++count;
502         }
503
504         // Wait a bit more for notification to occur.
505         sleep(1000);
506
507         assertFalse("Exception occurred when reloading page",
508                 isElementPresent(NotificationElement.class));
509     }
510
511     @Test
512     public void testAddThirdRowToGrid() {
513         openTestURL();
514         selectMenuPath("Component", "Body rows", "Add third row");
515         assertFalse(logContainsText("Exception occured"));
516     }
517 }