/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.jackrabbit.test.api;
import org.apache.jackrabbit.test.AbstractJCRTest;
import javax.jcr.RepositoryException;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.ItemExistsException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.Session;
/**
* <code>AddNodeTest</code> contains the test cases for the method
* <code>Node.addNode(String, String)</code>.
*
* @test
* @sources AddNodeTest.java
* @executeClass org.apache.jackrabbit.test.api.AddNodeTest
* @keywords level2
*/
public class AddNodeTest extends AbstractJCRTest {
/**
* Tests if the name of the created node is correct.
*/
public void testName() throws RepositoryException {
Node n1 = testRootNode.addNode(nodeName1, testNodeType);
testRootNode.save();
assertEquals("Wrong node name.", n1.getName(), nodeName1);
}
/**
* Tests if the node type of the created node is correct.
*/
public void testNodeType() throws RepositoryException {
Node n1 = testRootNode.addNode(nodeName1, testNodeType);
testRootNode.save();
String ntName = n1.getPrimaryNodeType().getName();
assertEquals("Wrong node NodeType name.", testNodeType, ntName);
}
/**
* Tests if same name siblings have equal names or if same name
* siblings are not supported a ItemExistsException is thrown.
*/
public void testSameNameSiblings() throws RepositoryException {
if (testRootNode.getDefinition().allowsSameNameSiblings()) {
Node n1 = testRootNode.addNode(nodeName1, testNodeType);
Node n2 = testRootNode.addNode(nodeName1, testNodeType);
testRootNode.save();
assertEquals("Names of same name siblings are not equal.",
n1.getName(), n2.getName());
} else {
testRootNode.addNode(nodeName1, testNodeType);
try {
testRootNode.addNode(nodeName1, testNodeType);
fail("Expected ItemExistsException.");
} catch (ItemExistsException e) {
// correct
}
}
}
/**
* Tests if addNode() throws a NoSuchNodeTypeException in case
* of an unknown node type.
*/
public void testUnknownNodeType() throws RepositoryException {
try {
testRootNode.addNode(nodeName1, testNodeType + "unknownSuffix");
fail("Expected NoSuchNodeTypeException.");
} catch (NoSuchNodeTypeException e) {
// correct.
}
}
/**
* Tests if the path of the created node is correct.
*/
public void testPath() throws RepositoryException {
Node n1 = testRootNode.addNode(nodeName1, testNodeType);
testRootNode.save();
String expected = testRootNode.getPath() + "/" + nodeName1;
assertEquals("Wrong path for created node.", expected, n1.getPath());
}
/**
* Tests if addNode() throws a PathNotFoundException in case
* intermediary nodes do not exist.
*/
public void testPathNotFound() throws RepositoryException {
try {
testRootNode.addNode(nodeName1 + "/" + nodeName1, testNodeType);
fail("Expected PathNotFoundException.");
} catch (PathNotFoundException e) {
// correct.
}
}
/**
* Tests if a ConstraintViolationException is thrown when one attempts
* to add a node at a path that references a property.
*/
public void testConstraintViolation() throws RepositoryException {
try {
Node rootNode = superuser.getRootNode();
String propPath = testPath + "/" + jcrPrimaryType;
rootNode.addNode(propPath + "/" + nodeName1, testNodeType);
fail("Expected ConstraintViolationException.");
} catch (ConstraintViolationException e) {
// correct.
}
}
/**
* Tests if a RepositoryException is thrown in case the path
* for the new node contains an index.
*/
public void testRepositoryException() {
try {
testRootNode.addNode(nodeName1 + "[1]");
fail("Expected RepositoryException.");
} catch (RepositoryException e) {
// correct.
}
try {
testRootNode.addNode(nodeName1 + "[1]", testNodeType);
fail("Expected RepositoryException.");
} catch (RepositoryException e) {
// correct.
}
}
/**
* Creates a new node using {@link Node#addNode(String,String)}, saves using
* {@link javax.jcr.Node#save()} on parent node. Uses a second session to
* verify if the node have been saved.
*/
public void testAddNodeParentSave() throws RepositoryException {
// get default workspace test root node using superuser session
Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath());
// add node
Node testNode = defaultRootNode.addNode(nodeName1, testNodeType);
// save new node
defaultRootNode.save();
// use a different session to verify if the node is there
Session session = helper.getReadOnlySession();
try {
session.getItem(testNode.getPath());
} finally {
session.logout();
}
}
/**
* Creates a new node using {@link Node#addNode(String, String)}, saves using
* {@link javax.jcr.Session#save()}. Uses a second session to verify if the
* node has been safed.
*/
public void testAddNodeSessionSave() throws RepositoryException {
// get default workspace test root node using superuser session
Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath());
// add node
Node testNode = defaultRootNode.addNode(nodeName1, testNodeType);
// save new node
superuser.save();
// use a different session to verify if the node is there
Session session = helper.getReadOnlySession();
try {
session.getItem(testNode.getPath());
} finally {
session.logout();
}
}
/**
* Creates a new node using {@link Node#addNode(String, String)}, then tries
* to call {@link javax.jcr.Node#save()} on the new node.
* <br/><br/>
* This should throw an {@link RepositoryException}.
*/
public void testAddNodeRepositoryExceptionSaveOnNewNode() throws RepositoryException {
// get default workspace test root node using superuser session
Node defaultRootNode = (Node) superuser.getItem(testRootNode.getPath());
// add a node
Node testNode = defaultRootNode.addNode(nodeName1, testNodeType);
try {
// try to call save on newly created node
testNode.save();
fail("Calling Node.save() on a newly created node should throw RepositoryException");
} catch (RepositoryException e) {
// ok, works as expected.
}
}
}