////////////////////////////////////////////////////////////////////////
//
// 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.Test;
import org.openqa.selenium.remote.RemoteWebDriver;
import com.denimgroup.threadfix.data.entities.Application;
import com.denimgroup.threadfix.selenium.pages.ApplicationDetailPage;
import com.denimgroup.threadfix.selenium.pages.LoginPage;
import com.denimgroup.threadfix.selenium.pages.TeamIndexPage;
import com.denimgroup.threadfix.selenium.pages.WafRulesPage;
import com.denimgroup.threadfix.selenium.pages.WafIndexPage;
public class ApplicationTests extends BaseTest {
public ApplicationTests(String browser) {
super(browser);
// TODO Auto-generated constructor stub
}
private RemoteWebDriver driver;
private static LoginPage loginPage;
private ApplicationDetailPage applicationDetailPage;
private TeamIndexPage teamIndexPage;
private WafIndexPage wafIndexPage;
private WafRulesPage wafDetailPage;
@Before
public void init() {
super.init();
driver = (RemoteWebDriver) super.getDriver();
loginPage = LoginPage.open(driver);
}
@Test
public void testCreateBasicApplication() {
String teamName = "testCreateApplicationOrgw" + getRandomString(3);
String appName = "testCreateApplicationAppw" + getRandomString(3);
String urlText = "http://testurl.com";
teamIndexPage = loginPage.login("user", "password")
.clickOrganizationHeaderLink()
.clickAddTeamButton()
.setTeamName(teamName)
.addNewTeam()
.expandTeamRowByName(teamName)
.addNewApplication(teamName, appName, urlText, "Low")
.saveApplication(teamName);
applicationDetailPage = teamIndexPage.clickOrganizationHeaderLink()
.expandTeamRowByName(teamName)
.clickViewAppLink(appName, teamName);
assertTrue("The name was not preserved correctly.", applicationDetailPage.getNameText().contains(appName));
teamIndexPage = applicationDetailPage.clickOrganizationHeaderLink();
assertTrue("The organization was not preserved correctly.",
teamIndexPage.teamAddedToTable(teamName));
//cleanup
loginPage = teamIndexPage.expandTeamRowByName(teamName)
.clickViewAppLink(appName, teamName)
.clickDeleteLink()
.clickDeleteButton()
.logout();
}
@Test
public void testCreateBasicApplicationValidation() {
String orgName = "testCreateApplicationOrg2a";
String appName = null;
String urlText = "htnotaurl.com";
StringBuilder stringBuilder = new StringBuilder("");
for (int i = 0; i < Application.NAME_LENGTH + 50; i++) { stringBuilder.append('i'); }
String longInputName = stringBuilder.toString();
stringBuilder = new StringBuilder("");
for (int i = 0; i < Application.URL_LENGTH + 50; i++) { stringBuilder.append('i'); }
String longInputUrl = "http://" + stringBuilder.toString();
String emptyError = "This field cannot be blank";
String emptyString = "";
String whiteSpace = " ";
//set up an organization
teamIndexPage = loginPage.login("user", "password")
.clickOrganizationHeaderLink()
.clickAddTeamButton()
.setTeamName(orgName)
.addNewTeam()
.expandTeamRowByName(orgName)
.addNewApplication(orgName, emptyString, emptyString, "Low")
.saveApplicationInvalid(orgName);
assertTrue("The correct error did not appear for the name field.",
teamIndexPage.getNameErrorMessage().contains(emptyError));
teamIndexPage = teamIndexPage.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName)
.addNewApplication(orgName, whiteSpace, whiteSpace, "Low")
.saveApplicationInvalid(orgName);
assertTrue("The correct error did not appear for the name field.",
teamIndexPage.getNameErrorMessage().contains(emptyError));
assertTrue("The correct error did not appear for the url field.",
teamIndexPage.getUrlErrorMessage().contains("Not a valid URL"));
// Test URL format
teamIndexPage = teamIndexPage.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName)
.addNewApplication(orgName, "dummyApp", urlText, "Low")
.saveApplicationInvalid(orgName);
assertTrue("The correct error did not appear for the url field.",
teamIndexPage.getUrlErrorMessage().contains("Not a valid URL"));
// Test browser field length limits
applicationDetailPage = teamIndexPage.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName)
.addNewApplication(orgName, longInputName, longInputUrl, "Low")
.saveApplication(orgName)
.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName)
.clickViewAppLink("iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",orgName);
assertTrue("The length limit was incorrect for name.",
applicationDetailPage.getNameText().length() == Application.NAME_LENGTH);
// assertTrue("The length limit was incorrect for url.",
// applicationDetailPage.clickDetailsLink().getUrlText().length() == Application.URL_LENGTH);
appName = applicationDetailPage.getNameText();
teamIndexPage = applicationDetailPage.clickOrganizationHeaderLink();
// Test name duplication check
teamIndexPage = applicationDetailPage.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName)
.addNewApplication(orgName, appName, "http://dummyurl", "Low")
.saveApplicationInvalid(orgName);
assertTrue("The duplicate message didn't appear correctly.",
teamIndexPage.getNameErrorMessage().contains("That name is already taken."));
//cleanup
loginPage = teamIndexPage.clickOrganizationHeaderLink()
.clickViewTeamLink(orgName)
.clickDeleteButton()
.logout();
}
@Test
public void testEditBasicApplication() {
String orgName = "testCreateApplicationOrg21";
String appName1 = "testCreateApplicationApp21";
String urlText1 = "http://testurl.com";
String appName2 = "testCreateApplicationApp22";
String urlText2 = "http://testurl.com352";
// set up an organization
teamIndexPage = loginPage.login("user", "password")
.clickOrganizationHeaderLink()
.clickAddTeamButton()
.setTeamName(orgName)
.addNewTeam()
.expandTeamRowByName(orgName)
.addNewApplication(orgName, appName1, urlText1, "Low")
.saveApplication(orgName);
applicationDetailPage = teamIndexPage.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName)
.clickViewAppLink(appName1, orgName);
assertTrue("The name was not preserved correctly.",
appName1.equals(applicationDetailPage.getNameText()));
// assertTrue("The URL was not preserved correctly.",
// urlText1.equals(applicationDetailPage.clickDetailsLink().getUrlText()));
applicationDetailPage = applicationDetailPage.clickEditDeleteBtn()
.setNameInput(appName2)
.setUrlInput(urlText2)
.clickUpdateApplicationButton();
assertTrue("The name was not preserved correctly.",
appName2.equals(applicationDetailPage.getNameText()));
//TODO does not seem to be able to compare the urls on the application detail page, needs to be fixed
//assertTrue("The URL was not preserved correctly.",
// applicationDetailPage.clickDetailsLink().getUrlText().contains(urlText2));
// ensure that the application is present in the organization's app table.
teamIndexPage = applicationDetailPage.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName);
assertTrue("The application does not appear in the organization page.",
teamIndexPage.isAppPresent(appName2));
//cleanup
loginPage = teamIndexPage.clickViewTeamLink(orgName)
.clickDeleteButton()
.logout();
}
//validation on edit is not implemented yet
@Test
public void testEditBasicApplicationValidation() {
String orgName = "testCreateApplicationOrg312";
String appName2 = "testApp23";
String appName = "testApp17";
String validUrlText = "http://test.com";
String urlText = "htnotaurl.com";
StringBuilder stringBuilder = new StringBuilder("");
for (int i = 0; i < Application.NAME_LENGTH + 50; i++) { stringBuilder.append('i'); }
String longInputName = stringBuilder.toString();
stringBuilder = new StringBuilder("");
for (int i = 0; i < Application.URL_LENGTH + 50; i++) { stringBuilder.append('i'); }
String longInputUrl = "http://" + stringBuilder.toString();
String emptyError = "This field cannot be blank";
String emptyString = "";
String whiteSpace = " ";
//set up an organization,
//add an application for duplicate checking,
//add an application for normal testing,
// and Test a submission with no changes
applicationDetailPage = loginPage.login("user", "password")
.clickOrganizationHeaderLink()
.clickAddTeamButton()
.setTeamName(orgName)
.addNewTeam()
.expandTeamRowByName(orgName)
.addNewApplication(orgName, appName2, validUrlText, "Low")
.saveApplication(orgName)
.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName)
.addNewApplication(orgName, appName, validUrlText, "Low")
.saveApplication(orgName)
.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName)
.clickViewAppLink(appName,orgName)
.clickEditDeleteBtn()
.clickUpdateApplicationButton();
assertTrue("The name was not preserved correctly.",
appName.equals(applicationDetailPage.getNameText()));
// assertTrue("The URL was not preserved correctly.",
// validUrlText.equals(applicationDetailPage.clickDetailsLink().getUrlText()));
// Test blank input
applicationDetailPage = applicationDetailPage.clickEditDeleteBtn()
.setNameInput(emptyString)
.setUrlInput(emptyString)
.clickUpdateApplicationButtonInvalid();
assertTrue("The correct error did not appear for the name field.",
applicationDetailPage.getNameError().equals(emptyError));
// Test whitespace input
applicationDetailPage = applicationDetailPage.setNameInput(whiteSpace)
.setUrlInput(whiteSpace)
.clickUpdateApplicationButtonInvalid();
assertTrue("The correct error did not appear for the name field.",
applicationDetailPage.getNameError().equals(emptyError));
// assertTrue("The correct error did not appear for the url field.",
// applicationDetailPage.getUrlError().equals("Not a valid URL"));
// Test URL format
applicationDetailPage = applicationDetailPage.setNameInput("dummyName")
.setUrlInput(urlText)
.clickUpdateApplicationButtonInvalid();
assertTrue("The correct error did not appear for the url field.",
applicationDetailPage.getUrlError().equals("Not a valid URL"));
// Test name duplication check
applicationDetailPage = applicationDetailPage.setNameInput(appName2)
.setUrlInput("")
.clickUpdateApplicationButtonInvalid();
assertTrue("The duplicate message didn't appear correctly.",
applicationDetailPage.getNameError().equals("That name is already taken."));
// Test browser field length limits
applicationDetailPage = applicationDetailPage.setNameInput(longInputName)
.setUrlInput(longInputUrl)
.clickUpdateApplicationButton();
assertTrue("The length limit was incorrect for name.",
applicationDetailPage.getNameText().length() == Application.NAME_LENGTH);
// assertTrue("The length limit was incorrect for url.",
// applicationDetailPage.clickDetailsLink().getUrlText().length() == Application.URL_LENGTH);
//cleanup
loginPage = applicationDetailPage.clickDeleteLink()
.clickTextLinkInApplicationsTableBody(appName2)
.clickDeleteLink()
.clickDeleteButton()
.logout();
}
@Test
public void testAddWafAtApplicationCreationTimeAndDelete() {
String wafName = "appCreateTimeWaf1";
String type = "Snort";
String orgName = "appCreateTimeWafOrg2";
String appName = "appCreateTimeWafName2";
String appUrl = "http://testurl.com";
wafIndexPage = loginPage.login("user", "password").clickWafsHeaderLink()
.clickAddWafLink()
.createNewWaf(wafName, type)
.clickCreateWaf();
// Add Application with WAF
applicationDetailPage = wafIndexPage.clickOrganizationHeaderLink()
.clickAddTeamButton()
.setTeamName(orgName)
.addNewTeam()
.expandTeamRowByName(orgName)
.addNewApplication(orgName, appName, appUrl, "Low")
.saveApplication(orgName)
.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName)
.clickViewAppLink(appName,orgName)
.clickEditDeleteBtn()
.clickAddWaf()
.addWaf(wafName);
// assertTrue("The WAF was not added correctly.",
// applicationDetailPage.getWafText().equals(wafName));
// Check that it also appears on the WAF page.
wafDetailPage = applicationDetailPage.clickWafsHeaderLink()
.clickRules(wafName);
assertTrue("The WAF was not added correctly.",
wafDetailPage.isTextPresentInApplicationsTableBody(appName));
// Attempt to delete the WAF and ensure that it is a failure because the Application is still there
// If the page goes elsewhere, this call will fail.
wafIndexPage = wafDetailPage.clickWafsHeaderLink()
.clickDeleteWaf(wafName);
// Delete app and org and make sure the Application doesn't appear in the WAFs table.
wafDetailPage = wafIndexPage.clickOrganizationHeaderLink()
.clickViewTeamLink(orgName)
.clickDeleteButton()
.clickWafsHeaderLink()
.clickRules(wafName);
assertFalse("The Application was not removed from the WAF correctly.",
wafDetailPage.isTextPresentInApplicationsTableBody(appName));
loginPage = wafDetailPage.clickWafsHeaderLink().clickDeleteWaf(wafName).logout();
}
@Test
public void testSwitchWafs() {
//TODO
String wafName1 = "firstWaf";
String wafName2 = "wafToSwitch";
String type1 = "Snort";
String type2 = "mod_security";
String orgName = "switchWafOrg";
String appName = "switchWafApp";
String appUrl = "http://testurl.com";
// create WAFs and set up the application with one
// then switch to the other one and verify that the switch has been made.
applicationDetailPage = loginPage.login("user", "password")
.clickWafsHeaderLink()
.clickAddWafLink()
.createNewWaf(wafName1, type1)
.clickCreateWaf()
.clickAddWafLink()
.createNewWaf(wafName2, type2)
.clickCreateWaf()
.clickOrganizationHeaderLink()
.clickAddTeamButton()
.setTeamName(orgName)
.addNewTeam()
.expandTeamRowByName(orgName)
.addNewApplication(orgName, appName, appUrl, "Low")
.saveApplication(orgName)
.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName)
.clickViewAppLink(appName,orgName)
.clickEditDeleteBtn()
.clickAddWaf()
.addWaf(wafName1)
.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName)
.clickViewAppLink(appName,orgName)
.clickEditDeleteBtn()
.clickEditWaf()
.addWaf(wafName2)
.clickOrganizationHeaderLink()
.expandTeamRowByName(orgName)
.clickViewAppLink(appName,orgName)
.clickEditDeleteBtn();
assertTrue("The edit didn't change the application's WAF.",
applicationDetailPage.getWafText().contains(wafName2));
//cleanup
loginPage = applicationDetailPage.clickOrganizationHeaderLink()
.clickViewTeamLink(orgName)
.clickDeleteButton()
.clickWafsHeaderLink()
.clickDeleteWaf(wafName1)
.clickDeleteWaf(wafName2)
.logout();
}
public void sleep(int num) {
try {
Thread.sleep(num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}