summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJames Moger <james.moger@gitblit.com>2013-01-23 08:30:28 -0500
committerJames Moger <james.moger@gitblit.com>2013-01-23 08:30:28 -0500
commit795b227ed376f6ea9a6e13952a79770f33766266 (patch)
tree1c213bdcee0cea09cc67d4b9e61681886c325f2b /tests
parent1613f4067028b73e05544b55d45b6e136ce0238d (diff)
downloadgitblit-795b227ed376f6ea9a6e13952a79770f33766266.tar.gz
gitblit-795b227ed376f6ea9a6e13952a79770f33766266.zip
Merged selenium tests from akquinet (pull request #65)
Diffstat (limited to 'tests')
-rw-r--r--tests/de/akquinet/devops/GitblitRunnable.java134
-rw-r--r--tests/de/akquinet/devops/LaunchWithUITestConfig.java126
-rw-r--r--tests/de/akquinet/devops/ManualUITestLaunch.java14
-rw-r--r--tests/de/akquinet/devops/test/ui/TestUISuite.java33
-rw-r--r--tests/de/akquinet/devops/test/ui/cases/UI_MultiAdminSupportTest.java93
-rw-r--r--tests/de/akquinet/devops/test/ui/generic/AbstractUITest.java96
-rw-r--r--tests/de/akquinet/devops/test/ui/view/Exp.java45
-rw-r--r--tests/de/akquinet/devops/test/ui/view/GitblitDashboardView.java100
-rw-r--r--tests/de/akquinet/devops/test/ui/view/GitblitPageView.java73
-rw-r--r--tests/de/akquinet/devops/test/ui/view/RepoEditView.java158
-rw-r--r--tests/de/akquinet/devops/test/ui/view/RepoListView.java130
11 files changed, 1002 insertions, 0 deletions
diff --git a/tests/de/akquinet/devops/GitblitRunnable.java b/tests/de/akquinet/devops/GitblitRunnable.java
new file mode 100644
index 00000000..fc08f5af
--- /dev/null
+++ b/tests/de/akquinet/devops/GitblitRunnable.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2013 akquinet tech@spree GmbH
+ *
+ * Licensed 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 de.akquinet.devops;
+
+import java.net.InetAddress;
+import java.net.ServerSocket;
+
+import com.gitblit.GitBlitServer;
+import com.gitblit.tests.GitBlitSuite;
+
+/**
+ * This is a runnable implementation, that is used to run a gitblit server in a
+ * separate thread (e.g. alongside test cases)
+ *
+ * @author saheba
+ *
+ */
+public class GitblitRunnable implements Runnable {
+
+ private int httpPort, httpsPort, shutdownPort;
+ private String userPropertiesPath, gitblitPropertiesPath;
+ private boolean startFailed = false;
+
+ /**
+ * constructor with reduced set of start params
+ *
+ * @param httpPort
+ * @param httpsPort
+ * @param shutdownPort
+ * @param gitblitPropertiesPath
+ * @param userPropertiesPath
+ */
+ public GitblitRunnable(int httpPort, int httpsPort, int shutdownPort,
+ String gitblitPropertiesPath, String userPropertiesPath) {
+ this.httpPort = httpPort;
+ this.httpsPort = httpsPort;
+ this.shutdownPort = shutdownPort;
+ this.userPropertiesPath = userPropertiesPath;
+ this.gitblitPropertiesPath = gitblitPropertiesPath;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ boolean portsFree = false;
+ long lastRun = -1;
+ while (!portsFree) {
+ long current = System.currentTimeMillis();
+ if (lastRun == -1 || lastRun + 100 < current) {
+ portsFree = areAllPortsFree(new int[] { httpPort, httpsPort,
+ shutdownPort }, "127.0.0.1");
+ }
+ lastRun = current;
+
+ }
+ try {
+ GitBlitServer.main("--httpPort", "" + httpPort, "--httpsPort", ""
+ + httpsPort, "--shutdownPort", "" + shutdownPort,
+ "--repositoriesFolder",
+ "\"" + GitBlitSuite.REPOSITORIES.getAbsolutePath() + "\"",
+ "--userService", userPropertiesPath, "--settings",
+ gitblitPropertiesPath);
+ setStartFailed(false);
+ } catch (Exception iex) {
+ System.out.println("Gitblit server start failed");
+ setStartFailed(true);
+ }
+ }
+
+ /**
+ * Method used to ensure that all ports are free, if the runnable is used
+ * JUnit test classes. Be aware that JUnit's setUpClass and tearDownClass
+ * methods, which are executed before and after a test class (consisting of
+ * several test cases), may be executed parallely if they are part of a test
+ * suite consisting of several test classes. Therefore the run method of
+ * this class calls areAllPortsFree to check port availability before
+ * starting another gitblit instance.
+ *
+ * @param ports
+ * @param inetAddress
+ * @return
+ */
+ public static boolean areAllPortsFree(int[] ports, String inetAddress) {
+ System.out
+ .println("\n"
+ + System.currentTimeMillis()
+ + " ----------------------------------- testing if all ports are free ...");
+ String blockedPorts = "";
+ for (int i = 0; i < ports.length; i++) {
+ ServerSocket s;
+ try {
+ s = new ServerSocket(ports[i], 1,
+ InetAddress.getByName(inetAddress));
+ s.close();
+ } catch (Exception e) {
+ if (!blockedPorts.equals("")) {
+ blockedPorts += ", ";
+ }
+ }
+ }
+ if (blockedPorts.equals("")) {
+ System.out
+ .println(" ----------------------------------- ... verified");
+ return true;
+ }
+ System.out.println(" ----------------------------------- ... "
+ + blockedPorts + " are still blocked");
+ return false;
+ }
+
+ private void setStartFailed(boolean startFailed) {
+ this.startFailed = startFailed;
+ }
+
+ public boolean isStartFailed() {
+ return startFailed;
+ }
+}
diff --git a/tests/de/akquinet/devops/LaunchWithUITestConfig.java b/tests/de/akquinet/devops/LaunchWithUITestConfig.java
new file mode 100644
index 00000000..594d7fc7
--- /dev/null
+++ b/tests/de/akquinet/devops/LaunchWithUITestConfig.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2013 akquinet tech@spree GmbH
+ *
+ * Licensed 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 de.akquinet.devops;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.UnknownHostException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+import com.gitblit.Constants;
+import com.gitblit.GitBlitServer;
+import com.gitblit.tests.GitBlitSuite;
+
+/**
+ * This test checks if it is possible to run two server instances in the same
+ * JVM sequentially
+ *
+ * @author saheba
+ *
+ */
+public class LaunchWithUITestConfig {
+
+ @Test
+ public void testSequentialLaunchOfSeveralInstances()
+ throws InterruptedException {
+ // different ports than in testParallelLaunchOfSeveralInstances to
+ // ensure that both test cases do not affect each others test results
+ int httpPort = 9191, httpsPort = 9292, shutdownPort = 9393;
+ String gitblitPropertiesPath = "test-ui-gitblit.properties", usersPropertiesPath = "test-ui-users.conf";
+
+ GitblitRunnable gitblitRunnable = new GitblitRunnable(httpPort,
+ httpsPort, shutdownPort, gitblitPropertiesPath,
+ usersPropertiesPath);
+ Thread serverThread = new Thread(gitblitRunnable);
+ serverThread.start();
+ Thread.sleep(2000);
+ Assert.assertFalse(gitblitRunnable.isStartFailed());
+ LaunchWithUITestConfig.shutdownGitBlitServer(shutdownPort);
+
+ Thread.sleep(5000);
+
+ GitblitRunnable gitblitRunnable2 = new GitblitRunnable(httpPort,
+ httpsPort, shutdownPort, gitblitPropertiesPath,
+ usersPropertiesPath);
+ Thread serverThread2 = new Thread(gitblitRunnable2);
+ serverThread2.start();
+ Thread.sleep(2000);
+ Assert.assertFalse(gitblitRunnable2.isStartFailed());
+ LaunchWithUITestConfig.shutdownGitBlitServer(shutdownPort);
+ }
+
+ @Test
+ public void testParallelLaunchOfSeveralInstances()
+ throws InterruptedException {
+ // different ports than in testSequentialLaunchOfSeveralInstances to
+ // ensure that both test cases do not affect each others test results
+ int httpPort = 9797, httpsPort = 9898, shutdownPort = 9999;
+ int httpPort2 = 9494, httpsPort2 = 9595, shutdownPort2 = 9696;
+ String gitblitPropertiesPath = "test-ui-gitblit.properties", usersPropertiesPath = "test-ui-users.conf";
+
+ GitblitRunnable gitblitRunnable = new GitblitRunnable(httpPort,
+ httpsPort, shutdownPort, gitblitPropertiesPath,
+ usersPropertiesPath);
+ Thread serverThread = new Thread(gitblitRunnable);
+ serverThread.start();
+ Thread.sleep(2000);
+ Assert.assertFalse(gitblitRunnable.isStartFailed());
+
+ GitblitRunnable gitblitRunnable2 = new GitblitRunnable(httpPort2,
+ httpsPort2, shutdownPort2, gitblitPropertiesPath,
+ usersPropertiesPath);
+ Thread serverThread2 = new Thread(gitblitRunnable2);
+ serverThread2.start();
+ Thread.sleep(2000);
+ Assert.assertFalse(gitblitRunnable2.isStartFailed());
+
+ LaunchWithUITestConfig.shutdownGitBlitServer(shutdownPort);
+ LaunchWithUITestConfig.shutdownGitBlitServer(shutdownPort2);
+ }
+
+ /**
+ * main runs the tests without assert checks. You have to check the console
+ * output manually.
+ *
+ * @param args
+ * @throws InterruptedException
+ */
+ public static void main(String[] args) throws InterruptedException {
+ new LaunchWithUITestConfig().testSequentialLaunchOfSeveralInstances();
+ new LaunchWithUITestConfig().testParallelLaunchOfSeveralInstances();
+ }
+
+ private static void shutdownGitBlitServer(int shutdownPort) {
+ try {
+ Socket s = new Socket(InetAddress.getByName("127.0.0.1"),
+ shutdownPort);
+ OutputStream out = s.getOutputStream();
+ System.out.println("Sending Shutdown Request to " + Constants.NAME);
+ out.write("\r\n".getBytes());
+ out.flush();
+ s.close();
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/tests/de/akquinet/devops/ManualUITestLaunch.java b/tests/de/akquinet/devops/ManualUITestLaunch.java
new file mode 100644
index 00000000..2eff4918
--- /dev/null
+++ b/tests/de/akquinet/devops/ManualUITestLaunch.java
@@ -0,0 +1,14 @@
+package de.akquinet.devops;
+
+public class ManualUITestLaunch {
+public static void main(String[] args) {
+ int httpPort = 8080, httpsPort = 8443, shutdownPort = 8081;
+ String gitblitPropertiesPath = "test-ui-gitblit.properties", usersPropertiesPath = "test-ui-users.conf";
+
+ GitblitRunnable gitblitRunnable = new GitblitRunnable(httpPort,
+ httpsPort, shutdownPort, gitblitPropertiesPath,
+ usersPropertiesPath);
+ Thread serverThread = new Thread(gitblitRunnable);
+ serverThread.start();
+}
+}
diff --git a/tests/de/akquinet/devops/test/ui/TestUISuite.java b/tests/de/akquinet/devops/test/ui/TestUISuite.java
new file mode 100644
index 00000000..97bd9037
--- /dev/null
+++ b/tests/de/akquinet/devops/test/ui/TestUISuite.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2013 akquinet tech@spree GmbH
+ *
+ * Licensed 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 de.akquinet.devops.test.ui;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+import de.akquinet.devops.test.ui.cases.UI_MultiAdminSupportTest;
+
+/**
+ * the test suite including all selenium-based ui-tests.
+ *
+ * @author saheba
+ *
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({ UI_MultiAdminSupportTest.class })
+public class TestUISuite {
+
+}
diff --git a/tests/de/akquinet/devops/test/ui/cases/UI_MultiAdminSupportTest.java b/tests/de/akquinet/devops/test/ui/cases/UI_MultiAdminSupportTest.java
new file mode 100644
index 00000000..9cdad160
--- /dev/null
+++ b/tests/de/akquinet/devops/test/ui/cases/UI_MultiAdminSupportTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2013 akquinet tech@spree GmbH
+ *
+ * Licensed 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 de.akquinet.devops.test.ui.cases;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import de.akquinet.devops.test.ui.generic.AbstractUITest;
+import de.akquinet.devops.test.ui.view.RepoEditView;
+import de.akquinet.devops.test.ui.view.RepoListView;
+
+/**
+ * tests the multi admin per repo feature.
+ *
+ * @author saheba
+ *
+ */
+public class UI_MultiAdminSupportTest extends AbstractUITest {
+
+ String baseUrl = "https://localhost:8443";
+ RepoListView view;
+ RepoEditView editView;
+ private static final String TEST_MULTI_ADMIN_SUPPORT_REPO_NAME = "testmultiadminsupport";
+ private static final String TEST_MULTI_ADMIN_SUPPORT_REPO_PATH = "~repocreator/"
+ + TEST_MULTI_ADMIN_SUPPORT_REPO_NAME + ".git";
+ private static final String TEST_MULTI_ADMIN_SUPPORT_REPO_PATH_WITHOUT_SUFFIX = "~repocreator/"
+ + TEST_MULTI_ADMIN_SUPPORT_REPO_NAME;
+
+ @Before
+ public void before() {
+ System.out.println("IN BEFORE");
+ this.view = new RepoListView(AbstractUITest.getDriver(), baseUrl);
+ this.editView = new RepoEditView(AbstractUITest.getDriver());
+ AbstractUITest.getDriver().navigate().to(baseUrl);
+ }
+
+ @Test
+ public void test_MultiAdminSelectionInStandardRepo() {
+ // login
+ view.login("repocreator", "repocreator");
+
+ // create new repo
+ view.navigateToNewRepo(1);
+ editView.changeName(TEST_MULTI_ADMIN_SUPPORT_REPO_PATH);
+ Assert.assertTrue(editView.navigateToPermissionsTab());
+
+ Assert.assertTrue(editView
+ .changeAccessRestriction(RepoEditView.RESTRICTION_AUTHENTICATED_VCP));
+ Assert.assertTrue(editView
+ .changeAuthorizationControl(RepoEditView.AUTHCONTROL_RWALL));
+
+ // with a second admin
+ editView.addRepoAdministrator("admin");
+ Assert.assertTrue(editView.save());
+ // user is automatically forwarded to repo list view
+ Assert.assertTrue(view.isEmptyRepo(TEST_MULTI_ADMIN_SUPPORT_REPO_PATH));
+ Assert.assertTrue(view
+ .isEditableRepo(TEST_MULTI_ADMIN_SUPPORT_REPO_PATH));
+ Assert.assertTrue(view
+ .isDeletableRepo(TEST_MULTI_ADMIN_SUPPORT_REPO_PATH_WITHOUT_SUFFIX));
+ // logout repocreator
+ view.logout();
+
+ // check with admin account if second admin has the same rights
+ view.login("admin", "admin");
+ Assert.assertTrue(view.isEmptyRepo(TEST_MULTI_ADMIN_SUPPORT_REPO_PATH));
+ Assert.assertTrue(view
+ .isEditableRepo(TEST_MULTI_ADMIN_SUPPORT_REPO_PATH));
+ Assert.assertTrue(view
+ .isDeletableRepo(TEST_MULTI_ADMIN_SUPPORT_REPO_PATH_WITHOUT_SUFFIX));
+ // delete repo to reach state as before test execution
+ view.navigateToDeleteRepo(TEST_MULTI_ADMIN_SUPPORT_REPO_PATH_WITHOUT_SUFFIX);
+ view.acceptAlertDialog();
+ view.logout();
+
+ Assert.assertTrue(view.isLoginPartVisible());
+ }
+
+}
diff --git a/tests/de/akquinet/devops/test/ui/generic/AbstractUITest.java b/tests/de/akquinet/devops/test/ui/generic/AbstractUITest.java
new file mode 100644
index 00000000..bb7b3da2
--- /dev/null
+++ b/tests/de/akquinet/devops/test/ui/generic/AbstractUITest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2013 akquinet tech@spree GmbH
+ *
+ * Licensed 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 de.akquinet.devops.test.ui.generic;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.firefox.FirefoxProfile;
+
+import com.gitblit.GitBlitServer;
+
+import de.akquinet.devops.GitblitRunnable;
+
+/**
+ * This abstract class implements the setUpClass and tearDownClass for
+ * selenium-based UITests. They require a running gitblit server instance and a
+ * webdriver instance, which are managed by the setUpClass and tearDownClass
+ * method. Write a separate test class derived from this abstract class for each
+ * scenario consisting of one or more test cases, which can share the same
+ * server instance.
+ *
+ * @author saheba
+ *
+ */
+public abstract class AbstractUITest {
+
+ private static Thread serverThread;
+ private static WebDriver driver;
+
+ private static final int HTTP_PORT = 8080, HTTPS_PORT = 8443,
+ SHUTDOWN_PORT = 8081;
+ private static final String GITBLIT_PROPERTIES_PATH = "test-ui-gitblit.properties",
+ USERS_PROPERTIES_PATH = "test-ui-users.conf";
+
+ /**
+ * starts a gitblit server instance in a separate thread before test cases
+ * of concrete, non-abstract child-classes are executed
+ */
+ @BeforeClass
+ public static void setUpClass() {
+ Runnable gitblitRunnable = new GitblitRunnable(HTTP_PORT, HTTPS_PORT,
+ SHUTDOWN_PORT, GITBLIT_PROPERTIES_PATH, USERS_PROPERTIES_PATH);
+
+ serverThread = new Thread(gitblitRunnable);
+ serverThread.start();
+ FirefoxProfile firefoxProfile = new FirefoxProfile();
+ firefoxProfile.setPreference("startup.homepage_welcome_url",
+ "https://www.google.de");
+
+ firefoxProfile.setPreference("browser.download.folderList", 2);
+ firefoxProfile.setPreference(
+ "browser.download.manager.showWhenStarting", false);
+ String downloadDir = System.getProperty("java.io.tmpdir");
+ firefoxProfile.setPreference("browser.download.dir", downloadDir);
+ firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
+ "text/csv,text/plain,application/zip,application/pdf");
+ firefoxProfile.setPreference("browser.helperApps.alwaysAsk.force",
+ false);
+ System.out.println("Saving all attachments to: " + downloadDir);
+
+ driver = new FirefoxDriver(firefoxProfile);
+ }
+
+ /**
+ * stops the gitblit server instance running in a separate thread after test
+ * cases of concrete, non-abstract child-classes have been executed
+ */
+ @AfterClass
+ public static void tearDownClass() throws InterruptedException {
+ driver.close();
+ // Stop Gitblit
+ GitBlitServer.main("--stop", "--shutdownPort", "" + SHUTDOWN_PORT);
+
+ // Wait a few seconds for it to be running completely including thread
+ // destruction
+ Thread.sleep(1000);
+ }
+
+ public static WebDriver getDriver() {
+ return AbstractUITest.driver;
+ }
+}
diff --git a/tests/de/akquinet/devops/test/ui/view/Exp.java b/tests/de/akquinet/devops/test/ui/view/Exp.java
new file mode 100644
index 00000000..3433bbb6
--- /dev/null
+++ b/tests/de/akquinet/devops/test/ui/view/Exp.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2013 akquinet tech@spree GmbH
+ *
+ * Licensed 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 de.akquinet.devops.test.ui.view;
+
+import java.util.List;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+
+/**
+ * container class for selenium conditions
+ *
+ * @author saheba
+ *
+ */
+public class Exp {
+ public static class EditRepoViewLoaded implements ExpectedCondition<Boolean> {
+ public Boolean apply(WebDriver d) {
+ List<WebElement> findElements = d.findElements(By.partialLinkText("general"));
+ return findElements.size() == 1;
+ }
+ }
+ public static class RepoListViewLoaded implements ExpectedCondition<Boolean> {
+ public Boolean apply(WebDriver d) {
+ String xpath = "//img[@src=\"git-black-16x16.png\"]";
+ List<WebElement> findElements = d.findElements(By.xpath(xpath ));
+ return findElements.size() == 1;
+ }
+ }
+}
diff --git a/tests/de/akquinet/devops/test/ui/view/GitblitDashboardView.java b/tests/de/akquinet/devops/test/ui/view/GitblitDashboardView.java
new file mode 100644
index 00000000..0908d7c9
--- /dev/null
+++ b/tests/de/akquinet/devops/test/ui/view/GitblitDashboardView.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2013 akquinet tech@spree GmbH
+ *
+ * Licensed 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 de.akquinet.devops.test.ui.view;
+
+import java.util.List;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+/**
+ * class representing the view componenents and possible user interactions, you
+ * can see and do on most screens when you are logged in.
+ *
+ * @author saheba
+ *
+ */
+public class GitblitDashboardView extends GitblitPageView {
+
+ public static final String TITLE_STARTS_WITH = "localhost";
+
+ public GitblitDashboardView(WebDriver driver, String baseUrl) {
+ super(driver, baseUrl);
+ }
+
+ public boolean isLoginPartVisible() {
+ List<WebElement> found = getDriver().findElements(
+ By.partialLinkText("logout"));
+ return found == null || found.size() == 0;
+ }
+
+ public void logout() {
+ // String pathLogout = "//a[@href =\"?" + WICKET_HREF_PAGE_PATH
+ // + ".LogoutPage\"]";
+ // List<WebElement> logout =
+ // getDriver().findElements(By.xpath(pathLogout));
+ // logout.get(0).click();
+ // replaced by url call because click hangs sometimes if the clicked
+ // object is not a button or selenium ff driver does not notice the
+ // change for any other reason
+ getDriver().navigate().to(
+ getBaseUrl() + "?" + WICKET_HREF_PAGE_PATH + ".LogoutPage");
+ }
+
+ public static final String LOGIN_AREA_SELECTOR = "//span[@class = \"form-search\" ]";
+ public static final String WICKET_PAGES_PACKAGE_NAME = "com.gitblit.wicket.pages";
+ public static final String WICKET_HREF_PAGE_PATH = "wicket:bookmarkablePage=:"
+ + WICKET_PAGES_PACKAGE_NAME;
+
+ synchronized public void waitToLoadFor(int sec) {
+ WebDriverWait webDriverWait = new WebDriverWait(getDriver(), sec);
+ webDriverWait.until(new ExpectedCondition<Boolean>() {
+ public Boolean apply(WebDriver d) {
+ return d.getTitle().toLowerCase()
+ .startsWith(GitblitDashboardView.TITLE_STARTS_WITH);
+ }
+ });
+ }
+
+ public void login(String id, String pw) {
+ String pathID = LOGIN_AREA_SELECTOR + "/input[@name = \"username\" ]";
+ String pathPW = LOGIN_AREA_SELECTOR + "/input[@name = \"password\" ]";
+ String pathSubmit = LOGIN_AREA_SELECTOR
+ + "/button[@type = \"submit\" ]";
+ // System.out.println("DRIVER:"+getDriver());
+ // List<WebElement> findElement =
+ // getDriver().findElements(By.xpath("//span[@class = \"form-search\" ]"));
+ //
+ // System.out.println("ELEM: "+findElement);
+ // System.out.println("SIZE: "+findElement.size());
+ // System.out.println("XPath: "+pathID);
+ WebElement idField = getDriver().findElement(By.xpath(pathID));
+ // System.out.println("IDFIELD:"+idField);
+ idField.sendKeys(id);
+ WebElement pwField = getDriver().findElement(By.xpath(pathPW));
+ // System.out.println(pwField);
+ pwField.sendKeys(pw);
+ WebElement submit = getDriver().findElement(By.xpath(pathSubmit));
+ submit.click();
+ }
+
+ public void acceptAlertDialog() {
+ getDriver().switchTo().alert().accept();
+ }
+}
diff --git a/tests/de/akquinet/devops/test/ui/view/GitblitPageView.java b/tests/de/akquinet/devops/test/ui/view/GitblitPageView.java
new file mode 100644
index 00000000..43716434
--- /dev/null
+++ b/tests/de/akquinet/devops/test/ui/view/GitblitPageView.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2013 akquinet tech@spree GmbH
+ *
+ * Licensed 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 de.akquinet.devops.test.ui.view;
+
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+/**
+ * general basic class representing a gitblit webpage and offering basic methods
+ * used in selenium tests.
+ *
+ * @author saheba
+ *
+ */
+public class GitblitPageView {
+ private WebDriver driver;
+ private String baseUrl;
+
+ public GitblitPageView(WebDriver driver, String baseUrl) {
+ this.driver = driver;
+ this.baseUrl = baseUrl;
+ }
+
+ public void sleep(int miliseconds) {
+ try {
+ Thread.sleep(miliseconds);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public WebElement getElementWithFocus() {
+ String elScript = "return document.activeElement;";
+
+ WebElement focuseedEl = (WebElement) ((JavascriptExecutor) getDriver())
+ .executeScript(elScript);
+ return focuseedEl;
+ }
+
+ public void navigateToPreviousPageOfBrowserHistory() {
+ driver.navigate().back();
+ }
+
+ public void setDriver(WebDriver driver) {
+ this.driver = driver;
+ }
+
+ public WebDriver getDriver() {
+ return driver;
+ }
+
+ public void setBaseUrl(String baseUrl) {
+ this.baseUrl = baseUrl;
+ }
+
+ public String getBaseUrl() {
+ return baseUrl;
+ }
+}
diff --git a/tests/de/akquinet/devops/test/ui/view/RepoEditView.java b/tests/de/akquinet/devops/test/ui/view/RepoEditView.java
new file mode 100644
index 00000000..ef0a3171
--- /dev/null
+++ b/tests/de/akquinet/devops/test/ui/view/RepoEditView.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2013 akquinet tech@spree GmbH
+ *
+ * Licensed 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 de.akquinet.devops.test.ui.view;
+
+import java.util.List;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+/**
+ * class representing the tabs you can access when you edit a repo.
+ *
+ * @author saheba
+ *
+ */
+public class RepoEditView extends GitblitDashboardView {
+
+ public static final String PERMISSION_VIEW_USERS_NAME_PREFIX = "users:";
+ public static final String PERMISSION_VIEW_TEAMS_NAME_PREFIX = "teams:";
+
+ public static final String PERMISSION_VIEW_MUTABLE = "permissionToggleForm:showMutable";
+ public static final String PERMISSION_VIEW_SPECIFIED = "permissionToggleForm:showSpecified";
+ public static final String PERMISSION_VIEW_EFFECTIVE = "permissionToggleForm:showEffective";
+
+ public static final int RESTRICTION_ANONYMOUS_VCP = 0;
+ public static final int RESTRICTION_AUTHENTICATED_P = 1;
+ public static final int RESTRICTION_AUTHENTICATED_CP = 2;
+ public static final int RESTRICTION_AUTHENTICATED_VCP = 3;
+
+ public static final int AUTHCONTROL_RWALL = 0;
+ public static final int AUTHOCONTROL_FINE = 1;
+
+ public RepoEditView(WebDriver driver) {
+ super(driver, null);
+ }
+
+ public void changeName(String newName) {
+ String pathName = "//input[@id = \"name\" ]";
+ WebElement field = getDriver().findElement(By.xpath(pathName));
+ field.clear();
+ field.sendKeys(newName);
+ }
+
+ public boolean navigateToPermissionsTab() {
+ String linkText = "access permissions";
+ List<WebElement> found = getDriver().findElements(
+ By.partialLinkText(linkText));
+ System.out.println("PERM TABS found =" + found.size());
+ if (found != null && found.size() == 1) {
+ found.get(0).click();
+ return true;
+ }
+ return false;
+ }
+
+ private void changeRepoAdministrators(String action,
+ String affectedSelection, String username) {
+ String xpath = "//select[@name=\"" + affectedSelection
+ + "\"]/option[@value = \"" + username + "\" ]";
+ WebElement option = getDriver().findElement(By.xpath(xpath));
+ option.click();
+ String buttonPath = "//button[@class=\"button " + action + "\"]";
+ WebElement button = getDriver().findElement(By.xpath(buttonPath));
+ button.click();
+ }
+
+ public void removeRepoAdministrator(String username) {
+ changeRepoAdministrators("remove", "repoAdministrators:selection",
+ username);
+ }
+
+ public void addRepoAdministrator(String username) {
+ changeRepoAdministrators("add", "repoAdministrators:choices", username);
+ }
+
+ public WebElement getAccessRestrictionSelection() {
+ String xpath = "//select[@name =\"accessRestriction\"]";
+ List<WebElement> found = getDriver().findElements(By.xpath(xpath));
+ if (found != null && found.size() == 1) {
+ return found.get(0);
+ }
+ return null;
+ }
+
+ public boolean changeAccessRestriction(int option) {
+ WebElement accessRestrictionSelection = getAccessRestrictionSelection();
+ if (accessRestrictionSelection == null) {
+ return false;
+ }
+ accessRestrictionSelection.click();
+ sleep(100);
+ String xpath = "//select[@name =\"accessRestriction\"]/option[@value=\""
+ + option + "\"]";
+ List<WebElement> found = getDriver().findElements(By.xpath(xpath));
+ if (found == null || found.size() == 0 || found.size() > 1) {
+ return false;
+ }
+ found.get(0).click();
+ return true;
+ }
+
+ public boolean changeAuthorizationControl(int option) {
+ System.out.println("try to change auth control");
+ String xpath = "//input[@name =\"authorizationControl\" and @value=\""
+ + option + "\"]";
+ List<WebElement> found = getDriver().findElements(By.xpath(xpath));
+ System.out.println("found auth CONTROL options " + found.size());
+ if (found == null || found.size() == 0 || found.size() > 1) {
+ return false;
+ }
+ found.get(0).click();
+ return true;
+ }
+
+ private boolean isPermissionViewDisabled(String prefix, String view) {
+ String xpath = "//[@name =\"" + prefix + view + "\"]";
+ List<WebElement> found = getDriver().findElements(By.xpath(xpath));
+ if (found == null || found.size() == 0 || found.size() > 1) {
+ return false;
+ }
+ String attrValue = found.get(0).getAttribute("disabled");
+ return (attrValue != null) && (attrValue.equals("disabled"));
+ }
+
+ public boolean isPermissionViewSectionDisabled(String prefix) {
+ return isPermissionViewDisabled(prefix, PERMISSION_VIEW_MUTABLE)
+ && isPermissionViewDisabled(prefix, PERMISSION_VIEW_SPECIFIED)
+ && isPermissionViewDisabled(prefix, PERMISSION_VIEW_EFFECTIVE);
+ }
+
+ public boolean save() {
+ String xpath = "//div[@class=\"form-actions\"]/input[@name =\""
+ + "save" + "\"]";
+ List<WebElement> found = getDriver().findElements(By.xpath(xpath));
+ if (found == null || found.size() == 0 || found.size() > 1) {
+ return false;
+ }
+ found.get(0).click();
+ WebDriverWait webDriverWait = new WebDriverWait(getDriver(), 1);
+ webDriverWait.until(new Exp.RepoListViewLoaded());
+ return true;
+ }
+}
diff --git a/tests/de/akquinet/devops/test/ui/view/RepoListView.java b/tests/de/akquinet/devops/test/ui/view/RepoListView.java
new file mode 100644
index 00000000..6ec6203f
--- /dev/null
+++ b/tests/de/akquinet/devops/test/ui/view/RepoListView.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2013 akquinet tech@spree GmbH
+ *
+ * Licensed 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 de.akquinet.devops.test.ui.view;
+
+import java.util.List;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+/**
+ * class representing the repo list view, which you see e.g. right after you
+ * logged in.
+ *
+ * @author saheba
+ *
+ */
+public class RepoListView extends GitblitDashboardView {
+
+ public RepoListView(WebDriver driver, String baseUrl) {
+ super(driver, baseUrl);
+ }
+
+ public boolean isEmptyRepo(String fullyQualifiedRepoName) {
+ String pathToLink = "//a[@href = \"?" + WICKET_HREF_PAGE_PATH
+ + ".EmptyRepositoryPage&r=" + fullyQualifiedRepoName + "\"]";
+ List<WebElement> found = getDriver().findElements(By.xpath(pathToLink));
+ return found != null && found.size() > 0;
+ }
+
+ private String getEditRepoPath(String fullyQualifiedRepoName) {
+ return "//a[@href =\"?" + WICKET_HREF_PAGE_PATH
+ + ".EditRepositoryPage&r=" + fullyQualifiedRepoName + "\"]";
+ }
+
+ private String getDeleteRepoOnclickIdentifier(
+ String fullyQualifiedRepoPathAndName) {
+ return "var conf = confirm('Delete repository \""
+ + fullyQualifiedRepoPathAndName
+ + "\"?'); if (!conf) return false; ";
+ }
+
+ public boolean navigateToNewRepo(long waitSecToLoad) {
+ String pathToLink = "//a[@href =\"?" + WICKET_HREF_PAGE_PATH
+ + ".EditRepositoryPage\"]";
+ List<WebElement> found = getDriver().findElements(By.xpath(pathToLink));
+ if (found == null || found.size() == 0 || found.size() > 1) {
+ return false;
+ }
+ found.get(0).click();
+ WebDriverWait webDriverWait = new WebDriverWait(getDriver(),
+ waitSecToLoad);
+ webDriverWait.until(new Exp.EditRepoViewLoaded());
+ return true;
+ }
+
+ private boolean checkOrDoEditRepo(String fullyQualifiedRepoName,
+ boolean doEdit) {
+ List<WebElement> found = getDriver().findElements(
+ By.xpath(getEditRepoPath(fullyQualifiedRepoName)));
+ if (found == null || found.size() == 0 || found.size() > 1) {
+ return false;
+ }
+ if (doEdit) {
+ found.get(0).click();
+ }
+ return true;
+ }
+
+ public boolean navigateToEditRepo(String fullyQualifiedRepoName,
+ int waitSecToLoad) {
+ boolean result = checkOrDoEditRepo(fullyQualifiedRepoName, true);
+ WebDriverWait webDriverWait = new WebDriverWait(getDriver(),
+ waitSecToLoad);
+ webDriverWait.until(new Exp.EditRepoViewLoaded());
+ return result;
+ }
+
+ public boolean isEditableRepo(String fullyQualifiedRepoName) {
+ return checkOrDoEditRepo(fullyQualifiedRepoName, false);
+ }
+
+ private boolean checkOrDoDeleteRepo(String fullyQualifiedRepoPathAndName,
+ boolean doDelete) {
+ List<WebElement> found = getDriver().findElements(
+ By.partialLinkText("delete"));
+ String onclickIdentifier = getDeleteRepoOnclickIdentifier(fullyQualifiedRepoPathAndName);
+ WebElement result = null;
+ for (WebElement webElement : found) {
+ if (webElement.getAttribute("onclick") != null
+ && webElement.getAttribute("onclick").equals(
+ onclickIdentifier)) {
+ result = webElement;
+ break;
+ }
+ }
+ System.out.println("result ? " + result);
+ if (result == null) {
+ return false;
+ }
+ if (doDelete) {
+ System.out.println(".............. DO DELETE .... ");
+ result.click();
+ }
+ return true;
+ }
+
+ public boolean isDeletableRepo(String fullyQualifiedRepoPathAndName) {
+ return checkOrDoDeleteRepo(fullyQualifiedRepoPathAndName, false);
+ }
+
+ public boolean navigateToDeleteRepo(String fullyQualifiedRepoPathAndName) {
+ return checkOrDoDeleteRepo(fullyQualifiedRepoPathAndName, true);
+
+ }
+}