package org.vaadin.tori.tb;
import java.util.ArrayList;
import java.util.List;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import com.vaadin.testbench.By;
import com.vaadin.testbench.TestBenchTestCase;
public class ITThreadViewPermissions extends TestBenchTestCase {
private static WebDriver driver;
private static String testCategoryUrl;
private static String testCategoryTitle;
private static String testThreadUrl;
private static String testThreadTitle;
private static String otherThreadUrl;
private static String otherThreadTitle;
@BeforeClass
public static void setUp() {
driver = TBUtils.getFirefoxDriver();
driver.get(TBUtils.TARGET_URL);
List<WebElement> categoryLinks = driver.findElements(By
.cssSelector(".categoryLink a"));
WebElement firstCategory = categoryLinks.get(0);
testCategoryUrl = firstCategory.getAttribute("href").replaceAll("/#",
"#");
testCategoryTitle = firstCategory.getText();
navigateToTestCategory();
List<WebElement> threadLinks = driver.findElements(By
.cssSelector(".threadlistingrow a.topicname"));
WebElement firstThread = threadLinks.get(0);
testThreadUrl = firstThread.getAttribute("href").replaceAll("/#", "#");
testThreadTitle = firstThread.getText();
WebElement otherThread = threadLinks.get(4);
otherThreadUrl = otherThread.getAttribute("href").replaceAll("/#", "#");
otherThreadTitle = otherThread.getText();
navigateToTestThread();
}
@Test
public void testAddFiles() {
String permission = "setMayAddFilesInCategory";
Assert.assertFalse(findUpload().isEmpty());
togglePermission(false, permission);
Assert.assertTrue(findUpload().isEmpty());
togglePermission(false, permission);
}
@Test
public void testBan() {
testPostDropdownPermission(false, "setMayBan", "Ban Author");
}
@Test
public void testDeletePost() {
testPostDropdownPermission(true, "setMayDeletePost", "Delete Post...");
}
@Test
public void testEditPost() {
testPostDropdownPermission(true, "setMayEditPost", "Edit Post");
}
@Test
public void testFollow() {
String permission = "setMayFollowThread";
Assert.assertTrue(findFollowComponents().size() == 2);
navigateToTestCategory();
TBUtils.openFirstDropdown(driver, ".threadlistingrow");
Assert.assertFalse(TBUtils.getDropdownItem(driver, "Follow Topic")
.isEmpty());
navigateToTestThread();
togglePermission(false, permission);
Assert.assertTrue(findFollowComponents().isEmpty());
navigateToTestCategory();
TBUtils.openFirstDropdown(driver, ".threadlistingrow");
Assert.assertTrue(TBUtils.getDropdownItem(driver, "Follow Topic")
.isEmpty());
navigateToTestThread();
togglePermission(false, permission);
}
@Test
public void testReply() {
String permission = "setMayReplyInThread";
Assert.assertTrue(findReplyComponents().size() == 2);
togglePermission(false, permission);
Assert.assertTrue(findReplyComponents().isEmpty());
togglePermission(false, permission);
}
@Test
public void testReport() {
String permission = "setMayReportPosts";
Assert.assertTrue(findReportComponents().size() == 1);
togglePermission(false, permission);
Assert.assertTrue(findReportComponents().isEmpty());
togglePermission(false, permission);
}
@Test
public void testVote() {
String permission = "setMayVote";
Assert.assertTrue(findVoteComponents().size() == 2);
togglePermission(false, permission);
Assert.assertTrue(findVoteComponents().isEmpty());
togglePermission(false, permission);
}
@Test
public void testViewPost() {
String permission = "setMayViewPost";
Assert.assertTrue(driver.findElements(By.cssSelector(".post")).size() == 2);
togglePermission(true, permission);
Assert.assertTrue(driver.findElements(By.cssSelector(".post")).size() == 1);
togglePermission(true, permission);
}
@Test
public void testViewThread() {
String permission = "setMayViewThread";
navigateToOtherThread();
navigateToTestCategory();
Assert.assertTrue(driver
.findElements(
By.xpath("//a[text()[contains(.,'" + otherThreadTitle
+ "')]]")).size() == 1);
navigateToOtherThread();
togglePermission(false, permission);
driver.findElement(By.cssSelector(".v-Notification-error")).click();
navigateToTestCategory();
Assert.assertTrue(driver
.findElements(
By.xpath("//a[text()[contains(.,'" + otherThreadTitle
+ "')]]")).isEmpty());
navigateToTestThread();
}
private List<WebElement> findVoteComponents() {
return driver.findElements(By.cssSelector(".footer .vote"));
}
private List<WebElement> findReportComponents() {
return driver.findElements(By.cssSelector(".flagpost"));
}
private List<WebElement> findReplyComponents() {
List<WebElement> result = new ArrayList<WebElement>();
result.addAll(driver.findElements(By.cssSelector(".quoteforreply")));
result.addAll(driver.findElements(By.cssSelector(".authoringcomponent")));
return result;
}
private List<WebElement> findFollowComponents() {
List<WebElement> result = new ArrayList<WebElement>();
result.addAll(driver.findElements(By.cssSelector(".notfollowed")));
result.addAll(driver.findElements(By
.cssSelector(".buttonslayout .v-checkbox")));
return result;
}
private List<WebElement> findUpload() {
WebElement buttonsLayout = new WebDriverWait(driver, 10)
.until(ExpectedConditions.visibilityOfElementLocated(By
.cssSelector(".posteditor .buttonslayout")));
List<WebElement> upload = buttonsLayout.findElements(By
.cssSelector(".v-upload"));
return upload;
}
private void togglePermission(final boolean popupPermission,
final String permission) {
WebElement debugPopupButton = driver.findElement(By
.cssSelector(".debugcontrolpanel .v-button"));
debugPopupButton.click();
if (popupPermission) {
driver.findElement(
By.xpath("//div[text()[contains(.,'" + permission + "')]]"))
.click();
driver.findElement(By.xpath("//div[text() = '" + permission + "']"))
.click();
driver.findElement(
By.cssSelector(".postselect-content." + permission
+ " input")).click();
debugPopupButton.click();
} else {
driver.findElement(
By.xpath("//label[text()[contains(.,'" + permission
+ "')]]")).click();
debugPopupButton.click();
}
}
private void testPostDropdownPermission(final boolean popupPermission,
final String permission, final String itemCaption) {
openFirstPostDropdown();
Assert.assertFalse(TBUtils.getDropdownItem(driver, itemCaption)
.isEmpty());
togglePermission(popupPermission, permission);
openFirstPostDropdown();
Assert.assertTrue(TBUtils.getDropdownItem(driver, itemCaption)
.isEmpty());
togglePermission(popupPermission, permission);
}
private void openFirstPostDropdown() {
TBUtils.showDropdowns(driver);
WebElement until = new WebDriverWait(driver, 10)
.until(ExpectedConditions.elementToBeClickable(By
.cssSelector(".post .dropdown .v-menubar-menuitem")));
until.click();
}
private static void navigateToOtherThread() {
driver.get(otherThreadUrl);
new WebDriverWait(driver, 10).until(ExpectedConditions
.titleContains(otherThreadTitle));
}
private static void navigateToTestThread() {
driver.get(testThreadUrl);
new WebDriverWait(driver, 10).until(ExpectedConditions
.titleContains(testThreadTitle));
}
private static void navigateToTestCategory() {
driver.get(testCategoryUrl);
new WebDriverWait(driver, 10).until(ExpectedConditions
.titleContains(testCategoryTitle));
}
@AfterClass
public static void tearDown() {
driver.quit();
}
}