/*
* 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.flamingo.test.ui;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.xwiki.model.reference.DocumentReference;
import org.xwiki.model.reference.EntityReference;
import org.xwiki.model.reference.SpaceReference;
import org.xwiki.model.reference.WikiReference;
import org.xwiki.test.ui.AbstractTest;
import org.xwiki.test.ui.SuperAdminAuthenticationRule;
import org.xwiki.test.ui.po.BreadcrumbElement;
import org.xwiki.test.ui.po.CreatePagePage;
import org.xwiki.test.ui.po.DocumentDoesNotExistPage;
import org.xwiki.test.ui.po.ViewPage;
import org.xwiki.test.ui.po.editor.EditPage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
/**
* Tests that the create action and UI properly create Nested Documents at various levels in the hierarchy.
*
* @version $Id: b0b883463da6c4323dbf08ab8fc3aa10b24a1375 $
* @since 7.2RC1
*/
public class CreatePageNestedDocumentsTest extends AbstractTest
{
@Rule
public SuperAdminAuthenticationRule authenticationRule = new SuperAdminAuthenticationRule(getUtil());
// @formatter:off
public static List<DocumentReference> nestedDocuments = Arrays.asList(
// /A (Top level document)
new DocumentReference("xwiki", Arrays.asList("A"), "WebHome"),
// /A/B (Child document of a top level document, A)
new DocumentReference("xwiki", Arrays.asList("A", "B"), "WebHome"),
// /A/B/C (Child document of a child document, B)
new DocumentReference("xwiki", Arrays.asList("A", "B", "C"), "WebHome"),
// /A/B/C/D (Child of a child, of a child, C)
new DocumentReference("xwiki", Arrays.asList("A", "B", "C", "D"), "WebHome"),
// /A/B/C/D/E (etc...)
new DocumentReference("xwiki", Arrays.asList("A", "B", "C", "D", "E"), "WebHome"),
// /A/B/C/D/E/F/G (Child document of a non-existing document, i.e. hole in the hierarchy at the end)
new DocumentReference("xwiki", Arrays.asList("A", "B", "C", "D", "E", "F", "G"), "WebHome"),
// /X/Y (Child document of a non-existing top level document, i.e. hole in the hierarchy at the beginning)
new DocumentReference("xwiki", Arrays.asList("X", "Y"), "WebHome"));
// @formatter:on
@Before
public void setup() throws Exception
{
// Cleanup to avoid problems from previous runs.
for (DocumentReference pageReference : nestedDocuments) {
getUtil().rest().delete(pageReference);
}
}
@Test
public void createNestedDocumentsFromURL()
{
// Create and assert each nested document.
for (DocumentReference pageReference : nestedDocuments) {
// Navigate from URL to the page in view mode, using the no-WebHome URL, e.g. /A instead of /A/WebHome
SpaceReference spaceReference = pageReference.getLastSpaceReference();
ViewPage viewPage = getUtil().gotoPage(spaceReference);
// It should not exist and we will create it.
assertFalse(String.format("Document [%s] already exists", pageReference), viewPage.exists());
new DocumentDoesNotExistPage().clickEditThisPageToCreate();
new CreatePagePage().clickCreate();
EditPage editPage = new EditPage();
viewPage = editPage.clickSaveAndView();
// Check that we created the right page
assertCreatedNestedDocument(pageReference, viewPage);
}
}
@Test
public void createNestedDocumentsFromUI()
{
// Create the homepage if it does not exist and start the test from there.
DocumentReference homepage = new DocumentReference("xwiki", "Main", "WebHome");
ViewPage viewPage = getUtil().createPage(homepage, "", "Home Page");
// Create and assert each nested document.
for (DocumentReference pageReference : nestedDocuments) {
SpaceReference spaceReference = pageReference.getLastSpaceReference();
// Click the create button from the previous page.
CreatePagePage createPage = viewPage.createPage();
// Determine the values to fill in the form.
WikiReference wikiReference = spaceReference.getWikiReference();
EntityReference localParentSpaceReference = spaceReference.removeParent(wikiReference).getParent();
String spaceReferenceString = getUtil().serializeReference(localParentSpaceReference);
String pageName = spaceReference.getName();
// Fill in the form and submit it, using the space name as title.
EditPage editPage = createPage.createPage(pageName, spaceReferenceString, null, false);
// Save the page.
viewPage = editPage.clickSaveAndView();
// Check that we created the right page
assertCreatedNestedDocument(pageReference, viewPage);
}
}
private void assertCreatedNestedDocument(DocumentReference pageReference, ViewPage viewPage)
{
SpaceReference spaceReference = pageReference.getLastSpaceReference();
BreadcrumbElement breadcrumb = viewPage.getBreadcrumb();
if (breadcrumb.canBeExpanded()) {
breadcrumb.expand();
}
assertEquals("/" + getUtil().getURLFragment(spaceReference), breadcrumb.getPathAsString());
assertEquals(spaceReference.getName(), viewPage.getDocumentTitle());
assertEquals(getUtil().serializeReference(pageReference), viewPage.getMetaDataValue("reference"));
}
}