package it.com.atlassian.labs.speakeasy;
import com.atlassian.pageobjects.PageBinder;
import com.atlassian.pageobjects.ProductInstance;
import com.atlassian.pageobjects.binder.WaitUntil;
import com.atlassian.webdriver.AtlassianWebDriver;
import com.atlassian.webdriver.utils.JavaScriptUtils;
import com.google.common.base.Function;
import org.apache.http.impl.client.RedirectLocations;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import javax.annotation.Nullable;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
public class IdeDialog
{
@Inject
private AtlassianWebDriver driver;
@Inject
private ProductInstance productInstance;
@Inject
private PageBinder binder;
@FindBy(id="ide-dialog")
private WebElement dialogElement;
@FindBy(id="ide-editor")
private WebElement ideEditor;
@FindBy(id="ide-browser")
private WebElement ideBrowser;
@FindBy(id="ide-status-text")
private WebElement ideStatus;
@FindBy(className="ide-done")
private WebElement ideDoneLink;
private final String pluginKey;
private final boolean readOnly;
public IdeDialog(String pluginKey, Boolean readOnly)
{
this.pluginKey = pluginKey;
this.readOnly = readOnly;
}
@WaitUntil
public void waitUntilOpen()
{
driver.waitUntilElementIsVisible(By.id("ide-main-content"));
driver.waitUntil(new Function()
{
public Object apply(Object from)
{
System.out.print(".");
return driver.executeScript("return speakeasyRequire.run('speakeasy/user/ide/ide').text() != null");
}
});
}
public List<String> getFileNames()
{
List<String> names = new ArrayList<String>();
for (WebElement li : ideBrowser.findElements(By.className("editable-bespin")))
{
names.add(li.getAttribute("id"));
}
return names;
}
public String getFileContents(String fileName)
{
ideBrowser.findElement(By.id(fileName)).click();
driver.waitUntil(new Function()
{
public Object apply(@Nullable Object from)
{
return getStatus().contains("Loaded");
}
});
return getEditorContents();
}
public IdeDialog editAndSaveFile(String fileName, String contents)
{
return editAndSaveFile(fileName, contents, "saved");
}
public IdeDialog editAndSaveFile(String fileName, String contents, final String statusExpected)
{
if (readOnly)
{
throw new IllegalStateException("Can't edit file in readonly mode");
}
ideBrowser.findElement(By.id(fileName)).click();
driver.waitUntil(new Function()
{
public Object apply(Object from)
{
String editorText = getEditorContents();
return editorText != null && editorText.length() > 0;
}
});
driver.executeScript("speakeasyRequire.run('speakeasy/user/ide/ide').text(arguments[0])", contents);
dialogElement.findElement(By.className("ide-save")).click();
driver.waitUntil(new Function()
{
public Object apply(Object from)
{
return ideStatus.getText().contains(statusExpected);
}
});
return this;
}
public SpeakeasyUserPage done()
{
ideDoneLink.click();
return binder.bind(SpeakeasyUserPage.class);
}
private String getEditorContents()
{
return JavaScriptUtils.execute("return speakeasyRequire.run('speakeasy/user/ide/ide').text()", driver);
}
public String getStatus()
{
return ideStatus.getText();
}
}