mirror of
https://github.com/apache/zeppelin
synced 2026-05-24 09:38:26 +00:00
selenium test case
This commit is contained in:
parent
3149417c99
commit
41bb23b828
4 changed files with 219 additions and 3 deletions
|
|
@ -38,7 +38,7 @@ import static org.openqa.selenium.Keys.ENTER;
|
|||
import static org.openqa.selenium.Keys.SHIFT;
|
||||
|
||||
abstract public class AbstractZeppelinIT {
|
||||
protected WebDriver driver;
|
||||
protected static WebDriver driver;
|
||||
|
||||
protected final static Logger LOG = LoggerFactory.getLogger(AbstractZeppelinIT.class);
|
||||
protected static final long MAX_IMPLICIT_WAIT = 30;
|
||||
|
|
@ -114,7 +114,7 @@ abstract public class AbstractZeppelinIT {
|
|||
});
|
||||
}
|
||||
|
||||
protected boolean endToEndTestEnabled() {
|
||||
protected static boolean endToEndTestEnabled() {
|
||||
return null != System.getenv("TEST_SELENIUM");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -125,7 +125,8 @@ public class WebDriverManager {
|
|||
(new WebDriverWait(driver, 5)).until(new ExpectedCondition<Boolean>() {
|
||||
@Override
|
||||
public Boolean apply(WebDriver d) {
|
||||
return d.findElement(By.partialLinkText("Create new note"))
|
||||
return d.findElement(By.xpath(
|
||||
"//div[contains(@class, 'navbar-collapse')]//li//a[contains(.,'Connected')]"))
|
||||
.isDisplayed();
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -39,4 +39,11 @@ public class ZeppelinITUtils {
|
|||
LOG.info("Finished.");
|
||||
}
|
||||
}
|
||||
|
||||
public static void restartZeppelin() {
|
||||
CommandExecutor.executeCommandLocalHost("../bin/zeppelin-daemon.sh restart",
|
||||
false, ProcessData.Types_Of_Data.OUTPUT);
|
||||
//wait for server to start.
|
||||
sleep(5000, false);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,208 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.apache.zeppelin.integration;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.zeppelin.AbstractZeppelinIT;
|
||||
import org.apache.zeppelin.WebDriverManager;
|
||||
import org.apache.zeppelin.ZeppelinITUtils;
|
||||
import org.apache.zeppelin.conf.ZeppelinConfiguration;
|
||||
import org.hamcrest.CoreMatchers;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.ErrorCollector;
|
||||
import org.openqa.selenium.By;
|
||||
import org.openqa.selenium.Keys;
|
||||
import org.openqa.selenium.WebElement;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* Created for org.apache.zeppelin.integration on 13/06/16.
|
||||
*/
|
||||
public class AuthenticationIT extends AbstractZeppelinIT {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(AuthenticationIT.class);
|
||||
|
||||
@Rule
|
||||
public ErrorCollector collector = new ErrorCollector();
|
||||
|
||||
static String authShiro = "[users]\n" +
|
||||
"admin = password1, admin\n" +
|
||||
"finance1 = finance1, finance\n" +
|
||||
"finance2 = finance2, finance\n" +
|
||||
"hr1 = hr1, hr\n" +
|
||||
"hr2 = hr2, hr\n" +
|
||||
"[main]\n" +
|
||||
"sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager\n" +
|
||||
"securityManager.sessionManager = $sessionManager\n" +
|
||||
"securityManager.sessionManager.globalSessionTimeout = 86400000\n" +
|
||||
"shiro.loginUrl = /api/login\n" +
|
||||
"[roles]\n" +
|
||||
"admin = *\n" +
|
||||
"hr = *\n" +
|
||||
"finance = *\n" +
|
||||
"[urls]\n" +
|
||||
"/api/version = anon\n" +
|
||||
"/** = authc";
|
||||
|
||||
static String originalShiro = "";
|
||||
|
||||
|
||||
@BeforeClass
|
||||
public static void startUp() {
|
||||
if (!endToEndTestEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
ZeppelinConfiguration conf = ZeppelinConfiguration.create();
|
||||
File file = new File(conf.getShiroPath());
|
||||
originalShiro = StringUtils.join(FileUtils.readLines(file, "UTF-8"), "\n");
|
||||
FileUtils.write(file, authShiro, "UTF-8");
|
||||
} catch (IOException e) {
|
||||
LOG.error("Error in AuthenticationIT startUp::", e);
|
||||
}
|
||||
ZeppelinITUtils.restartZeppelin();
|
||||
driver = WebDriverManager.getWebDriver();
|
||||
}
|
||||
|
||||
|
||||
@AfterClass
|
||||
public static void tearDown() {
|
||||
if (!endToEndTestEnabled()) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
ZeppelinConfiguration conf = ZeppelinConfiguration.create();
|
||||
File file = new File(conf.getShiroPath());
|
||||
FileUtils.write(file, originalShiro, "UTF-8");
|
||||
} catch (IOException e) {
|
||||
LOG.error("Error in AuthenticationIT tearDown::", e);
|
||||
}
|
||||
ZeppelinITUtils.restartZeppelin();
|
||||
driver.quit();
|
||||
}
|
||||
|
||||
private void authenticationUser(String userName, String password) {
|
||||
pollingWait(By.xpath(
|
||||
"//div[contains(@class, 'navbar-collapse')]//li//button[contains(.,'Login')]"),
|
||||
MAX_BROWSER_TIMEOUT_SEC).click();
|
||||
sleep(1000, false);
|
||||
pollingWait(By.xpath("//*[@id='userName']"), MAX_BROWSER_TIMEOUT_SEC).sendKeys(userName);
|
||||
pollingWait(By.xpath("//*[@id='password']"), MAX_BROWSER_TIMEOUT_SEC).sendKeys(password);
|
||||
pollingWait(By.xpath("//*[@id='NoteImportCtrl']//button[contains(.,'Login')]"),
|
||||
MAX_BROWSER_TIMEOUT_SEC).click();
|
||||
sleep(1000, false);
|
||||
}
|
||||
|
||||
private void logoutUser(String userName) {
|
||||
sleep(500, false);
|
||||
driver.findElement(By.xpath("//div[contains(@class, 'navbar-collapse')]//li[contains(.,'" +
|
||||
userName + "')]")).click();
|
||||
sleep(500, false);
|
||||
driver.findElement(By.xpath("//div[contains(@class, 'navbar-collapse')]//li[contains(.,'" +
|
||||
userName + "')]//a[@ng-click='logout()']")).click();
|
||||
sleep(5000, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleAuthentication() throws Exception {
|
||||
if (!endToEndTestEnabled()) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
AuthenticationIT authenticationIT = new AuthenticationIT();
|
||||
authenticationIT.authenticationUser("admin", "password1");
|
||||
|
||||
collector.checkThat("Check is user logged in", true,
|
||||
CoreMatchers.equalTo(driver.findElement(By.partialLinkText("Create new note"))
|
||||
.isDisplayed()));
|
||||
|
||||
authenticationIT.logoutUser("admin");
|
||||
} catch (Exception e) {
|
||||
handleException("Exception in ParagraphActionsIT while testCreateNewButton ", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGroupPermission() throws Exception {
|
||||
if (!endToEndTestEnabled()) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
AuthenticationIT authenticationIT = new AuthenticationIT();
|
||||
authenticationIT.authenticationUser("finance1", "finance1");
|
||||
createNewNote();
|
||||
|
||||
String noteId = driver.getCurrentUrl().substring(driver.getCurrentUrl().lastIndexOf("/") + 1);
|
||||
|
||||
pollingWait(By.xpath("//span[@tooltip='Note permissions']"), MAX_BROWSER_TIMEOUT_SEC).click();
|
||||
pollingWait(By.xpath("//input[@ng-model='permissions.owners']"), MAX_BROWSER_TIMEOUT_SEC)
|
||||
.sendKeys("finance");
|
||||
pollingWait(By.xpath("//input[@ng-model='permissions.readers']"), MAX_BROWSER_TIMEOUT_SEC)
|
||||
.sendKeys("finance");
|
||||
pollingWait(By.xpath("//input[@ng-model='permissions.writers']"), MAX_BROWSER_TIMEOUT_SEC)
|
||||
.sendKeys("finance");
|
||||
pollingWait(By.xpath("//button[@ng-click='savePermissions()']"), MAX_BROWSER_TIMEOUT_SEC)
|
||||
.sendKeys(Keys.ENTER);
|
||||
|
||||
pollingWait(By.xpath("//div[@class='modal-dialog'][contains(.,'Permissions Saved ')]" +
|
||||
"//div[@class='modal-footer']//button[contains(.,'OK')]"),
|
||||
MAX_BROWSER_TIMEOUT_SEC).click();
|
||||
authenticationIT.logoutUser("finance1");
|
||||
|
||||
authenticationIT.authenticationUser("hr1", "hr1");
|
||||
pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + noteId + "')]"),
|
||||
MAX_BROWSER_TIMEOUT_SEC).click();
|
||||
|
||||
List<WebElement> privilegesModal = driver.findElements(
|
||||
By.xpath("//div[@class='modal-content']//div[@class='bootstrap-dialog-header']" +
|
||||
"//div[contains(.,'Insufficient privileges')]"));
|
||||
collector.checkThat("Check is user has permission to view this notebook", 1,
|
||||
CoreMatchers.equalTo(privilegesModal.size()));
|
||||
driver.findElement(
|
||||
By.xpath("//div[@class='modal-content'][contains(.,'Insufficient privileges')]" +
|
||||
"//div[@class='modal-footer']//button[2]")).click();
|
||||
authenticationIT.logoutUser("hr1");
|
||||
|
||||
authenticationIT.authenticationUser("finance2", "finance2");
|
||||
pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + noteId + "')]"),
|
||||
MAX_BROWSER_TIMEOUT_SEC).click();
|
||||
|
||||
privilegesModal = driver.findElements(
|
||||
By.xpath("//div[@class='modal-content']//div[@class='bootstrap-dialog-header']" +
|
||||
"//div[contains(.,'Insufficient privileges')]"));
|
||||
collector.checkThat("Check is user has permission to view this notebook", 0,
|
||||
CoreMatchers.equalTo(privilegesModal.size()));
|
||||
deleteTestNotebook(driver);
|
||||
authenticationIT.logoutUser("finance2");
|
||||
|
||||
|
||||
} catch (Exception e) {
|
||||
handleException("Exception in ParagraphActionsIT while testGroupPermission ", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in a new issue