/* * 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.sling.launchpad.webapp.integrationtest.servlets.post; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletResponse; import org.apache.commons.httpclient.NameValuePair; import org.apache.sling.commons.testing.integration.HttpTestBase; import org.apache.sling.servlets.post.SlingPostConstants; /** Test node creation via the PostServlet and versionable nodes */ public class PostServletVersionableTest extends HttpTestBase { public static final String TEST_BASE_PATH = "/sling-tests"; private String postUrl; private Map<String,String> params; @Override protected void setUp() throws Exception { super.setUp(); postUrl = HTTP_BASE_URL + TEST_BASE_PATH + "/" + System.currentTimeMillis(); params = new HashMap<String,String>(); params.put("jcr:mixinTypes", "mix:versionable"); } public void testPostPathIsUnique() throws IOException { assertHttpStatus(postUrl, HttpServletResponse.SC_NOT_FOUND, "Path must not exist before test: " + postUrl); } public void testCreatedNodeIsCheckedOut() throws IOException { final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); final String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked out.", content.contains("jcr:isCheckedOut: true")); } public void testAddingVersionableMixInChecksOut() throws IOException { final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, null); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertFalse("Node (" + location + ") isn't versionable.", content.contains("jcr:isCheckedOut")); testClient.createNode(location, params); content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked out.", content.contains("jcr:isCheckedOut: true")); } public void testCreatedNodeIsCheckedInIfRequested() throws IOException { params.put(":checkinNewVersionableNodes", "true"); final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); final String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); } public void testAddingVersionableMixInChecksInIfRequested() throws IOException { final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, null); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertFalse("Node (" + location + ") isn't versionable.", content.contains("jcr:isCheckedOut")); params.put(":checkinNewVersionableNodes", "true"); testClient.createNode(location, params); content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); } public void testModifyingACheckedOutNodeDoesntCheckItIn() throws IOException { final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked out.", content.contains("jcr:isCheckedOut: true")); params.clear(); params.put("name", "value"); testClient.createNode(location, params); content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node property should have been set.", content.contains("name: value")); assertTrue("Node (" + location + ") should (still) be checked out.", content.contains("jcr:isCheckedOut: true")); } public void testModifyingACheckedInNodeFailsWithoutAutoCheckout() throws IOException { params.put(":checkinNewVersionableNodes", "true"); final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); List<NameValuePair> testParams = Arrays.asList(new NameValuePair(":autoCheckout", "false"), new NameValuePair("name", "value")); assertPostStatus(location, 500, testParams, "Attempted modification with :autoCheckout=false should fail."); } public void testModifiedNodeIsCheckedInAfterModification() throws IOException { params.put(":checkinNewVersionableNodes", "true"); final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); params.clear(); params.put(":autoCheckout", "true"); params.put("name", "value"); testClient.createNode(location, params); content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node property should have been set.", content.contains("name: value")); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); } public void testModifiedNodeIsCheckedOutIfRequested() throws IOException { params.put(":checkinNewVersionableNodes", "true"); final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); params.clear(); params.put(":autoCheckout", "true"); params.put("name", "value"); params.put(":autoCheckin", "false"); testClient.createNode(location, params); content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node property should have been set.", content.contains("name: value")); assertTrue("Node (" + location + ") should be checked out.", content.contains("jcr:isCheckedOut: true")); } public void testCheckingInACheckOutNode() throws IOException { final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked out.", content.contains("jcr:isCheckedOut: true")); params.clear(); params.put(":operation", "checkin"); testClient.createNode(location, params); content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); } public void testRestoreVersion() throws IOException { final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); testClient.createNode(location, Collections.singletonMap("key", "valueForVersion1.0")); testClient.createNode(location, Collections.singletonMap(":operation", "checkin")); testClient.createNode(location, Collections.singletonMap(":operation", "checkout")); testClient.createNode(location, Collections.singletonMap("key", "valueForVersion1.1")); testClient.createNode(location, Collections.singletonMap(":operation", "checkin")); assertTrue(getContent(location + ".txt", CONTENT_TYPE_PLAIN).contains("key: valueForVersion1.1")); params.clear(); params.put(":operation", "restore"); params.put(":version", "1.0"); testClient.createNode(location, params); assertTrue(getContent(location + ".txt", CONTENT_TYPE_PLAIN).contains("key: valueForVersion1.0")); params.clear(); params.put(":operation", "restore"); params.put(":version", "1.1"); testClient.createNode(location, params); assertTrue(getContent(location + ".txt", CONTENT_TYPE_PLAIN).contains("key: valueForVersion1.1")); } public void testCheckingOutACheckedInNode() throws IOException { params.put(":checkinNewVersionableNodes", "true"); final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); params.clear(); params.put(":operation", "checkout"); testClient.createNode(location, params); content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: true")); } public void testCheckingOutAnAlreadyCheckedOutNodeIsANoOp() throws IOException { final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked out.", content.contains("jcr:isCheckedOut: true")); params.clear(); params.put(":operation", "checkout"); testClient.createNode(location, params); content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked out.", content.contains("jcr:isCheckedOut: true")); } public void testCheckingInAnAlreadyCheckedInNodeIsANoOp() throws IOException { params.put(":checkinNewVersionableNodes", "true"); final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); params.clear(); params.put(":operation", "checkin"); testClient.createNode(location, params); content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); } public void testDeletingChildNodeOfACheckedInNode() throws IOException { params.put(":checkinNewVersionableNodes", "true"); params.put("child/testprop", "testvalue"); final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); assertFalse("Node (" + location + ") shouldn't have a test property.", content.contains("testprop: testvalue")); content = getContent(location + "/child.txt", CONTENT_TYPE_PLAIN); assertFalse("Node (" + location + "/child) shouldn't be versionable be checked in.", content.contains("jcr:isCheckedOut: false")); assertTrue("Node (" + location + "/child) has a test property. ", content.contains("testprop: testvalue")); params.clear(); params.put(":autoCheckout", "true"); params.put("child@Delete", ""); testClient.createNode(location, params); content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); assertHttpStatus(location + "/child.txt", 404); } public void testDeletingChildNodeOfACheckedInNodeByOp() throws IOException { params.put(":checkinNewVersionableNodes", "true"); params.put("child/testprop", "testvalue"); final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); assertFalse("Node (" + location + ") shouldn't have a test property.", content.contains("testprop: testvalue")); content = getContent(location + "/child.txt", CONTENT_TYPE_PLAIN); assertFalse("Node (" + location + "/child) shouldn't be versionable be checked in.", content.contains("jcr:isCheckedOut: false")); assertTrue("Node (" + location + "/child) has a test property. ", content.contains("testprop: testvalue")); params.clear(); params.put(":autoCheckout", "true"); params.put(SlingPostConstants.RP_OPERATION, SlingPostConstants.OPERATION_DELETE); testClient.createNode(location+"/child", params); content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); assertHttpStatus(location + "/child.txt", 404); } public void testDeletingAPropertyOfACheckedInNode() throws IOException { params.put(":checkinNewVersionableNodes", "true"); params.put("testprop", "testvalue"); final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); assertTrue("Node (" + location + ") has a test property.", content.contains("testprop: testvalue")); params.clear(); params.put(":autoCheckout", "true"); params.put("testprop@Delete", ""); testClient.createNode(location, params); content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); assertFalse("Node (" + location + ") shouldn't have a test property.", content.contains("testprop: testvalue")); } public void testDeletingAPropertyOfACheckedInNodeFailsWithoutAutoCheckout() throws IOException { params.put(":checkinNewVersionableNodes", "true"); params.put("testprop", "testvalue"); final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, params); assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK, "POST must redirect to created resource (" + location + ")"); assertTrue("Node (" + location + ") must have generated name", !location.endsWith("/*")); assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl + ")", location.contains(postUrl + "/")); String content = getContent(location + ".txt", CONTENT_TYPE_PLAIN); assertTrue("Node (" + location + ") should be checked in.", content.contains("jcr:isCheckedOut: false")); assertTrue("Node (" + location + ") has a test property.", content.contains("testprop: testvalue")); List<NameValuePair> testParams = Arrays.asList(new NameValuePair(":autoCheckout", "false"), new NameValuePair("testprop@Delete", "")); assertPostStatus(location, 500, testParams, "Attempted modification with :autoCheckout=false should fail."); } public void testMovingAPropertyOfACheckedInNodeToANewVersionableNode() throws IOException { params.put(":checkinNewVersionableNodes", "true"); params.put("text", "Hello"); final String testPath = TEST_BASE_PATH + "/abs/" + System.currentTimeMillis(); testClient.createNode(HTTP_BASE_URL + testPath + "/src", params); // assert content at source location String oldContent = getContent(HTTP_BASE_URL + testPath + "/src.json", CONTENT_TYPE_JSON); assertJavascript("Hello", oldContent, "out.println(data.text)"); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); // create dest with text set from src/text params.clear(); params.put(":autoCheckout", "true"); params.put("jcr:mixinTypes", "mix:versionable"); params.put(":checkinNewVersionableNodes", "true"); params.put("text@MoveFrom", testPath + "/src/text"); testClient.createNode(HTTP_BASE_URL + testPath + "/dest", params); // assert content at new location String content = getContent(HTTP_BASE_URL + testPath + "/dest.json", CONTENT_TYPE_JSON); assertJavascript("Hello", content, "out.println(data.text)"); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); // assert no content at old location oldContent = getContent(HTTP_BASE_URL + testPath + "/src.json", CONTENT_TYPE_JSON); assertJavascript("undefined", oldContent, "out.println(typeof(data.text))"); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); } public void testMovingAPropertyOfACheckedInNodeToACheckedInNode() throws IOException { params.put(":checkinNewVersionableNodes", "true"); params.put("text", "Hello"); final String testPath = TEST_BASE_PATH + "/abs/" + System.currentTimeMillis(); testClient.createNode(HTTP_BASE_URL + testPath + "/src", params); // assert content at source location String oldContent = getContent(HTTP_BASE_URL + testPath + "/src.json", CONTENT_TYPE_JSON); assertJavascript("Hello", oldContent, "out.println(data.text)"); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); // create dest params.clear(); params.put("jcr:mixinTypes", "mix:versionable"); params.put(":checkinNewVersionableNodes", "true"); testClient.createNode(HTTP_BASE_URL + testPath + "/dest", params); // assert content at new location String content = getContent(HTTP_BASE_URL + testPath + "/dest.json", CONTENT_TYPE_JSON); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); params.clear(); params.put(":autoCheckout", "true"); params.put("text@MoveFrom", testPath + "/src/text"); testClient.createNode(HTTP_BASE_URL + testPath + "/dest", params); // assert content at new location content = getContent(HTTP_BASE_URL + testPath + "/dest.json", CONTENT_TYPE_JSON); assertJavascript("Hello", content, "out.println(data.text)"); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); // assert no content at old location oldContent = getContent(HTTP_BASE_URL + testPath + "/src.json", CONTENT_TYPE_JSON); assertJavascript("undefined", oldContent, "out.println(typeof(data.text))"); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); } public void testCopyingAPropertyToACheckedInNode() throws IOException { params.put(":checkinNewVersionableNodes", "true"); params.put("text", "Hello"); final String testPath = TEST_BASE_PATH + "/abs/" + System.currentTimeMillis(); testClient.createNode(HTTP_BASE_URL + testPath + "/src", params); // assert content at source location String oldContent = getContent(HTTP_BASE_URL + testPath + "/src.json", CONTENT_TYPE_JSON); assertJavascript("Hello", oldContent, "out.println(data.text)"); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); // create dest as empty params.put("jcr:mixinTypes", "mix:versionable"); params.put(":checkinNewVersionableNodes", "true"); testClient.createNode(HTTP_BASE_URL + testPath + "/dest", params); String content = getContent(HTTP_BASE_URL + testPath + "/dest.json", CONTENT_TYPE_JSON); assertJavascript("false", content, "out.println(data['jcr:isCheckedOut'])"); // copy text from src/text params.clear(); params.put(":autoCheckout", "true"); params.put("text@CopyFrom", testPath + "/src/text"); testClient.createNode(HTTP_BASE_URL + testPath + "/dest", params); // assert content at new location content = getContent(HTTP_BASE_URL + testPath + "/dest.json", CONTENT_TYPE_JSON); assertJavascript("Hello", content, "out.println(data.text)"); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); // assert content at source location oldContent = getContent(HTTP_BASE_URL + testPath + "/src.json", CONTENT_TYPE_JSON); assertJavascript("Hello", oldContent, "out.println(data.text)"); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); } public void testMovingAChildNodeOfACheckedInNodeToANewVersionableNode() throws IOException { params.put(":checkinNewVersionableNodes", "true"); final String testPath = TEST_BASE_PATH + "/abs/" + System.currentTimeMillis(); testClient.createNode(HTTP_BASE_URL + testPath + "/src", params); params.clear(); params.put(":autoCheckout", "true"); params.put("text", "Hello"); testClient.createNode(HTTP_BASE_URL + testPath + "/src/child", params); // assert content at source location String oldContent = getContent(HTTP_BASE_URL + testPath + "/src.-1.json", CONTENT_TYPE_JSON); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); assertJavascript("Hello", oldContent, "out.println(data.child.text)"); // create dest with child from src params.clear(); params.put(":autoCheckout", "true"); params.put("jcr:mixinTypes", "mix:versionable"); params.put(":checkinNewVersionableNodes", "true"); params.put("src@MoveFrom", testPath + "/src/child"); testClient.createNode(HTTP_BASE_URL + testPath + "/dest", params); // assert content at new location String content = getContent(HTTP_BASE_URL + testPath + "/dest.-1.json", CONTENT_TYPE_JSON); assertJavascript("Hello", content, "out.println(data.src.text)"); assertJavascript("false", content, "out.println(data['jcr:isCheckedOut'])"); // assert no content at old location assertHttpStatus(HTTP_BASE_URL + testPath + "/src/child.json", HttpServletResponse.SC_NOT_FOUND, "Expected Not_Found for old content"); oldContent = getContent(HTTP_BASE_URL + testPath + "/src.-1.json", CONTENT_TYPE_JSON); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); } public void testMovingAChildNodeOfACheckedInNodeToACheckedInNode() throws IOException { params.put(":checkinNewVersionableNodes", "true"); final String testPath = TEST_BASE_PATH + "/abs/" + System.currentTimeMillis(); testClient.createNode(HTTP_BASE_URL + testPath + "/src", params); params.clear(); params.put(":autoCheckout", "true"); params.put("text", "Hello"); testClient.createNode(HTTP_BASE_URL + testPath + "/src/child", params); // assert content at source location String oldContent = getContent(HTTP_BASE_URL + testPath + "/src.-1.json", CONTENT_TYPE_JSON); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); assertJavascript("Hello", oldContent, "out.println(data.child.text)"); // create dest params.clear(); params.put("jcr:mixinTypes", "mix:versionable"); params.put(":checkinNewVersionableNodes", "true"); testClient.createNode(HTTP_BASE_URL + testPath + "/dest", params); String content = getContent(HTTP_BASE_URL + testPath + "/dest.json", CONTENT_TYPE_JSON); assertJavascript("false", content, "out.println(data['jcr:isCheckedOut'])"); // move src child params.clear(); params.put(":autoCheckout", "true"); params.put("src@MoveFrom", testPath + "/src/child"); testClient.createNode(HTTP_BASE_URL + testPath + "/dest", params); // assert content at new location content = getContent(HTTP_BASE_URL + testPath + "/dest.-1.json", CONTENT_TYPE_JSON); assertJavascript("Hello", content, "out.println(data.src.text)"); assertJavascript("false", content, "out.println(data['jcr:isCheckedOut'])"); // assert no content at old location assertHttpStatus(HTTP_BASE_URL + testPath + "/src/child.json", HttpServletResponse.SC_NOT_FOUND, "Expected Not_Found for old content"); oldContent = getContent(HTTP_BASE_URL + testPath + "/src.-1.json", CONTENT_TYPE_JSON); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); } public void testCopyingANodeToACheckedInNode() throws IOException { params.put(":checkinNewVersionableNodes", "true"); final String testPath = TEST_BASE_PATH + "/abs/" + System.currentTimeMillis(); testClient.createNode(HTTP_BASE_URL + testPath + "/src", params); params.clear(); params.put(":autoCheckout", "true"); params.put("text", "Hello"); testClient.createNode(HTTP_BASE_URL + testPath + "/src/child", params); // assert content at source location String oldContent = getContent(HTTP_BASE_URL + testPath + "/src.-1.json", CONTENT_TYPE_JSON); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); assertJavascript("Hello", oldContent, "out.println(data.child.text)"); // create dest as empty params.put("jcr:mixinTypes", "mix:versionable"); params.put(":checkinNewVersionableNodes", "true"); testClient.createNode(HTTP_BASE_URL + testPath + "/dest", params); String content = getContent(HTTP_BASE_URL + testPath + "/dest.json", CONTENT_TYPE_JSON); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); // copy text from src/text params.clear(); params.put(":autoCheckout", "true"); params.put("src@CopyFrom", testPath + "/src/child"); testClient.createNode(HTTP_BASE_URL + testPath + "/dest", params); // assert content at new location content = getContent(HTTP_BASE_URL + testPath + "/dest.-1.json", CONTENT_TYPE_JSON); assertJavascript("Hello", content, "out.println(data.src.text)"); assertJavascript("false", content, "out.println(data['jcr:isCheckedOut'])"); // assert content at source location oldContent = getContent(HTTP_BASE_URL + testPath + "/src.-1.json", CONTENT_TYPE_JSON); assertJavascript("Hello", oldContent, "out.println(data.child.text)"); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); } public void testMovingAChildNodeOfACheckedInNodeToACheckedInNodeByOp() throws IOException { params.put(":checkinNewVersionableNodes", "true"); final String testPath = TEST_BASE_PATH + "/abs/" + System.currentTimeMillis(); testClient.createNode(HTTP_BASE_URL + testPath + "/src", params); params.clear(); params.put(":autoCheckout", "true"); params.put("text", "Hello"); testClient.createNode(HTTP_BASE_URL + testPath + "/src/child", params); // assert content at source location String oldContent = getContent(HTTP_BASE_URL + testPath + "/src.-1.json", CONTENT_TYPE_JSON); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); assertJavascript("Hello", oldContent, "out.println(data.child.text)"); // create dest params.clear(); params.put("jcr:mixinTypes", "mix:versionable"); params.put(":checkinNewVersionableNodes", "true"); testClient.createNode(HTTP_BASE_URL + testPath + "/dest", params); String content = getContent(HTTP_BASE_URL + testPath + "/dest.json", CONTENT_TYPE_JSON); assertJavascript("false", content, "out.println(data['jcr:isCheckedOut'])"); // move src child params.clear(); params.put(":autoCheckout", "true"); params.put(SlingPostConstants.RP_OPERATION, SlingPostConstants.OPERATION_MOVE); params.put(":dest", testPath + "/dest/src"); testClient.createNode(HTTP_BASE_URL + testPath + "/src/child", params); // assert content at new location content = getContent(HTTP_BASE_URL + testPath + "/dest.-1.json", CONTENT_TYPE_JSON); assertJavascript("Hello", content, "out.println(data.src.text)"); assertJavascript("false", content, "out.println(data['jcr:isCheckedOut'])"); // assert no content at old location assertHttpStatus(HTTP_BASE_URL + testPath + "/src/child.json", HttpServletResponse.SC_NOT_FOUND, "Expected Not_Found for old content"); oldContent = getContent(HTTP_BASE_URL + testPath + "/src.-1.json", CONTENT_TYPE_JSON); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); } public void testCopyingANodeToACheckedInNodeByOp() throws IOException { params.put(":checkinNewVersionableNodes", "true"); final String testPath = TEST_BASE_PATH + "/abs/" + System.currentTimeMillis(); testClient.createNode(HTTP_BASE_URL + testPath + "/src", params); params.clear(); params.put(":autoCheckout", "true"); params.put("text", "Hello"); testClient.createNode(HTTP_BASE_URL + testPath + "/src/child", params); // assert content at source location String oldContent = getContent(HTTP_BASE_URL + testPath + "/src.-1.json", CONTENT_TYPE_JSON); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); assertJavascript("Hello", oldContent, "out.println(data.child.text)"); // create dest as empty params.put("jcr:mixinTypes", "mix:versionable"); params.put(":checkinNewVersionableNodes", "true"); testClient.createNode(HTTP_BASE_URL + testPath + "/dest", params); String content = getContent(HTTP_BASE_URL + testPath + "/dest.json", CONTENT_TYPE_JSON); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); // copy child from src params.clear(); params.put(":autoCheckout", "true"); params.put(SlingPostConstants.RP_OPERATION, SlingPostConstants.OPERATION_COPY); params.put(":dest", testPath + "/dest/src"); testClient.createNode(HTTP_BASE_URL + testPath + "/src/child", params); // assert content at new location content = getContent(HTTP_BASE_URL + testPath + "/dest.-1.json", CONTENT_TYPE_JSON); assertJavascript("Hello", content, "out.println(data.src.text)"); assertJavascript("false", content, "out.println(data['jcr:isCheckedOut'])"); // assert content at source location oldContent = getContent(HTTP_BASE_URL + testPath + "/src.-1.json", CONTENT_TYPE_JSON); assertJavascript("Hello", oldContent, "out.println(data.child.text)"); assertJavascript("false", oldContent, "out.println(data['jcr:isCheckedOut'])"); } }