blob: bcb26c2e36c8d75ad360e66752fa5597abaa14d0 [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.jcr.js.nodetypes.mock;
import static org.apache.sling.jcr.js.nodetypes.GenerationConstants.NODETYPE_REQ_PRIMARY_TYPE_NAME1;
import static org.apache.sling.jcr.js.nodetypes.GenerationConstants.NODETYPE_REQ_PRIMARY_TYPE_NAME2;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URL;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Workspace;
import javax.jcr.nodetype.NodeDefinition;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.NodeTypeIterator;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.version.OnParentVersionAction;
import javax.servlet.ServletException;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.apache.sling.commons.json.JSONTokener;
import org.apache.sling.jcr.js.nodetypes.NodeTypesJSONServlet;
import org.apache.sling.jcr.js.nodetypes.test.JSONAssert;
/**
* Generates NodeType mocks that will be returned when the servlet calles
* NodeTypeManager.getAllNodeTypes(). It also mocks request, response, output
* stream and so on to simulate the environment the servlet needs at runtime.
*
*/
public class MockNodeTypeGenerator {
// mock classes
protected SlingHttpServletRequest request = null;
protected SlingHttpServletResponse response = null;
protected Resource resource = null;
protected Node currentNode = null;
protected Session session = null;
protected Workspace workspace = null;
protected NodeTypeManager ntManager = null;
protected NodeTypeIterator nodeTypeIterator = null;
protected ByteArrayOutputStream outStream = null;
private MockPropertyDefGenerator propertyGenerator = new MockPropertyDefGenerator();
public void setUp() throws RepositoryException, IOException {
// create mocks
request = mock(SlingHttpServletRequest.class);
response = mock(SlingHttpServletResponse.class);
resource = mock(Resource.class);
currentNode = mock(Node.class);
session = mock(Session.class);
workspace = mock(Workspace.class);
ntManager = mock(NodeTypeManager.class);
nodeTypeIterator = mock(NodeTypeIterator.class);
outStream = new ByteArrayOutputStream();
// stubbing
when(request.getResource()).thenReturn(resource);
when(request.getMethod()).thenReturn(HttpConstants.METHOD_GET);
when(response.getWriter()).thenReturn(new PrintWriter(outStream, true));
when(resource.adaptTo(Node.class)).thenReturn(currentNode);
when(currentNode.getSession()).thenReturn(session);
when(session.getWorkspace()).thenReturn(workspace);
when(workspace.getNodeTypeManager()).thenReturn(ntManager);
when(ntManager.getAllNodeTypes()).thenReturn(nodeTypeIterator);
}
public MockPropertyDefGenerator getPropertyGenerator() {
return this.propertyGenerator;
}
public NodeDefinition getSimpleChildNodeDef(String name) {
NodeDefinition childNodeDef1 = mock(NodeDefinition.class);
NodeType[] reqPrimaryTypes = { getSimpleNodeTypeWithName(NODETYPE_REQ_PRIMARY_TYPE_NAME1),
getSimpleNodeTypeWithName(NODETYPE_REQ_PRIMARY_TYPE_NAME2) };
when(childNodeDef1.getRequiredPrimaryTypes()).thenReturn(reqPrimaryTypes);
when(childNodeDef1.getName()).thenReturn(name);
when(childNodeDef1.getOnParentVersion()).thenReturn(OnParentVersionAction.COPY);
return childNodeDef1;
}
public NodeDefinition getCompleteChildNodeDef(String name) {
NodeDefinition childNodeDef1 = mock(NodeDefinition.class);
NodeType requiredPrimaryType1 = getSimpleNodeTypeWithName(NODETYPE_REQ_PRIMARY_TYPE_NAME1);
NodeType requiredPrimaryType2 = getSimpleNodeTypeWithName(NODETYPE_REQ_PRIMARY_TYPE_NAME2);
NodeType[] reqPrimaryTypes = { requiredPrimaryType1, requiredPrimaryType2 };
when(childNodeDef1.getRequiredPrimaryTypes()).thenReturn(reqPrimaryTypes);
when(childNodeDef1.getName()).thenReturn(name);
when(childNodeDef1.getOnParentVersion()).thenReturn(OnParentVersionAction.VERSION);
when(childNodeDef1.getDefaultPrimaryType()).thenReturn(requiredPrimaryType1);
when(childNodeDef1.allowsSameNameSiblings()).thenReturn(Boolean.TRUE);
when(childNodeDef1.isAutoCreated()).thenReturn(Boolean.TRUE);
when(childNodeDef1.isMandatory()).thenReturn(Boolean.TRUE);
when(childNodeDef1.isProtected()).thenReturn(Boolean.TRUE);
return childNodeDef1;
}
public void assertEqualsWithServletResult(String filename) throws JSONException, ServletException,
IOException {
NodeTypesJSONServlet generationServlet = new NodeTypesJSONServlet();
generationServlet.service(request, response);
verify(response, never()).sendError(anyInt());
String resultingJSON = new String(outStream.toByteArray(), "utf-8");
String expectedNTJSON = getExpectedNTJSON(filename);
JSONObject actualJsonObjectFromServlet = new JSONObject(new JSONTokener(resultingJSON));
JSONAssert.assertEquals("Actual JSON: " + resultingJSON + "\nExpected JSON: " + expectedNTJSON, new JSONObject(
new JSONTokener(expectedNTJSON)), actualJsonObjectFromServlet);
}
protected String getExpectedNTJSON(String filename) throws IOException {
URL fileUri = MockNodeTypeGenerator.class.getResource("/expectedNTJSON/"+filename+".json");
BufferedReader in = new BufferedReader(new FileReader(fileUri.getFile()));
String currentLine = null;
StringBuilder fileContent = new StringBuilder();
while ((currentLine = in.readLine()) != null) {
fileContent.append(currentLine);
}
return fileContent.toString();
}
public NodeType getSimpleNodeTypeWithName(String nodeTypeName) {
NodeType nt1 = mock(NodeType.class);
NodeType supertype = mock(NodeType.class);
when(supertype.getName()).thenReturn("nt:base");
NodeType[] supertypes = { supertype };
when(nt1.getDeclaredSupertypes()).thenReturn(supertypes);
when(nt1.getName()).thenReturn(nodeTypeName);
return nt1;
}
}