/*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.xwiki.test.selenium;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.xwiki.test.selenium.framework.AbstractXWikiTestCase;
import org.xwiki.test.selenium.framework.FlamingoSkinExecutor;
import org.xwiki.test.selenium.framework.XWikiTestSuite;
import junit.framework.Test;
/**
* Verify the overall Administration application features.
*
* @version $Id: 198e8ac635018b603b5d3dfcc0ecc1e65f3585c4 $
*/
public class AdministrationTest extends AbstractXWikiTestCase
{
public static Test suite()
{
XWikiTestSuite suite = new XWikiTestSuite("Verify the Administration application features.");
suite.addTestSuite(AdministrationTest.class, FlamingoSkinExecutor.class);
return suite;
}
@Override
public void setUp() throws Exception
{
super.setUp();
loginAsAdmin();
}
/*
* Test to see an application page is included only if that application exists
*/
public void testApplicationSection()
{
// Delete the Blog.Categories page and test it's not present in the admin global menu anymore
deletePage("XWiki", "SearchAdmin");
clickAdministerWiki();
assertElementNotPresent("//*[contains(@class, 'admin-menu')]//a[contains(@href, 'section=Search')]");
restorePage("XWiki", "SearchAdmin");
}
/*
* Test modifying XWiki.XWikiPreferences multi-language field and save it.
*/
public void testSettingXWikiPreferences()
{
clickAdministerWiki();
getSelenium().select("goto-select", "label=Wiki administration");
clickLinkWithXPath("//a[text()='Localization']", true);
getSelenium().select("//select[@name='XWiki.XWikiPreferences_0_multilingual']", "label=Yes");
clickLinkWithXPath("//input[@value='Save']", true);
assertElementPresent("//a[@id='tmLanguages']");
}
/*
* Test adding a new category in Blog Categories
*/
/* Disabled until the new blog can insert its own administration page.
public void testBlogAdmin()
{
open("XWiki", "XWikiPreferences", "admin");
// select global administration
clickLinkWithLocator("//span[text()='General']", true);
getSelenium().select("//select[@id='XWiki.XWikiPreferences_0_editor']", "label=Text");
clickLinkWithLocator("//input[@value='Save']");
assertElementPresent("//span[@id='showsectionswrapper']");
clickLinkWithXPath("//a[@id='showsections']", false);
assertElementPresent("//span[@id='hidesectionswrapper']");
clickLinkWithLocator("//span[text()='Blog categories']");
setFieldValue("name", "New Category");
setFieldValue("description", "New Category Content");
clickLinkWithLocator("//input[@value='Add']", true);
assertTextPresent("New Category");
}*/
/*
* Test Panel Wizard
*/
public void testPanelsAdmin()
{
open("XWiki", "XWikiPreferences", "admin");
// test panel wizard at global level
clickLinkWithLocator("//a[text()='Panel Wizard']");
waitForBodyContains("Page Layout");
clickLinkWithXPath("//a[@href='#PageLayoutSection']", false);
waitForElement("//div[@id = 'rightcolumn']");
clickLinkWithXPath("//div[@id='rightcolumn']", false);
waitForBodyContains("Panel List");
clickLinkWithXPath("//a[@href='#PanelListSection']", false);
dragAndDrop(By.xpath("//div[@class='panel expanded CategoriesPanel']//h1"), By.id("rightPanels"));
assertElementPresent("//div[@id = 'rightPanels']/div[contains(@class, 'CategoriesPanel')]");
clickLinkWithXPath("//button[text()='Save the new layout']", false);
waitForNotificationSuccessMessage("The layout has been saved properly.");
open("Main", "WebHome");
assertElementNotPresent("leftPanels");
assertElementPresent("rightPanels");
assertElementPresent("//div[@id = 'rightPanels']/div[contains(@class, 'CategoriesPanel')]");
// Revert changes
open("XWiki", "XWikiPreferences", "admin");
clickLinkWithLocator("//a[text()='Panel Wizard']");
waitForBodyContains("Page Layout");
clickLinkWithXPath("//a[@href='#PageLayoutSection']", false);
waitForCondition("selenium.isElementPresent(\"//div[@id='bothcolumns']\")!=false;");
clickLinkWithXPath("//div[@id='bothcolumns']", false);
waitForBodyContains("Panel List");
clickLinkWithXPath("//a[@href='#PanelListSection']", false);
dragAndDrop(By.xpath("//div[@id='rightPanels']//div[contains(@class, 'CategoriesPanel')]//h1"),
By.xpath("//div[@id='allviewpanels']//div[@class='accordionTabContentBox']"));
assertElementNotPresent("//div[@id = 'rightPanels']//div[contains(@class, 'CategoriesPanel')]");
clickLinkWithXPath("//button[text()='Save the new layout']", false);
waitForNotificationSuccessMessage("The layout has been saved properly.");
open("Main", "WebHome");
assertElementPresent("leftPanels");
assertElementPresent("rightPanels");
assertElementNotPresent("//div[@id = 'rightPanels']//div[contains(@class, 'CategoriesPanel')]");
// test panel wizard at space level
open("TestPanelsAdmin", "WebHome", "edit", "editor=wiki");
setFieldValue("content", "aaa");
clickEditSaveAndView();
open("TestPanelsAdmin", "WebPreferences", "admin");
clickLinkWithLocator("//a[text()='Panel Wizard']");
waitForBodyContains("Page Layout");
clickLinkWithXPath("//a[@href='#PageLayoutSection']", false);
waitForCondition("selenium.isElementPresent(\"//div[@id='leftcolumn']\")!=false;");
clickLinkWithXPath("//div[@id='leftcolumn']", false);
waitForBodyContains("Panel List");
clickLinkWithXPath("//a[@href='#PanelListSection']", false);
dragAndDrop(By.xpath("//div[@class='panel expanded CategoriesPanel']//h1"), By.id("leftPanels"));
clickLinkWithXPath("//button[text()='Save the new layout']", false);
waitForNotificationSuccessMessage("The layout has been saved properly.");
open("TestPanelsAdmin", "WebHome");
assertElementPresent("leftPanels");
assertElementPresent("//div[@id = 'leftPanels']//div[contains(@class, 'CategoriesPanel')]");
open("XWiki", "WebHome");
assertElementPresent("rightPanels");
assertElementNotPresent("//div[@id = 'leftPanels']//div[contains(@class, 'CategoriesPanel')]");
}
/*
* Test add configurable application to existing section.
*
* This test depends on the "Presentation" section existing.
* Tests: XWiki.ConfigurableClass
*/
public void testAddConfigurableApplicationInExistingSection()
{
// Create the configurable for global admin.
createConfigurableApplication("Main", "TestConfigurable", "Presentation", true);
// Check it's available in global section.
open("XWiki", "XWikiPreferences", "admin", "editor=globaladmin§ion=Presentation");
assertConfigurationPresent("Main", "TestConfigurable");
// Check it's not available in space section.
open("Main", "WebPreferences", "admin", "editor=spaceadmin§ion=Presentation");
assertConfigurationNotPresent("Main", "TestConfigurable");
// Switch application to non-global
open("Main", "TestConfigurable", "edit", "editor=object");
expandObject("XWiki.ConfigurableClass", 0);
getSelenium().uncheck("XWiki.ConfigurableClass_0_configureGlobally");
clickEditSaveAndView();
// Check that it is available in space section.
open("Main", "WebPreferences", "admin", "editor=spaceadmin§ion=Presentation");
assertConfigurationPresent("Main", "TestConfigurable");
// Check that it's not available in another space.
open("XWiki", "WebPreferences", "admin", "editor=spaceadmin§ion=Presentation");
assertConfigurationNotPresent("Main", "TestConfigurable");
// Check that it's not available in global section.
open("XWiki", "XWikiPreferences", "admin", "editor=globaladmin§ion=Presentation");
assertConfigurationNotPresent("Main", "TestConfigurable");
}
/**
* Test add configurable application to a nonexistent section.
* <p>
* This test depends on the "HopingThereIsNoSectionByThisName" section not existing.<br/>
* Tests: XWiki.ConfigurableClass
*/
public void testAddConfigurableApplicationInNonexistantSection()
{
String section = "HopingThereIsNoSectionByThisName";
// Create the configurable for global admin.
createConfigurableApplication("Main", "TestConfigurable", section, true);
// Check it's available in global section.
clickAdministerWiki();
waitForElement(getAdminMenuItemLocator(section));
clickLinkWithText(section);
assertConfigurationPresent("Main", "TestConfigurable");
// Check that it's not available in space section.
open("Main", "WebPreferences", "admin");
// Assert there is no menu item in the administration menu for our configurable application.
assertElementNotPresent(getAdminMenuItemLocator(section));
}
/**
* Fails if a user can create a Configurable application without having edit access to the configuration page (in
* this case: XWikiPreferences)
* <p>
* Tests: XWiki.ConfigurableClass
*/
public void testConfigurableCreatedByUnauthorizedWillNotExecute()
{
// Make sure the configurable page doesn't exist because otherwise we may fail to overwrite it with a
// non-administrator user.
deletePage("Main", "testConfigurableCreatedByUnauthorizedWillNotExecute");
// Create the configurable for global administrator.
loginAndRegisterUser("anotherJoker", "bentOnMalice", false);
String nonExistingSection = "HopingThereIsNoSectionByThisName";
createConfigurableApplication("Main",
"testConfigurableCreatedByUnauthorizedWillNotExecute",
nonExistingSection, true);
loginAsAdmin();
open("XWiki", "XWikiPreferences", "admin", "editor=globaladmin§ion=" + nonExistingSection);
assertConfigurationNotEditable("Main", "testConfigurableCreatedByUnauthorizedWillNotExecute");
}
/*
* Creates a document with 2 configurable objects, one gets configured globally in one section and displays
* 2 configuration fields, the other is configured in the space in another section and displays the other 2
* fields. Fails if they are not displayed as they should be.
*
* Tests: XWiki.ConfigurableClass
*/
public void testApplicationConfiguredInMultipleSections()
{
String space = "Main";
String page = "TestConfigurable";
createConfigurableApplication(space, page, "TestSection1", true);
open(space, page, "edit", "editor=object");
// Add a second configurable object.
getSelenium().select("classname", "value=XWiki.ConfigurableClass");
clickButtonAndContinue("//input[@name='action_objectadd']");
setFieldValue("XWiki.ConfigurableClass_1_displayInSection", "TestSection2");
setFieldValue("XWiki.ConfigurableClass_1_heading", "Some Other Heading");
setFieldValue("XWiki.ConfigurableClass_1_configurationClass", space + "." + page);
getSelenium().uncheck("XWiki.ConfigurableClass_1_configureGlobally");
// Set propertiesToShow so that each config only shows half of the properties.
setFieldValue("XWiki.ConfigurableClass_1_propertiesToShow", "TextArea, Select");
setFieldValue("XWiki.ConfigurableClass_0_propertiesToShow", "String, Boolean");
clickEditSaveAndView();
// Assert that half of the configuration shows up but not the other half.
open("XWiki", "XWikiPreferences", "admin", "editor=globaladmin§ion=TestSection1");
assertElementPresent("//div[@id='admin-page-content']/h2[@id='HSomeHeading']/span");
// Fields
String fullName = space + "." + page;
String form = "//div[@id='admin-page-content']/form[@action='/xwiki/bin/save/" + space + "/" + page + "']";
assertElementPresent(form + "/fieldset//label['String']");
assertElementPresent(form + "/fieldset//input[@name='" + fullName + "_0_String']");
assertElementPresent(form + "/fieldset//label['Boolean']");
assertElementPresent(form + "/fieldset//select[@name='" + fullName + "_0_Boolean']");
assertElementPresent(form + "/fieldset/input[@id='" + fullName + "_redirect']");
// xredirect
assertElementPresent(form + "/fieldset/input[@value='" + getSelenium().getLocation() + "'][@name='xredirect']");
// Save button
// assertElementPresent(form + "/div/p/span/input[@type='submit']");
// Javascript injects a save button outside of the form and removes the default save button.
waitForElement("//div/div/p/span/input[@type='submit'][@value='Save']");
// Should not be here
assertElementNotPresent(form + "/fieldset//textarea[@name='" + fullName + "_0_TextArea']");
assertElementNotPresent(form + "/fieldset//select[@name='" + fullName + "_0_Select']");
// Now we go to where the other half of the configuration should be.
open("Main", "WebPreferences", "admin", "editor=spaceadmin§ion=TestSection2");
assertElementPresent("//h2[@id='HSomeOtherHeading']/span");
// Fields
assertElementPresent(form + "/fieldset//label");
assertElementPresent(form + "/fieldset//textarea[@name='" + fullName + "_0_TextArea']");
assertElementPresent(form + "/fieldset//select[@name='" + fullName + "_0_Select']");
assertElementPresent(form + "/fieldset/input[@id='" + fullName + "_redirect']");
// xredirect
assertElementPresent(form + "/fieldset/input[@value='" + getSelenium().getLocation() + "'][@name='xredirect']");
// Save button
// assertElementPresent(form + "/div/p/span/input[@type='submit']");
// Javascript injects a save button outside of the form and removes the default save button.
waitForElement("//div/div/p/span/input[@type='submit'][@value='Save']");
// Should not be here
assertElementNotPresent(form + "/fieldset//input[@name='" + fullName + "_0_String']");
assertElementNotPresent(form + "/fieldset//select[@name='" + fullName + "_0_Boolean']");
}
/*
* Make sure html macros and pre tags are not being stripped
* @see: http://jira.xwiki.org/jira/browse/XAADMINISTRATION-141
*
* Tests: XWiki.ConfigurableClass
*/
public void testNotStrippingHtmlMacros()
{
String space = "Main";
String page = "TestConfigurable";
String test = "{{html}} <pre> {{html clean=\"false\"}} </pre> {{/html}}";
String fullName = space + "." + page;
String form = "//div[@id='admin-page-content']/form[@action='/xwiki/bin/save/" + space + "/" + page + "']";
createConfigurableApplication(space, page, "TestSection1", true);
open(space, page, "edit", "editor=object");
expandObject(fullName, 0);
setFieldValue(fullName + "_0_TextArea", test);
setFieldValue(fullName + "_0_String", test);
clickEditSaveAndView();
open("XWiki", "XWikiPreferences", "admin", "editor=globaladmin§ion=TestSection1");
waitForTextPresent(form + "/fieldset//textarea[@name='" + fullName + "_0_TextArea']", test);
// Getting content from an input field required getValue and not getText
assertTrue(getSelenium().getValue(form + "/fieldset//input[@name='" + fullName + "_0_String']").equals(test));
}
/*
* If a value is specified for linkPrefix, then a link is generated with linkPrefix + prettyName of the property from
* the configuration class.
* linkPrefix = "http://www.xwiki.org/bin/view/Main/"
* property prettyName = "WebHome"
* generated link should equal "http://www.xwiki.org/bin/view/Main/WebHome"
*
* Tests: XWiki.ConfigurableClass
*/
public void testLabelLinkGeneration()
{
String space = "Main";
String page = "TestConfigurable";
createConfigurableApplication(space, page, "TestSection3", true);
open(space, page, "edit", "editor=object");
setFieldValue("XWiki.ConfigurableClass_0_linkPrefix", "TheLinkPrefix");
clickEditSaveAndView();
open("XWiki", "XWikiPreferences", "admin", "editor=globaladmin§ion=TestSection3");
assertElementPresent("//form/fieldset//a[@href='TheLinkPrefixString']");
assertElementPresent("//form/fieldset//a[@href='TheLinkPrefixBoolean']");
assertElementPresent("//form/fieldset//a[@href='TheLinkPrefixTextArea']");
assertElementPresent("//form/fieldset//a[@href='TheLinkPrefixSelect']");
}
/*
* Fails unless XWiki.ConfigurableClass locks each page on view and unlocks any other configurable page.
* Also fails if codeToExecute is not being evaluated.
*
* Tests: XWiki.ConfigurableClass
*/
public void testLockingAndUnlocking()
{
String space = "Main";
String page1 = "TestConfigurable";
String page2 = "TestConfigurable2";
String isThisPageLocked = "{{velocity}}Is This Page Locked $doc.getLocked(){{/velocity}}";
createConfigurableApplication(space, page1, "TestSection4", true);
createConfigurableApplication(space, page2, "TestSection5", true);
open(space, page1, "edit", "editor=wiki");
setFieldValue("content", isThisPageLocked);
clickEditSaveAndView();
open(space, page2, "edit", "editor=wiki");
setFieldValue("content", isThisPageLocked);
clickEditSaveAndView();
// Now we go to the documents and see which is locked.
open("XWiki", "XWikiPreferences", "admin", "editor=globaladmin§ion=TestSection4");
try {
// We have to switch user context without logging out, logging out removes all locks.
// We have to open a new window because otherwise the lock is removed when we leave the administration page.
getSelenium().openWindow("http://127.0.0.1:8080" + getUrl(space, page1, "view"), getName());
getSelenium().selectWindow(getName());
assertTextPresent("Is This Page Locked true");
open("http://127.0.0.1:8080" + getUrl(space, page2, "view"));
assertTextPresent("Is This Page Locked false");
getSelenium().selectWindow(null);
open("XWiki", "XWikiPreferences", "admin", "editor=globaladmin§ion=TestSection5");
getSelenium().selectWindow(getName());
open("http://127.0.0.1:8080" + getUrl(space, page1, "view"));
assertTextPresent("Is This Page Locked false");
open("http://127.0.0.1:8080" + getUrl(space, page2, "view"));
assertTextPresent("Is This Page Locked true");
// Close the window we needed for a different user context.
getSelenium().close();
} finally {
getSelenium().selectWindow(null);
}
}
/*
* If CodeToExecute is defined in a configurable app, then it should be evaluated.
* Also header should be evaluated and not just printed.
* If XWiki.ConfigurableClass is saved with programming rights, it should resave itself so that it doesn't have them.
*/
public void testCodeToExecutionAndAutoSandboxing()
{
String space = "Main";
String page = "TestConfigurable";
String codeToExecute = "#set($code = 's sh')"
+ "Thi${code}ould be displayed."
+ "#if($xcontext.hasProgrammingRights())"
+ "This should not be displayed."
+ "#end";
String heading = "#set($code = 'his sho')"
+ "T${code}uld also be displayed.";
createConfigurableApplication(space, page, "TestSection6", true);
open(space, page, "edit", "editor=object");
expandObject("XWiki.ConfigurableClass", 0);
setFieldValue("XWiki.ConfigurableClass_0_codeToExecute", codeToExecute);
setFieldValue("XWiki.ConfigurableClass_0_heading", heading);
setFieldValue("XWiki.ConfigurableClass_0_configurationClass", "");
clickEditSaveAndView();
// Our admin will foolishly save XWiki.ConfigurableClass, giving it programming rights.
open("XWiki", "ConfigurableClass", "edit", "editor=wiki");
try {
// Since we modify ConfigurableClass, we must modify it back after to prevent polluting further tests.
// See http://code.google.com/p/selenium/issues/detail?id=2876 .
getDriver().findElement(By.id("content")).sendKeys(Keys.chord(Keys.CONTROL, "a"),
Keys.chord(Keys.CONTROL, "c"), Keys.ARROW_RIGHT,
"{{velocity}}Has Programming permission: $xcontext.hasProgrammingRights(){{/velocity}}");
clickEditSaveAndContinue();
// Now we look at the section for our configurable.
open("XWiki", "ConfigurableClass", "view", "editor=globaladmin§ion=TestSection6");
assertTextPresent("This should be displayed.");
assertTextPresent("This should also be displayed.");
assertTextNotPresent("This should not be displayed.");
assertTextPresent("Has Programming permission: false");
// Make sure javascript has not added a Save button.
assertElementNotPresent("//div/div/p/span/input[@type='submit'][@value='Save']");
} finally {
open("XWiki", "ConfigurableClass", "edit", "editor=wiki");
getDriver().findElement(By.id("content")).sendKeys(Keys.chord(Keys.CONTROL, "a"),
Keys.chord(Keys.CONTROL, "v"));
clickEditSaveAndContinue();
}
}
/*
* Proves that ConfigurationClass#codeToExecute is not rendered inline even if there is no
* custom configuration class and the on;y content is custom content.
* Tests: XWiki.ConfigurableClass
*/
public void testCodeToExecuteNotInlineIfNoConfigurationClass()
{
String space = "Main";
String page = "TestConfigurable";
String test = "{{html}} <div> <p> hello </p> </div> {{/html}}";
open(space, page, "delete", "confirm=1");
createConfigurableApplication(space, page, "TestSection1", true);
open(space, page, "edit", "editor=object");
expandObject("XWiki.ConfigurableClass", 0);
setFieldValue("XWiki.ConfigurableClass_0_configurationClass", "");
setFieldValue("XWiki.ConfigurableClass_0_codeToExecute", test);
clickEditSaveAndView();
open("XWiki", "XWikiPreferences", "admin", "editor=globaladmin§ion=TestSection1");
assertElementNotPresent("//span[@class='xwikirenderingerror']");
}
/*
* Proves that ConfigurationClass#codeToExecute is not rendered inline whether it's at the top of the
* form or inside of the form.
* Tests: XWiki.ConfigurableClass
*/
public void testCodeToExecuteNotInline()
{
String space = "Main";
String page = "TestConfigurable";
String test = "{{html}} <div> <p> hello </p> </div> {{/html}}";
createConfigurableApplication(space, page, "TestSection1", true);
open(space, page, "edit", "editor=object");
expandObject("XWiki.ConfigurableClass", 0);
setFieldValue("XWiki.ConfigurableClass_0_codeToExecute", test);
setFieldValue("XWiki.ConfigurableClass_0_propertiesToShow", "String, Boolean");
getSelenium().select("classname", "value=XWiki.ConfigurableClass");
clickButtonAndContinue("//input[@name='action_objectadd']");
setFieldValue("XWiki.ConfigurableClass_1_displayInSection", "TestSection1");
setFieldValue("XWiki.ConfigurableClass_1_configurationClass", space + "." + page);
setFieldValue("XWiki.ConfigurableClass_1_propertiesToShow", "TextArea, Select");
setFieldValue("XWiki.ConfigurableClass_1_codeToExecute", test);
getSelenium().check("XWiki.ConfigurableClass_1_configureGlobally");
clickEditSaveAndView();
open("XWiki", "XWikiPreferences", "admin", "editor=globaladmin§ion=TestSection1");
assertElementNotPresent("//span[@class='xwikirenderingerror']");
}
/**
* Test functionality of the ForgotUsername page:
* <ul>
* <li>A user can be found using correct email</li>
* <li>No user is found using wrong email</li>
* <li>Email text is properly escaped</li>
* </ul>
*/
public void testForgotUsername()
{
String space = "Test";
String page = "SQLTestPage";
String mail = "webmaster@xwiki.org"; // default Admin mail
String user = "Admin";
String badMail = "bad_mail@evil.com";
// Ensure there is a page we will try to find using HQL injection
editInWikiEditor(space, page);
setFieldValue("title", page);
setFieldValue("content", page);
clickEditSaveAndView();
// test that it finds the correct user
open("XWiki", "ForgotUsername");
setFieldValue("e", mail);
submit("//input[@type='submit']"); // there are no other buttons
assertTextNotPresent("No account is registered using this email address");
assertElementPresent("//div[@id='xwikicontent']//strong[text()='" + user + "']");
// test that bad mail results in no results
open("XWiki", "ForgotUsername");
setFieldValue("e", badMail);
submit("//input[@type='submit']"); // there are no other buttons
assertTextPresent("No account is registered using this email address");
assertElementNotPresent("//div[@id='xwikicontent']//strong[@value='" + user + "']");
// XWIKI-4920 test that the email is properly escaped
open("XWiki", "ForgotUsername");
setFieldValue("e", "a' synta\\'x error");
submit("//input[@type='submit']"); // there are no other buttons
assertTextPresent("No account is registered using this email address");
assertTextNotPresent("Error");
}
/**
* @return an XPath to locate the item with the specified label in the administration vertical menu
*/
public String getAdminMenuItemLocator(String label)
{
return "//*[contains(@class, 'admin-menu')]//a[. = '" + label + "']";
}
/*
* Fails if there is an administration icon for the named section.
* Must be in the administration app first.
* Tests: XWiki.ConfigurableClass
*/
public void assertConfigurationIconNotPresent(String section)
{
assertElementNotPresent("//div[contains(@class,'admin-menu')]//li[contains(@href,'section=" + section + "')]");
}
/**
* Will fail unless it detects a configuration of the type created by createConfigurableApplication.<br/>
* Tests: XWiki.ConfigurableClass
*/
public void assertConfigurationPresent(String space, String page)
{
assertElementPresent("//div[@id='admin-page-content']/h2[@id='HSomeHeading']/span");
// Fields
String fullName = space + "." + page;
String form = "//div[@id='admin-page-content']/form[@action='/xwiki/bin/save/" + space + "/" + page + "']";
assertElementPresent(form + "/fieldset/dl/dt[1]/label");
assertElementPresent(form + "/fieldset/dl/dd[1]/input[@name='" + fullName + "_0_String']");
assertElementPresent(form + "/fieldset/dl/dt[2]/label");
assertElementPresent(form + "/fieldset/dl/dd[2]/select[@name='" + fullName + "_0_Boolean']");
assertElementPresent(form + "/fieldset/dl/dt[3]/label");
assertElementPresent(form + "/fieldset/dl/dd[3]/textarea[@name='" + fullName + "_0_TextArea']");
assertElementPresent(form + "/fieldset/dl/dt[4]/label");
assertElementPresent(form + "/fieldset/dl/dd[4]/select[@name='" + fullName + "_0_Select']");
assertElementPresent(form + "/fieldset/input[@id='" + fullName + "_redirect']");
assertElementPresent(form + "/fieldset/input[@value='" + getSelenium().getLocation() + "'][@name='xredirect']");
// JavaScript injects a save button outside of the form and removes the default save button.
waitForElement("//*[@class = 'admin-buttons']//input[@type = 'submit' and @value = 'Save']");
}
/*
* Will fail if it detects a configuration of the type created by createConfigurableApplication.
* Tests: XWiki.ConfigurableClass
*/
public void assertConfigurationNotPresent(String space, String page)
{
assertElementNotPresent("//div[@id='admin-page-content']/h1[@id='HCustomize" + space + "." + page + ":']/span");
assertElementNotPresent("//div[@id='admin-page-content']/h2[@id='HSomeHeading']/span");
assertConfigurationNotEditable(space, page);
}
public void assertConfigurationNotEditable(String space, String page)
{
assertElementNotPresent("//div[@id='admin-page-content']/form[@action='/xwiki/bin/save/"
+ space + "/" + page + "']");
}
/**
* Creates a new page with a configuration class with some simple fields<br/>
* then adds an object of class configurable and one of it's own class.<br/>
* Tests: XWiki.ConfigurableClass
*/
public void createConfigurableApplication(String space, String page, String section, boolean global)
{
// We have to use an existing space because the copy page form doesn't allow entering a new space.
String storageSpace = "Sandbox";
String storagePage = "CreateConfigurableApplication";
if (!tryToCopyPage(storageSpace, storagePage, space, page)) {
// Create the page with a simple configuration class.
createPage(space, page, "Test configurable application.", "xwiki/2.0");
open(space, page, "edit", "editor=class");
setFieldValue("propname", "String");
setFieldValue("proptype", "String");
clickButtonAndContinue("//input[@name='action_propadd']");
setFieldValue("propname", "Boolean");
setFieldValue("proptype", "Boolean");
clickButtonAndContinue("//input[@name='action_propadd']");
setFieldValue("propname", "TextArea");
setFieldValue("proptype", "TextArea");
clickButtonAndContinue("//input[@name='action_propadd']");
setFieldValue("propname", "Select");
setFieldValue("proptype", "StaticList");
clickButtonAndContinue("//input[@name='action_propadd']");
// Go to the object section.
open(space, page, "edit", "editor=object");
// Add a configurable object which points to the new class as the configuration class.
getSelenium().select("classname", "value=XWiki.ConfigurableClass");
clickButtonAndContinue("//input[@name='action_objectadd']");
clickEditSaveAndView();
// Try to place it in the storage area.
tryToCopyPage(space, page, storageSpace, storagePage);
}
// Go to the object section.
open(space, page, "edit", "editor=object");
// Add an object of the new class.
waitForElement("classname");
getSelenium().select("classname", "value=" + space + "." + page);
// Scroll the page to the top because the edit menu can be activated when we hover over the add button.
getSelenium().runScript("window.scrollTo(0, 0)");
clickButtonAndContinue("//input[@name='action_objectadd']");
setFieldValue("XWiki.ConfigurableClass_0_displayInSection", section);
setFieldValue("XWiki.ConfigurableClass_0_heading", "Some Heading");
setFieldValue("XWiki.ConfigurableClass_0_configurationClass", space + "." + page);
if (global == true) {
getSelenium().check("XWiki.ConfigurableClass_0_configureGlobally");
} else {
getSelenium().uncheck("XWiki.ConfigurableClass_0_configureGlobally");
}
// We won't set linkPrefix, propertiesToShow, codeToExecute, or iconAttachment.
clickEditSaveAndView();
}
/**
* This is used by createConfigurableApplication to store a copy of the default configurable to speed up making
* them.
*/
public boolean tryToCopyPage(String fromSpace, String fromPage, String toSpace, String toPage)
{
open(fromSpace, fromPage);
if (!isExistingPage()) {
return false;
}
return copyPage(fromSpace, fromPage, toSpace, toPage);
}
private void clickAdministerWiki()
{
// Open the wiki top menu.
getSelenium().click("//li[@id='tmMainWiki']//a[contains(@class, 'dropdown-toggle')]");
// Click the "Administer Wiki" link.
getSelenium().click("tmAdminWiki");
}
}