package de.asideas.crowdsource.testsupport.pageobjects;
import de.asideas.crowdsource.presentation.FinancingRound;
import de.asideas.crowdsource.testsupport.selenium.ElementUtils;
import de.asideas.crowdsource.testsupport.selenium.SeleniumWait;
import de.asideas.crowdsource.testsupport.selenium.WebDriverProvider;
import de.asideas.crowdsource.testsupport.util.UrlProvider;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import static com.google.common.collect.Iterables.getOnlyElement;
import static org.junit.Assert.assertNotNull;
import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfAllElementsLocatedBy;
import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
@Component
public class FinancingRoundsPage {
@Autowired
private WebDriverProvider webDriverProvider;
@Autowired
private UrlProvider urlProvider;
@Autowired
private SeleniumWait seleniumWait;
public void open() {
webDriverProvider.provideDriver().get(urlProvider.applicationUrl() + "/#/financingrounds");
}
public void waitForPageLoad() {
seleniumWait.until(presenceOfElementLocated(By.cssSelector(".financingrounds tbody tr")));
}
public void startFinancingRound(DateTime endDate, int budget) {
final RemoteWebDriver webDriver = webDriverProvider.provideDriver();
final WebElement newRoundBudget = webDriver.findElement(By.className("newround-budget"));
newRoundBudget.clear();
newRoundBudget.sendKeys(Integer.toString(budget));
final DateTimeFormatter formatter = DateTimeFormat.forPattern("dd.MM.yyyy");
webDriver.executeScript("$('.newround-enddate').val('" + endDate.toString(formatter) + "')");
webDriver.executeScript("$('.newround-enddate').trigger('input')");
webDriver.findElement(By.className("newround-start")).click();
}
public FinancingRound findFinancingRound(DateTime endDate, int budget) {
return webDriverProvider.provideDriver().findElements(By.className("financinground")).stream()
.map(this::financingRound)
.filter(round -> sameDate(round.getEndDate(), endDate) && round.getBudget().equals(budget))
.findFirst()
.orElse(null);
}
public FinancingRound getFinancingRoundAt(int position) {
List<WebElement> financingRounds = webDriverProvider.provideDriver().findElements(By.className("financinground"));
if (financingRounds.size() > position) {
return financingRound(financingRounds.get(position));
} else {
return null;
}
}
public int getFinancingRoundsCount() {
return webDriverProvider.provideDriver().findElements(By.className("financinground")).size();
}
public boolean canStartFinancingRound(boolean wait) {
final RemoteWebDriver webDriver = webDriverProvider.provideDriver();
if (wait) {
seleniumWait.until(presenceOfAllElementsLocatedBy(By.className("newround-start")));
return true;
} else {
return webDriver.findElements(By.className("newround-start")).size() > 0;
}
}
private boolean sameDate(DateTime a, DateTime b) {
return a.toLocalDate().isEqual(b.toLocalDate());
}
private FinancingRound financingRound(WebElement financingRoundElement) {
// format: 16.01.15 13:35
final DateTimeFormatter formatter = DateTimeFormat.forPattern("dd.MM.yy HH:mm");
FinancingRound financingRound = new FinancingRound();
financingRound.setId(financingRoundElement.getAttribute("fr_id"));
final String startDateString = financingRoundElement.findElement(By.className("startdate")).getText();
financingRound.setStartDate(DateTime.parse(startDateString, formatter));
final String endDateString = financingRoundElement.findElement(By.className("enddate")).getText();
financingRound.setEndDate(DateTime.parse(endDateString, formatter));
final String budgetText = financingRoundElement.findElement(By.className("budget")).getText();
financingRound.setBudget(ElementUtils.parseNumber(budgetText));
boolean active = financingRoundElement.findElements(By.className("stop-button")).size() == 1;
financingRound.setActive(active);
return financingRound;
}
public String infoText() {
seleniumWait.until(presenceOfElementLocated(By.className("info")));
return webDriverProvider.provideDriver().findElement(By.className("info")).getText();
}
public String getNewRoundNotificationText() {
List<WebElement> elements = webDriverProvider.provideDriver().findElements(By.cssSelector(".newround-form .notification"));
if (elements.size() == 0) {
return null;
}
return elements.get(0).getText();
}
public WebElement getStopButtonOfFinancingRound(FinancingRound financingRound) {
WebElement financingRoundElement = webDriverProvider.provideDriver().findElementsByClassName("financinground").stream()
.filter(roundElement -> financingRound.getId().equals(roundElement.getAttribute("fr_id")))
.findFirst()
.orElse(null);
return getOnlyElement(financingRoundElement.findElements(By.cssSelector(".stop-button")), null);
}
public WebElement getStopButtonOfFinancingRoundAt(int pos) {
final FinancingRound financingRound = getFinancingRoundAt(pos);
assertNotNull(financingRound);
return getStopButtonOfFinancingRound(financingRound);
}
}