/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* 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.uberfire.wbtest.selenium;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebElement;
import org.uberfire.wbtest.client.panels.docking.NestingScreen;
import org.uberfire.wbtest.client.perspective.TabbedPerspectiveActivity;
import static org.junit.Assert.*;
public class TabPanelTest extends AbstractSeleniumTest {
private MultiTabPanelWrapper tabPanel;
@Before
public void setup() {
driver.get(baseUrl + "#" + TabbedPerspectiveActivity.class.getName());
waitForTabbedPerspective();
tabPanel = new MultiTabPanelWrapper(driver,
TabbedPerspectiveActivity.TABBED_PANEL_ID);
// close the screen that appeared by default with the tabbed perspective
// (this also tests that the last/only tab can be closed properly)
driver.findElement(By.cssSelector("button.close")).click();
driver.manage().timeouts().implicitlyWait(1,
TimeUnit.SECONDS);
}
@Test
public void extraTabsShouldOverflowIntoDropdownWhenCreated() throws Exception {
makeOrSelectTab("one tab with long name");
makeOrSelectTab("two tab with long name");
makeOrSelectTab("three tab with long name");
makeOrSelectTab("four tab with long name");
makeOrSelectTab("five tab with long name");
makeOrSelectTab("six tab with long name");
makeOrSelectTab("seven tab with long name");
makeOrSelectTab("eight tab with long name");
makeOrSelectTab("nine tab with long name");
makeOrSelectTab("ten tab with long name");
int nonNestedTabCount = tabPanel.getNonNestedTabs().size();
int nestedTabCount = tabPanel.getNestedTabs().size();
System.out.println("extraTabsShouldOverflowIntoDropdown found " + nonNestedTabCount + " regular and " + nestedTabCount + " nested tabs");
// we added enough tabs that some of them should have overflowed into the dropdown
assertTrue(nestedTabCount > 0);
// there should be 11 tabs in total (one of them is the dropdown tab)
assertEquals(11,
nonNestedTabCount + nestedTabCount);
}
@Test
public void tabDisplayShouldBeRepeatableAtAnyWindowSize() throws Exception {
makeOrSelectTab("one");
makeOrSelectTab("two");
makeOrSelectTab("three");
makeOrSelectTab("four");
makeOrSelectTab("five");
makeOrSelectTab("six");
makeOrSelectTab("seven");
makeOrSelectTab("eight");
// we'll verify that this tab remains selected even as it's moved in and out of the dropdown
makeOrSelectTab("six");
class WindowSizeInfo {
int windowWidth;
int nonNestedTabs;
int nestedTabs;
@Override
public String toString() {
return "WindowSizeInfo [windowWidth=" + windowWidth + ", nonNestedTabs=" + nonNestedTabs + ", nestedTabs=" + nestedTabs + "]";
}
}
List<WindowSizeInfo> windowSizeInfos = new ArrayList<WindowSizeInfo>();
// set the window to various sizes and remember how many of each type of tab was displayed
// WARNING: if we make the window too narrow, the footer will squish up and get taller, interfering with
// visibility of the items in the dropdown tab. This will cause false failures on the assertion that "six"
// is still visible (selenium only returns visible text)
for (int width = 200; width <= WINDOW_WIDTH; width += 100) {
driver.manage().window().setSize(new Dimension(width,
WINDOW_HEIGHT));
WindowSizeInfo info = new WindowSizeInfo();
info.windowWidth = width;
info.nonNestedTabs = tabPanel.getNonNestedTabs().size();
info.nestedTabs = tabPanel.getNestedTabs().size();
windowSizeInfos.add(info);
// ensure selected tab has not changed due to resize
assertEquals("six",
tabPanel.getSelectedTabLabel());
}
// now revisit the various window sizes and verify we get the same result
Collections.shuffle(windowSizeInfos);
for (WindowSizeInfo info : windowSizeInfos) {
driver.manage().window().setSize(new Dimension(info.windowWidth,
WINDOW_HEIGHT));
assertEquals(info.nonNestedTabs,
tabPanel.getNonNestedTabs().size());
assertEquals(info.nestedTabs,
tabPanel.getNestedTabs().size());
// ensure selected tab has not changed due to resize
assertEquals("six",
tabPanel.getSelectedTabLabel());
}
}
@Test
public void shouldBeAbleToSelectNonNestedTab() throws Exception {
makeOrSelectTab("one");
makeOrSelectTab("two");
// this includes an implicit check that the "one" screen becomes visible
makeOrSelectTab("one");
// finally, make sure we didn't end up with a 3rd tab
assertEquals(2,
tabPanel.getNonNestedTabs().size());
}
@Test
public void shouldBeAbleToSelectNestedTab() throws Exception {
makeOrSelectTab("one tab with long name");
makeOrSelectTab("two tab with long name");
makeOrSelectTab("three tab with long name");
makeOrSelectTab("four tab with long name");
makeOrSelectTab("five tab with long name");
makeOrSelectTab("six tab with long name");
makeOrSelectTab("seven tab with long name");
makeOrSelectTab("eight tab with long name");
makeOrSelectTab("nine tab with long name");
makeOrSelectTab("ten tab with long name");
// this includes an implicit check that the "eight tab with long name" screen becomes visible
makeOrSelectTab("eight tab with long name");
assertTrue(tabPanel.getDropdownTabLabel().contains("eight tab with long name"));
// finally, make sure we didn't end up with an 11th tab (remember, one of these tabs is the dropdown tab)
assertEquals(11,
tabPanel.getNestedTabs().size() + tabPanel.getNonNestedTabs().size());
}
@Test
public void nearbyTabShouldGetSelectedWhenActiveTabIsClosed() throws Exception {
makeOrSelectTab("one");
makeOrSelectTab("two");
makeOrSelectTab("three");
makeOrSelectTab("four");
makeOrSelectTab("five");
makeOrSelectTab("six");
// close last tab
assertEquals("six",
tabPanel.getSelectedTabLabel());
tabPanel.closeSelectedTab();
assertEquals("five",
tabPanel.getSelectedTabLabel());
// close a middle tab
makeOrSelectTab("three");
tabPanel.closeSelectedTab();
assertEquals("two",
tabPanel.getSelectedTabLabel());
// close first tab
makeOrSelectTab("one");
tabPanel.closeSelectedTab();
assertEquals("two",
tabPanel.getSelectedTabLabel());
}
@Test
public void selectedTabShouldStaySelectedWhenOtherTabIsClosed() throws Exception {
makeOrSelectTab("one");
makeOrSelectTab("two");
makeOrSelectTab("three");
makeOrSelectTab("four");
makeOrSelectTab("three");
tabPanel.closeTab("one");
assertEquals("three",
tabPanel.getSelectedTabLabel());
tabPanel.closeTab("four");
assertEquals("three",
tabPanel.getSelectedTabLabel());
tabPanel.closeTab("two");
assertEquals("three",
tabPanel.getSelectedTabLabel());
assertEquals(1,
tabPanel.getNonNestedTabs().size());
}
private void waitForTabbedPerspective() {
driver.findElement(By.cssSelector("ul.nav-tabs"));
}
/**
* Creates a new NestingScreen with the given ID or selects the one that already exists, and waits for its view
* content to appear. Causes the test to fail if the screen's UI isn't visible within 5 seconds.
* @param id the place ID to give the screen. This will be the label text on the tab, as well as the text that
* appears in a GWT label in its content pane.
*/
private void makeOrSelectTab(String id) throws InterruptedException {
long startTime = System.currentTimeMillis();
driver.get(baseUrl + "#" + NestingScreen.class.getName() + "?place=" + id);
for (int i = 0; i < 100; i++) {
for (WebElement div : driver.findElements(By.cssSelector("div.gwt-Label"))) {
if (div.getText().contains(id)) {
assertTrue(div.isDisplayed());
return;
}
}
Thread.sleep(50);
}
fail("Screen content for " + id + " did not appear after " + (System.currentTimeMillis() - startTime) + "ms");
}
}