package com.vaadin.tests.htmlimport; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import org.openqa.selenium.WebElement; import com.vaadin.testbench.By; import com.vaadin.tests.tb3.MultiBrowserTest; public class HtmlImportUITest extends MultiBrowserTest { @Test public void importsLoadedAfterJs() { openTestURL(); WebElement log = findElement(By.id("clientlog")); // Defined by ui.js List messages = log.findElements(By.className("message")); // assertEquals("Some log messages are missing or extra", 3, // messages.size()); // JS before HTML, UI deps in bootstrap, rest dynamically // ui.js just sets up the logging assertEquals("ui.html", messages.get(0).getText()); // Apparently Chrome does not guarantee that "label.js" is executed // before "label.html", at least in the way we are loading HTML and JS. // Therefore, this just checks the order of the import statements List headContents = findElements(By.xpath("//head/*")); Map htmlImportIndexes = new HashMap(); Map jsIndexes = new HashMap(); for (int i = 0; i < headContents.size(); i++) { WebElement e = headContents.get(i); if (e.getTagName().equalsIgnoreCase("link") && e.getAttribute("rel").equalsIgnoreCase("import")) { // HTML import String href = e.getAttribute("href"); String file = href.substring(href.lastIndexOf('/') + 1); assertFalse("Multiple HTML imports for " + file, htmlImportIndexes.containsKey(file)); htmlImportIndexes.put(file, i); } else if (e.getTagName().equalsIgnoreCase("script")) { // JS String src = e.getAttribute("src"); String file = src.substring(src.lastIndexOf('/') + 1); assertFalse("Multiple script tags for " + file, jsIndexes.containsKey(file)); jsIndexes.put(file, i); } } // label.* + label2.* are from super + sub class loaded in // that defined order // labelX.* are on another component so it can come before or after int superJsIndex = jsIndexes.get("label.js"); int superHtmlIndex = htmlImportIndexes.get("label.html"); int subJsIndex = jsIndexes.get("label2.js"); int subHtmlIndex = htmlImportIndexes.get("label2.html"); int otherJsIndex = jsIndexes.get("labelX.js"); int otherHtmlIndex = htmlImportIndexes.get("labelX.html"); assertTrue("super js should be before super html", superJsIndex < superHtmlIndex); assertTrue("super dependencies should be before sub js", superHtmlIndex < subJsIndex); assertTrue("sub js should be before sub html", subJsIndex < subHtmlIndex); } }