blob: e875619fe380147c693a5656b3d991cf65a8f64c [file] [log] [blame]
/*
* 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.HashMap;
import java.util.Map;
import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.apache.sling.commons.testing.integration.HttpTestBase;
/** Test the order option for node creation via the MicrojaxPostServlet */
public class PostServletOrderTest extends HttpTestBase {
public static final String TEST_BASE_PATH = "/sling-tests-order";
private static final String[] DEFAULT_ORDER = new String[]{"a","b","c","d"};
/*
does not work (yet) since rhino does not preserve order of
object elements.
private static final String TEST_SCRIPT =
"var s=''; " +
"for (var a in data) {" +
" var n = data[a];" +
" if (typeof(n) == 'object') s += a + ',';" +
"}" +
"out.println(s);";
*/
/**
* Create nodes and check if they are in default order
*/
public void testStandardOrder() throws IOException {
final String postUrl = HTTP_BASE_URL + TEST_BASE_PATH + "/" + System.currentTimeMillis();
createNodes(postUrl, DEFAULT_ORDER);
verifyOrder(postUrl, DEFAULT_ORDER);
}
/**
* Create nodes and check if they are in correct order after a
* :order="first" request
*/
public void testOrderFirst() throws IOException {
final String postUrl = HTTP_BASE_URL + TEST_BASE_PATH + "/" + System.currentTimeMillis();
createNodes(postUrl, DEFAULT_ORDER);
final Map <String, String> props = new HashMap <String, String> ();
props.put(":order","first");
testClient.createNode(postUrl + "/c", props);
verifyOrder(postUrl, new String[]{"c", "a", "b", "d"});
}
/**
* Create nodes and check if they are in correct order after a
* :order="last" request
*/
public void testOrderLast() throws IOException {
final String postUrl = HTTP_BASE_URL + TEST_BASE_PATH + "/" + System.currentTimeMillis();
createNodes(postUrl, DEFAULT_ORDER);
final Map <String, String> props = new HashMap <String, String> ();
props.put(":order","last");
testClient.createNode(postUrl + "/c", props);
verifyOrder(postUrl, new String[]{"a", "b", "d", "c"});
}
/**
* Create nodes and check if they are in correct order after a
* :order="before" request
*/
public void testOrderBefore() throws IOException {
final String postUrl = HTTP_BASE_URL + TEST_BASE_PATH + "/" + System.currentTimeMillis();
createNodes(postUrl, DEFAULT_ORDER);
final Map <String, String> props = new HashMap <String, String> ();
props.put(":order","before b");
testClient.createNode(postUrl + "/c", props);
verifyOrder(postUrl, new String[]{"a", "c", "b", "d"});
}
/**
* Create nodes and check if they are in correct order after a
* :order="after" request
*/
public void testOrderAfter() throws IOException {
final String postUrl = HTTP_BASE_URL + TEST_BASE_PATH + "/" + System.currentTimeMillis();
createNodes(postUrl, DEFAULT_ORDER);
final Map <String, String> props = new HashMap <String, String> ();
props.put(":order","after c");
testClient.createNode(postUrl + "/b", props);
verifyOrder(postUrl, new String[]{"a", "c", "b", "d"});
}
/**
* Create nodes and check if they are in correct order after a
* :order="N" request, where new position is greater than old one.
*/
public void testOrderIntToBack() throws IOException {
final String postUrl = HTTP_BASE_URL + TEST_BASE_PATH + "/" + System.currentTimeMillis();
createNodes(postUrl, DEFAULT_ORDER);
final Map <String, String> props = new HashMap <String, String> ();
props.put(":order","2");
testClient.createNode(postUrl + "/a", props);
verifyOrder(postUrl, new String[]{"b", "c", "a", "d"});
}
/**
* Create nodes and check if they are in correct order after a
* :order="N" request, where new position is less than old one.
*/
public void testOrderIntToFront() throws IOException {
final String postUrl = HTTP_BASE_URL + TEST_BASE_PATH + "/" + System.currentTimeMillis();
createNodes(postUrl, DEFAULT_ORDER);
final Map <String, String> props = new HashMap <String, String> ();
props.put(":order","1");
testClient.createNode(postUrl + "/d", props);
verifyOrder(postUrl, new String[]{"a", "d", "b", "c"});
}
/**
* Create nodes and check if they are in correct order after a
* :order="0" request
*/
public void testOrderIntZero() throws IOException {
final String postUrl = HTTP_BASE_URL + TEST_BASE_PATH + "/" + System.currentTimeMillis();
createNodes(postUrl, DEFAULT_ORDER);
final Map <String, String> props = new HashMap <String, String> ();
props.put(":order","0");
testClient.createNode(postUrl + "/d", props);
verifyOrder(postUrl, new String[]{"d", "a", "b", "c"});
}
/**
* Create nodes and check if they are in correct order after a
* :order="N" request, where new position is out of bounds
*/
public void testOrderIntOOB() throws IOException {
final String postUrl = HTTP_BASE_URL + TEST_BASE_PATH + "/" + System.currentTimeMillis();
createNodes(postUrl, DEFAULT_ORDER);
final Map <String, String> props = new HashMap <String, String> ();
props.put(":order","100");
testClient.createNode(postUrl + "/a", props);
verifyOrder(postUrl, new String[]{"b", "c", "d", "a"});
}
/**
* Create test nodes
*/
private String[] createNodes(String parentUrl, String[] names)
throws IOException {
String[] urls = new String[names.length];
for (int i=0; i<names.length; i++) {
urls[i] = testClient.createNode(parentUrl + "/" + names[i], null);
}
return urls;
}
/**
* Verify node order
*/
private void verifyOrder(String parentUrl, String[] names)
throws IOException {
// check that nodes appear in creation order in their parent's list of children
final String content = getContent(parentUrl + ".1.json", CONTENT_TYPE_JSON);
String expected = "";
for (String n: names) {
expected +=n + ",";
}
//assertJavascript(expected, content, TEST_SCRIPT);
try {
String actual = "";
JSONObject obj = new JSONObject(content);
JSONArray n = obj.names();
for (int i=0; i<n.length(); i++) {
String name = n.getString(i);
Object o = obj.get(name);
if (o instanceof JSONObject) {
actual += name + ",";
}
}
assertEquals(expected, actual);
} catch (JSONException e) {
throw new IOException(e.toString());
}
}
}