package com.metservice.kanban.jwebunit; import static com.metservice.kanban.tests.util.TestUtils.createTestProject; import static org.apache.commons.io.FileUtils.deleteDirectory; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import net.sourceforge.jwebunit.junit.WebTester; import org.junit.rules.TemporaryFolder; import com.metservice.kanban.jwebunit.util.UntilTrue; import com.metservice.kanban.jwebunit.util.WaitFor; public class BoardPage { protected final WebTester tester; public static BoardPage openProject(TemporaryFolder kanbanHome, String projectName, String sourceResourcePath) throws IOException { File root = kanbanHome.getRoot(); cleanProject(kanbanHome); createTestProject(root, projectName, sourceResourcePath); return createBoardPage(projectName); } public static BoardPage createBoardPage(String projectName){ WebTester tester = new WebTester(); tester.beginAt("http://localhost:8008/kanban"); tester.clickLinkWithExactText(projectName); return new BoardPage(tester); } public static void cleanProject(TemporaryFolder kanbanHome) throws IOException { File root = kanbanHome.getRoot(); deleteDirectory(root); root.mkdir(); } public BoardPage(WebTester tester) { this.tester = tester; } public BoardPage clickBacklogButton() { tester.clickElementByXPath("//a[@id='backlog-button']"); return new BoardPage(tester); } public BoardPage clickCompleteButton() { tester.clickElementByXPath("//a[@id='complete']"); return this; } public JournalPage clickJournalButton() { tester.clickElementByXPath("//a[@id='journal']"); return new JournalPage(tester); } public PETPage clickPETButton() { tester.clickElementByXPath("//a[@id='pet']"); return new PETPage(tester); } public WallPage clickWallButton() { // tester.clickElementByXPath("//a[@id='wall']"); tester.clickLink("wall"); tester.assertTitleEquals("Kanban: wall"); return new WallPage(tester); } public AdminPage clickAdminButton() { // tester.clickElementByXPath("//a[@id='admin']"); tester.clickLink("admin"); //tester.assertTitleEquals("Kanban: admin"); return new AdminPage(tester); } public BoardPage clickAdvance(String name) { String xPath = "//td[.='" + name + " ']/../td[8]/a/img"; tester.assertElementPresentByXPath(xPath); tester.clickElementByXPath(xPath); return this; } public WorkItemPage clickAddFeatureButton() { tester.clickElementByXPath("//a[@id='add-top-level-item-button']"); return new WorkItemPage(tester); } public WorkItemPage clickAddStoryButton() { return clickAddFeatureButton(); } public WorkItemPage clickAddStoryButton(String name) { // If this fails we couldn't find the <div>. tester.assertElementPresentByXPath( "//div[@class='feature' and .//span[@class='work-item-name' and .='" + name + "']]"); // If this fails, we found the <div> but couldn't find the <img> inside it. tester.clickElementByXPath( "//div[@class='feature' and .//span[@class='work-item-name' and .='" + name + "']]//img[@class='add']"); return new WorkItemPage(tester); } public WorkItemPage clickEditStoryButton(String name) { return clickEditButton("story", name); } public WorkItemPage clickEditFeatureButton(String name) { return clickEditButton("feature", name); } private WorkItemPage clickEditButton(String workItemTypeName, String workItemName) { tester.clickElementByXPath("//td[.='" + workItemName + " ']/../td[2]/a"); return new WorkItemPage(tester); } public ChartPage clickFeatureCycleTimeChartButton() { tester.clickElementByXPath("//a[@id='cycle-time-chart-1-button']"); return new ChartPage(tester); } public ChartPage clickCumulativeFlowChartButton() { tester.clickElementByXPath("//a[@id='cumulative-flow-chart-1-button']"); return new ChartPage(tester); } public ChartPage clickBurnUpChartButton() { tester.clickElementByXPath("//a[@id='burn-up-chart-button']"); return new ChartPage(tester); } public String clickDownloadFeaturesButton() { tester.clickElementByXPath("//div[@id='feature-download-button']"); return tester.getPageSource(); } public void assertFeatureNotPresent(String name) { tester.assertElementNotPresentByXPath("//td[.='" + name + " ']"); } public void assertFeatureIsPresent(String name) { tester.assertElementPresentByXPath("//td[.='" + name + " ']"); } public void assertProjectListIsSorted(){ tester.assertElementPresentByXPath("//select[@id=\"projectPicker\"]/option[1][contains(text(), \"123\")]"); tester.assertElementPresentByXPath("//select[@id=\"projectPicker\"]/option[2][contains(text(), \"A1z\")]"); tester.assertElementPresentByXPath("//select[@id=\"projectPicker\"]/option[3][contains(text(), \"ABC\")]"); tester.assertElementPresentByXPath("//select[@id=\"projectPicker\"]/option[4][contains(text(), \"acb\")]"); tester.assertElementPresentByXPath("//select[@id=\"projectPicker\"]/option[5][contains(text(), \"XYZ\")]"); tester.assertElementPresentByXPath("//select[@id=\"projectPicker\"]/option[6][contains(text(), \"xzy\")]"); } public void assertProjectNotPresent(String name) { tester.assertElementNotPresentByXPath("//select[@id=\"projectPicker\"]/option[1][contains(text(), \""+name+"\")]"); } public void assertProjectIsPresent(String name) { tester.assertElementPresentByXPath("//select[@id=\"projectPicker\"]/option[1][contains(text(), \""+name+"\")]"); } public void assertItemNameIsIndicatedMustHave(int i) { String itemClass = tester.getElementAttributeByXPath("//td[@id='item-name-" + i + "']", "class"); assertTrue("Item should contain itemMustHave style", itemClass.contains("itemMustHave")); assertFalse("Item mustn't contain itemNiceToHave style", itemClass.contains("itemNiceToHave")); } public void assertItemNameIsIndicatedNiceToHave(int i) { String itemClass = tester.getElementAttributeByXPath("//td[@id='item-name-" + i + "']", "class"); assertTrue("Item should contain itemNiceToHave style", itemClass.contains("itemNiceToHave")); assertFalse("Item mustn't contain itemMustHave style", itemClass.contains("itemMustHave")); } public BoardPage enterQuickName(String nameValue) { tester.clickElementByXPath("//input[@id='quick-editor-name']"); tester.setTextField("name", nameValue); return this; } public BoardPage setCurrentUser(String nameValue){ tester.clickElementByXPath("//input[@id='userField']"); tester.setTextField("userField", nameValue); return this; } public void assertCompleteItemWidthIsCorrect(int item, int phase, int size) { String itemStyle = tester.getElementAttributeByXPath(".//*[@id='work-item-" + item +"']/div[" + phase + "]", "style"); assertTrue("Verify phase width in px", itemStyle.toString().contains("width:" + size + "px")); } public void assertJournalHeaderIsPresent(String headerText){ final String journalHeaderId = "journal-header-1"; tester.assertElementPresent(journalHeaderId); tester.assertTextInElement(journalHeaderId, headerText); } public void assertJournalTextIsPresent(String headerText, String journaltext){ final String journalTextId = "journal-text-1"; int timeout = 5000; int timeBetweenChecks = 100; WaitFor.me(new UntilTrue() { @Override public boolean condition() { tester.assertElementPresent(journalTextId); return true; } }, timeout, timeBetweenChecks); assertJournalHeaderIsPresent(headerText); tester.assertTextInElement(journalTextId, journaltext); } }