////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2009-2013 Denim Group, Ltd.
//
// The contents of this file are subject to the Mozilla Public 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.mozilla.org/MPL/
//
// Software distributed under the License is distributed on an "AS IS"
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// License for the specific language governing rights and limitations
// under the License.
//
// The Original Code is ThreadFix.
//
// The Initial Developer of the Original Code is Denim Group, Ltd.
// Portions created by Denim Group, Ltd. are Copyright (C)
// Denim Group, Ltd. All Rights Reserved.
//
// Contributor(s): Denim Group, Ltd.
//
////////////////////////////////////////////////////////////////////////
package com.denimgroup.threadfix.selenium.tests;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.openqa.selenium.remote.RemoteWebDriver;
import com.denimgroup.threadfix.selenium.pages.ConfigureDefaultsPage;
import com.denimgroup.threadfix.selenium.pages.DashboardPage;
import com.denimgroup.threadfix.selenium.pages.LoginPage;
import com.denimgroup.threadfix.selenium.pages.UserChangePasswordPage;
import com.denimgroup.threadfix.selenium.pages.UserIndexPage;
public class UserTests extends BaseTest {
public UserTests(String browser) {
super(browser);
// TODO Auto-generated constructor stub
}
private RemoteWebDriver driver;
private UserChangePasswordPage changePasswordPage;
private static LoginPage loginPage;
@Before
public void init() {
super.init();
driver = (RemoteWebDriver)super.getDriver();
loginPage = LoginPage.open(driver);
}
@Test
public void testCreateUser() {
String userName = "testCreateUser", password = "testCreateUser";
UserIndexPage userIndexPage = loginPage.login("user", "password")
.clickManageUsersLink();
assertFalse("User was already in the table.", userIndexPage.isUserNamePresent(userName));
userIndexPage = userIndexPage.clickAddUserLink()
.enterName(userName,null)
.enterPassword(password,null)
.enterConfirmPassword(password,null)
.clickAddNewUserBtn();
assertTrue("User name was not present in the table.", userIndexPage.isUserNamePresent(userName));
assertTrue("Success message was not displayed.", userIndexPage.isSuccessDisplayed(userName));
userIndexPage = userIndexPage.clickDeleteButton(userName);
assertFalse("User was still in table after attempted deletion.", userIndexPage.isUserNamePresent(userName));
loginPage = userIndexPage.logout();
}
@Test
public void testUserFieldValidation() {
DashboardPage dashboardPage;
StringBuilder stringBuilder = new StringBuilder("");
for (int i = 0; i < 400; i++) { stringBuilder.append('i'); }
String longInput = stringBuilder.toString();
UserIndexPage userIndexPage = loginPage.login("user", "password")
.clickManageUsersLink()
.clickAddUserLink()
.enterName("",null)
.enterPassword("",null)
.enterConfirmPassword("",null)
.clickAddNewUserBtnInvalid();
// Test Empty
assertTrue("Name error not present", userIndexPage.getNameError().equals("Name is a required field."));
assertTrue("Password error not present", userIndexPage.getPasswordError().equals("Password is a required field."));
// Test White Space
userIndexPage.enterName(" ",null);
userIndexPage.enterPassword(" ",null);
userIndexPage.enterConfirmPassword(" ",null);
userIndexPage = userIndexPage.clickAddNewUserBtnInvalid();
assertTrue("Name error not present", userIndexPage.getNameError().equals("Name is a required field."));
assertTrue("Password error not present", userIndexPage.getPasswordError().equals("Password is a required field."));
// Test length
userIndexPage.enterName("Test User",null);
userIndexPage.enterPassword("test",null);
userIndexPage.enterConfirmPassword("test",null);
userIndexPage = userIndexPage.clickAddNewUserBtnInvalid();
assertTrue("Password length error not present", userIndexPage.getPasswordError().equals("Password has a minimum length of 12."));
// Test non-matching passwords
userIndexPage.enterName("new name",null);
userIndexPage.enterPassword("lengthy password 1",null);
userIndexPage.enterConfirmPassword("lengthy password 2",null);
userIndexPage = userIndexPage.clickAddNewUserBtnInvalid();
assertTrue("Password matching error is not correct.", userIndexPage.getPasswordError().equals("Passwords do not match."));
// Create a user
userIndexPage.enterName(longInput,null);
userIndexPage.enterPassword(longInput,null);
userIndexPage.enterConfirmPassword(longInput,null);
userIndexPage = userIndexPage.clickAddNewUserBtn();
String userName = "iiiiiiiiiiiiiiiiiiiiiiiii";
assertTrue("User name was not present in the table.", userIndexPage.isUserNamePresent(userName));
assertTrue("Success message was not displayed.", userIndexPage.isSuccessDisplayed(userName));
dashboardPage = userIndexPage.logout()
.login(userName, longInput);
assertTrue("user: "+longInput+" was not logged in.",dashboardPage.isLoggedInUser(userName));
userIndexPage = dashboardPage.logout()
.login("user", "password")
.clickManageUsersLink()
.clickAddUserLink();
// Test name uniqueness check
userIndexPage.enterName(userName,null);
userIndexPage.enterPassword("dummy password",null);
userIndexPage.enterConfirmPassword("dummy password",null);
userIndexPage = userIndexPage.clickAddNewUserBtnInvalid();
assertTrue("Name uniqueness error is not correct.", userIndexPage.getNameError().equals("That name is already taken."));
userIndexPage = userIndexPage.clickDeleteButton(userName);
userIndexPage.logout();
}
@Test
public void testEditUser() {
String userName = "testCreateUser", password = "testCreateUser";
String editedUserName = "testCreateUser3", editedPassword = "testCreateUser3";
UserIndexPage userIndexPage = loginPage.login("user", "password")
.clickManageUsersLink();
assertFalse("User was already in the table.", userIndexPage.isUserNamePresent(userName));
userIndexPage = userIndexPage.clickAddUserLink()
.enterName(userName,null)
.enterPassword(password,null)
.enterConfirmPassword(password,null)
.clickAddNewUserBtn()
.logout()
.login(userName, password)
.clickManageUsersLink()
.clickEditLink(userName);
userIndexPage.enterName(editedUserName,userName);
userIndexPage.enterPassword(editedPassword,userName);
userIndexPage.enterConfirmPassword(editedPassword,userName);
// Save and check that the name changed
userIndexPage = userIndexPage.clickUpdateUserBtn(userName);
assertTrue("Username changed when edited.", userIndexPage.isUserNamePresent(editedUserName));
// Test that we are able to log in the second time.
// This ensures that the password was correctly updated.
// if this messes up, the test won't complete.
userIndexPage.logout().login(editedUserName, editedPassword)
.clickManageUsersLink()
.clickDeleteButtonSameUser(editedUserName);
}
@Test
public void testEditUserFieldValidation() {
DashboardPage dashboardPage;
String baseUserName = "testEditUser";
String userNameDuplicateTest = "duplicate user";
StringBuilder stringBuilder = new StringBuilder("");
for (int i = 0; i < 400; i++) { stringBuilder.append('a'); }
String longInput = stringBuilder.toString();
// Set up the two User objects for the test
UserIndexPage userIndexPage = loginPage.login("user", "password")
.clickManageUsersLink()
.clickAddUserLink()
.enterName(baseUserName,null)
.enterPassword("lengthy password 2",null)
.enterConfirmPassword("lengthy password 2",null)
.clickAddNewUserBtn()
.clickAddUserLink()
.enterName(userNameDuplicateTest,null)
.enterPassword("lengthy password 2",null)
.enterConfirmPassword("lengthy password 2",null)
.clickAddNewUserBtn();
// Test submission with no changes
userIndexPage = userIndexPage.clickManageUsersLink()
.clickEditLink(baseUserName)
.clickUpdateUserBtn(baseUserName);
assertTrue("User name was not present in the table.",userIndexPage.isUserNamePresent(baseUserName));
// Test Empty
userIndexPage = userIndexPage.clickEditLink(baseUserName)
.enterName("",baseUserName)
.enterPassword("",baseUserName)
.enterConfirmPassword("",baseUserName)
.clickUpdateUserBtnInvalid(baseUserName);
assertTrue("Name error not present", userIndexPage.getNameError().equals("Name is a required field."));
//assertTrue("Password error not present", userIndexPage.getPasswordError().equals("Password is a required field."));
// Test White Space
userIndexPage = userIndexPage.enterName(" ",null)
.enterPassword(" ",null)
.enterConfirmPassword(" ",null)
.clickUpdateUserBtnInvalid(baseUserName);
assertTrue("Name error not present", userIndexPage.getNameError().equals("Name is a required field."));
//assertTrue("Password error not present", userIndexPage.getPasswordError().equals("Password is a required field."));
// Test non-matching passwords
userIndexPage = userIndexPage.enterName("new name",null)
.enterPassword("lengthy password 1",null)
.enterConfirmPassword("lengthy password 2",null)
.clickUpdateUserBtnInvalid(baseUserName);
assertTrue("Password matching error is not correct.", userIndexPage.getPasswordError().equals("Passwords do not match."));
// Test length
userIndexPage = userIndexPage.enterName("Test User",null)
.enterPassword("test",null)
.enterConfirmPassword("test",null)
.clickUpdateUserBtnInvalid(baseUserName);
assertTrue("Password length error not present", userIndexPage.getPasswordError().contains("Password has a minimum length of 12."));
//max length check
userIndexPage = userIndexPage.enterName(longInput,null)
.enterPassword(longInput,null)
.enterConfirmPassword(longInput,null)
.clickUpdateUserBtn(baseUserName);
String userName = "aaaaaaaaaaaaaaaaaaaaaaaaa";
assertTrue("User name was not present in the table.", userIndexPage.isUserNamePresent(userName));
assertTrue("Success message was not displayed.", userIndexPage.isSuccessDisplayed(userName));
dashboardPage = userIndexPage.logout()
.login(userName, longInput);
assertTrue("user: "+longInput+" was not logged in.",dashboardPage.isLoggedInUser(userName));
// Test name uniqueness check
userIndexPage = dashboardPage.logout()
.login("user", "password")
.clickManageUsersLink()
.clickEditLink(userName)
.enterName(userNameDuplicateTest,userName)
.enterPassword("lengthy password 2",userName)
.enterConfirmPassword("lengthy password 2",userName)
.clickUpdateUserBtnInvalid(userName);
assertTrue("Name uniqueness error is not correct.", userIndexPage.getNameError().equals("That name is already taken."));
// Delete the users and logout
userIndexPage = userIndexPage.clickCancel(userName)
.clickManageUsersLink()
.clickDeleteButton(userName)
.clickDeleteButton(userNameDuplicateTest);
assertFalse("User was still in table after attempted deletion.", userIndexPage.isUserNamePresent(baseUserName));
assertFalse("User was still in table after attempted deletion.", userIndexPage.isUserNamePresent(userNameDuplicateTest));
}
@Test
public void navigationTest() {
loginPage.login("user", "password")
.clickManageUsersLink();
String PageText = driver.findElementByTagName("h2").getText();
assertTrue("User Password Change Page not found", PageText.contains("Manage Users"));
}
@Test
public void testChangePasswordValidation() {
changePasswordPage = loginPage.login("user", "password")
.clickChangePasswordLink()
.setCurrentPassword(" ")
.setNewPassword("password1234")
.setConfirmPassword("password1234")
.clickUpdateInvalid();
assertTrue("Incorrect password error not present",
changePasswordPage.getErrorText("currentPassword")
.contains("That was not the correct password."));
// New Pwd
changePasswordPage = changePasswordPage.setCurrentPassword("password")
.setNewPassword(" ")
.setConfirmPassword("password1234")
.clickUpdateInvalid();
assertTrue("Password match error not present",
changePasswordPage.getErrorText("password")
.contains("Passwords do not match."));
// Confirm Pwd
changePasswordPage = changePasswordPage.setCurrentPassword("password")
.setConfirmPassword(" ")
.setNewPassword("password1234")
.clickUpdateInvalid();
assertTrue("Password match error not present",
changePasswordPage.getErrorText("password")
.contains("Passwords do not match."));
// PwdLength
changePasswordPage = changePasswordPage.setCurrentPassword("password")
.setConfirmPassword(" ")
.setNewPassword("password124")
.clickUpdateInvalid();
assertTrue("Length error missing",
changePasswordPage.getErrorText("password")
.contains("Password has a minimum length of 12."));
changePasswordPage.logout();
}
@Test
public void testChangePassword() {
UserIndexPage userIndexPage = loginPage.login("user", "password")
.clickManageUsersLink()
.clickAddUserLink()
.enterName("testuser",null)
.enterPassword("testpassword",null)
.enterConfirmPassword("testpassword",null)
.clickAddNewUserBtn()
.logout()
.login("testuser", "testpassword")
.clickChangePasswordLink()
.setConfirmPassword("newtestpassword")
.setNewPassword("newtestpassword")
.setCurrentPassword("testpassword")
.clickUpdate()
.logout()
.login("testuser", "newtestpassword")
.clickManageUsersLink()
.clickDeleteButtonSameUser("testuser")
.login("user", "password")
.clickManageUsersLink();
//assertFalse("Change password link present.", orgIndexPage.isElementPresent("changePasswordLink"));
assertFalse("User was not deleted", userIndexPage.isUserNamePresent("testuser"));
userIndexPage.logout();
}
//If this test fails it can cascade and cause several other tests to fail
@Ignore
@Test
public void testDeleteLastUserRemoveLastRole(){
UserIndexPage userIndexPage = loginPage.login("user", "password")
.clickManageUsersLink()
.clickDeleteButton("user");
assertTrue("User was deleted", userIndexPage.isUserNamePresent("user"));
userIndexPage = userIndexPage.clickEditLink("user")
.chooseRoleForGlobalAccess("User", "user")
.clickUpdateUserBtnInvalid("user");
assertTrue("Global access removed.",userIndexPage.isGlobalAccessErrorPresent());
userIndexPage.clickCancel("user");
}
@Test
public void createLdapUser(){
String baseUserName = "testLdapUser";
UserIndexPage userIndexPage = loginPage.login("user", "password")
.clickManageUsersLink()
.clickAddUserLink()
.enterName(baseUserName,null)
.enterPassword("lengthy password 2",null)
.enterConfirmPassword("lengthy password 2",null)
.clickLDAP(null)
.clickAddNewUserBtn()
.clickEditLink(baseUserName);
assertTrue("LDAP did not remain selected on creation", userIndexPage.isLDAPSelected(baseUserName));
//turnoff ldap
userIndexPage = userIndexPage.clickLDAP(baseUserName)
.clickUpdateUserBtn(baseUserName)
.clickEditLink(baseUserName);
assertFalse("LDAP did not remain selected on creation", userIndexPage.isLDAPSelected(baseUserName));
//turn ldap on
userIndexPage = userIndexPage.clickLDAP(baseUserName)
.clickUpdateUserBtn(baseUserName)
.clickEditLink(baseUserName)
.clickCancel(baseUserName);
assertTrue("LDAP did not remain selected on creation", userIndexPage.isLDAPSelected(baseUserName));
userIndexPage.clickDeleteButton(baseUserName)
.logout();
}
@Test
public void changeUserRoleTest(){
String baseUserName = "testChangeRoleUser";
UserIndexPage userIndexPage = loginPage.login("user", "password")
.clickManageUsersLink()
.clickAddUserLink()
.enterName(baseUserName,null)
.enterPassword("lengthy password 2",null)
.enterConfirmPassword("lengthy password 2",null)
.clickAddNewUserBtn()
.clickEditLink(baseUserName);
assertTrue("Administrator role was not selected",userIndexPage.isRoleSelected(baseUserName, "Administrator"));
userIndexPage = userIndexPage.chooseRoleForGlobalAccess("User",baseUserName)
.clickUpdateUserBtn(baseUserName)
.clickEditLink(baseUserName);
assertTrue("User role was not selected",userIndexPage.isRoleSelected(baseUserName, "User"));
userIndexPage = userIndexPage.chooseRoleForGlobalAccess("Read Access",baseUserName)
.clickUpdateUserBtn(baseUserName)
.clickEditLink(baseUserName);
assertTrue("Read Access role was not selected",userIndexPage.isRoleSelected(baseUserName, "Read Access"));
userIndexPage = userIndexPage.chooseRoleForGlobalAccess("Administrator",baseUserName)
.clickUpdateUserBtn(baseUserName)
.clickEditLink(baseUserName)
.clickGlobalAccess(baseUserName)
.clickUpdateUserBtn(baseUserName)
.clickEditLink(baseUserName);
assertFalse("Global Access was not revoked", userIndexPage.isGlobalAccessSelected(baseUserName));
userIndexPage = userIndexPage.clickGlobalAccess(baseUserName)
.clickUpdateUserBtn(baseUserName)
.clickEditLink(baseUserName);
assertTrue("Global Access was not Added", userIndexPage.isGlobalAccessSelected(baseUserName));
userIndexPage.clickCancel(baseUserName)
.clickDeleteButton(baseUserName)
.logout();
}
// If this test fails with the defaults changed it could cause the other user tests to fail
@Ignore
@Test
public void disableGlobalAccessTest(){
String baseUserName = "configureDefaultsUser";
ConfigureDefaultsPage configDefaultsPage = loginPage.login("user", "password")
.clickConfigureDefaultsLink()
.setRoleSelect("User")
.clickUpdateDefaults();
assertTrue("Default Changes not Saved",configDefaultsPage.isSaveSuccessful());
UserIndexPage userIndexPage = configDefaultsPage.clickManageUsersLink()
.clickAddUserLink()
.enterName(baseUserName,null)
.enterPassword("lengthy password 2",null)
.enterConfirmPassword("lengthy password 2",null)
.clickAddNewUserBtn()
.clickEditLink(baseUserName);
assertTrue("User role was not selected",userIndexPage.isRoleSelected(baseUserName, "User"));
configDefaultsPage = userIndexPage.clickCancel(baseUserName)
.clickDeleteButton(baseUserName)
.clickConfigureDefaultsLink()
.setRoleSelect("Administrator")
.clickUpdateDefaults();
assertTrue("Default Changes not Saved",configDefaultsPage.isSaveSuccessful());
userIndexPage = configDefaultsPage.clickManageUsersLink()
.clickAddUserLink()
.enterName(baseUserName,null)
.enterPassword("lengthy password 2",null)
.enterConfirmPassword("lengthy password 2",null)
.clickAddNewUserBtn()
.clickEditLink(baseUserName);
assertTrue("Administrator role was not selected",userIndexPage.isRoleSelected(baseUserName, "Administrator"));
configDefaultsPage = userIndexPage.clickCancel(baseUserName)
.clickDeleteButton(baseUserName)
.clickConfigureDefaultsLink()
.checkGlobalGroupCheckbox()
.clickUpdateDefaults();
assertTrue("Default Changes not Saved",configDefaultsPage.isSaveSuccessful());
userIndexPage = configDefaultsPage.clickManageUsersLink()
.clickAddUserLink()
.enterName(baseUserName,null)
.enterPassword("lengthy password 2",null)
.enterConfirmPassword("lengthy password 2",null)
.clickAddNewUserBtn()
.clickEditLink(baseUserName);
assertTrue("Read Access role was not selected",userIndexPage.isRoleSelected(baseUserName, "Read Access"));
userIndexPage.clickCancel(baseUserName)
.clickDeleteButton(baseUserName)
.clickConfigureDefaultsLink()
.checkGlobalGroupCheckbox()
.clickUpdateDefaults()
.logout();
}
@Test
public void userPasswordChangeTest(){
String baseUserName = "passwordChangeUser";
DashboardPage dashboardPage = loginPage.login("user", "password")
.clickManageUsersLink()
.clickAddUserLink()
.enterName(baseUserName,null)
.enterPassword("lengthy password 2",null)
.enterConfirmPassword("lengthy password 2",null)
.clickAddNewUserBtn()
.logout()
.login(baseUserName, "lengthy password 2");
assertTrue(baseUserName + "is not logged in",dashboardPage.isLoggedInUser(baseUserName));
UserChangePasswordPage passwordChangePage = dashboardPage.clickChangePasswordLink()
.setCurrentPassword("lengthy password 2")
.setNewPassword("lengthy password 3")
.setConfirmPassword("lengthy password 3")
.clickUpdate();
assertTrue("Password change did not save",passwordChangePage.isSaveSuccessful());
loginPage = passwordChangePage.logout()
.loginInvalid(baseUserName,"lengthy password 2");
assertTrue("Able to login with old password",loginPage.isloginError());
dashboardPage = loginPage.login(baseUserName, "lengthy password 3");
assertTrue(baseUserName + "is not logged in",dashboardPage.isLoggedInUser(baseUserName));
dashboardPage.logout()
.login("user", "password")
.clickManageUsersLink()
.clickDeleteButton(baseUserName)
.logout();
}
@Test
public void userPasswordChangeValidationTest(){
String baseUserName = "passwordChangeValidation";
DashboardPage dashboardPage = loginPage.login("user", "password")
.clickManageUsersLink()
.clickAddUserLink()
.enterName(baseUserName,null)
.enterPassword("lengthy password 2",null)
.enterConfirmPassword("lengthy password 2",null)
.clickAddNewUserBtn()
.logout()
.login(baseUserName, "lengthy password 2");
assertTrue(baseUserName + "is not logged in",dashboardPage.isLoggedInUser(baseUserName));
//wrong current password
UserChangePasswordPage passwordChangePage = dashboardPage.clickChangePasswordLink()
.setCurrentPassword("WRONGPASSWORD!!!!")
.setNewPassword("lengthy password 3")
.setConfirmPassword("lengthy password 3")
.clickUpdateInvalid();
assertTrue("Wrong current PW error not displayed",
passwordChangePage.getErrorText("currentPassword").equals("That was not the correct password."));
//blank new password
passwordChangePage = passwordChangePage
.setCurrentPassword("lengthy password 2")
.setNewPassword("")
.setConfirmPassword("")
.clickUpdateInvalid();
assertTrue("Blank new PW error not displayed",
passwordChangePage.getErrorText("password").equals("You must enter a new password."));
//different confirm and new passwords
passwordChangePage = passwordChangePage
.setCurrentPassword("lengthy password 2")
.setNewPassword("lengthy password 3")
.setConfirmPassword("lengthy password 34")
.clickUpdateInvalid();
assertTrue("Blank confirm PW error not displayed",
passwordChangePage.getErrorText("password").equals("Passwords do not match."));
//short password
passwordChangePage = passwordChangePage
.setCurrentPassword("lengthy password 2")
.setNewPassword("password")
.setConfirmPassword("password")
.clickUpdateInvalid();
assertTrue("short PW error not displayed",
passwordChangePage.getErrorText("password").equals("Password has a minimum length of 12."));
//can you still change password
passwordChangePage = passwordChangePage
.setCurrentPassword("lengthy password 2")
.setNewPassword("lengthy password 3")
.setConfirmPassword("lengthy password 3")
.clickUpdate();
assertTrue("Password change did not save",passwordChangePage.isSaveSuccessful());
loginPage = passwordChangePage.logout()
.loginInvalid(baseUserName, "");
assertTrue("blank password allowed login",loginPage.isloginError());
loginPage = loginPage.loginInvalid(baseUserName,"password");
assertTrue("short password allowed login",loginPage.isloginError());
dashboardPage = loginPage.login(baseUserName,"lengthy password 3");
assertTrue(baseUserName + "is not logged in",dashboardPage.isLoggedInUser(baseUserName));
dashboardPage.logout()
.login("user", "password")
.clickManageUsersLink()
.clickDeleteButton(baseUserName)
.logout();
}
}