blob: 81d89439b86ed3a5cd480192882ea541b572ff5d [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.downloaddefaultbinary;
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.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.ValueFormatException;
import javax.jcr.Workspace;
import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.nodetype.PropertyDefinition;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.jcr.js.nodetypes.GenerationConstants;
import org.apache.sling.jcr.js.nodetypes.downloaddefaultbinary.DownloadDefaultBinaryValueServlet;
import org.apache.sling.jcr.js.nodetypes.mock.MockPropertyDefGenerator;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Tests the DownloadDefaultBinaryValueServlet
*
*/
public class DownloadDefaultBinaryValueTest {
// mock classes
private SlingHttpServletRequest request = null;
private SlingHttpServletResponse response = null;
private Resource resource = null;
private Node rootNode = null;
private Session session = null;
private Workspace workspace = null;
private NodeTypeManager ntManager = null;
private ByteArrayOutputStream outStream = null;
private ResourceResolver resourceResolver = null;
private MockPropertyDefGenerator propDefGenerator = null;
@Before
public void setUp() throws RepositoryException, IOException{
// create mocks
request = mock(SlingHttpServletRequest.class);
response = mock(SlingHttpServletResponse.class);
resourceResolver = mock(ResourceResolver.class);
resource = mock(Resource.class);
rootNode = mock(Node.class);
session = mock(Session.class);
workspace = mock(Workspace.class);
ntManager = mock(NodeTypeManager.class);
outStream = new ByteArrayOutputStream();
// stubbing
when(request.getMethod()).thenReturn(HttpConstants.METHOD_GET);
when(request.getResourceResolver()).thenReturn(resourceResolver);
when(resourceResolver.getResource("/")).thenReturn(resource);
when(resource.adaptTo(Node.class)).thenReturn(rootNode);
when(rootNode.getSession()).thenReturn(session);
when(session.getWorkspace()).thenReturn(workspace);
when(workspace.getNodeTypeManager()).thenReturn(ntManager);
when(response.getWriter()).thenReturn(new PrintWriter(outStream, true));
propDefGenerator = new MockPropertyDefGenerator();
}
private void invokeServletWithDifferentPropertyDefs() throws NoSuchNodeTypeException, RepositoryException,
ValueFormatException, ServletException, IOException {
NodeType nodeType = mock(NodeType.class);
when(ntManager.getNodeType("ns:ntName")).thenReturn(nodeType);
PropertyDefinition[] propDefs = propDefGenerator.getDifferentPropertyDefinitions();
when(nodeType.getPropertyDefinitions()).thenReturn(propDefs);
DownloadDefaultBinaryValueServlet downloadServlet = new DownloadDefaultBinaryValueServlet();
downloadServlet.service(request, response);
}
private void invokeServletWithEqualPropertyDefs() throws NoSuchNodeTypeException, RepositoryException,
ValueFormatException, ServletException, IOException {
NodeType nodeType = mock(NodeType.class);
when(ntManager.getNodeType("ns:ntName")).thenReturn(nodeType);
PropertyDefinition[] propDefs = propDefGenerator.getEqualPropertyDefinitions();
when(nodeType.getPropertyDefinitions()).thenReturn(propDefs);
DownloadDefaultBinaryValueServlet downloadServlet = new DownloadDefaultBinaryValueServlet();
downloadServlet.service(request, response);
}
@Test
public void testSuccessfulSingleMatchWithIndex() throws ServletException, IOException, NoSuchNodeTypeException, RepositoryException {
when(request.getRequestURI()).thenReturn("/ns:ntName/binPropDef/binary/true/true/true/true/version/1.default_binary_value.bin");
invokeServletWithDifferentPropertyDefs();
verify(response, never()).sendError(anyInt());
Assert.assertEquals(GenerationConstants.DEFAULT_VALUE_BINARY_1, new String(outStream.toByteArray()));
}
@Test
public void testSuccessfulSingleMatchWithoutIndex() throws ServletException, IOException, NoSuchNodeTypeException, RepositoryException {
when(request.getRequestURI()).thenReturn("/ns:ntName/binPropDef/binary/true/true/true/true/version/default_binary_value.bin");
invokeServletWithDifferentPropertyDefs();
verify(response, never()).sendError(anyInt());
Assert.assertEquals(GenerationConstants.DEFAULT_VALUE_BINARY_0, new String(outStream.toByteArray()));
}
@Test
public void testSuccessfulShortenedSingleMatchWithoutIndex() throws ServletException, IOException, NoSuchNodeTypeException, RepositoryException {
when(request.getRequestURI()).thenReturn("/ns:ntName/binPropDef/binary/true/true/true/false/default_binary_value.bin");
testDifferentPropertyDefsWithExpectedBinary0();
when(request.getRequestURI()).thenReturn("/ns:ntName/binPropDef/binary/true/true/false/default_binary_value.bin");
testDifferentPropertyDefsWithExpectedBinary0();
when(request.getRequestURI()).thenReturn("/ns:ntName/binPropDef/binary/true/false/default_binary_value.bin");
testDifferentPropertyDefsWithExpectedBinary0();
when(request.getRequestURI()).thenReturn("/ns:ntName/binPropDef/boolean/default_binary_value.bin");
testDifferentPropertyDefsWithExpectedBinary0();
when(request.getRequestURI()).thenReturn("/ns:ntName/binPropDef2/default_binary_value.bin");
testDifferentPropertyDefsWithExpectedBinary0();
}
private void testDifferentPropertyDefsWithExpectedBinary0() throws NoSuchNodeTypeException, RepositoryException,
ValueFormatException, ServletException, IOException {
invokeServletWithDifferentPropertyDefs();
verify(response, never()).sendError(anyInt());
Assert.assertEquals(GenerationConstants.DEFAULT_VALUE_BINARY_0, new String(outStream.toByteArray()));
}
@Test
public void testSuccessfulSingleMatchWithInvalidIndex() throws ServletException, IOException, NoSuchNodeTypeException, RepositoryException {
when(request.getRequestURI()).thenReturn("/ns:ntName/binPropDef/binary/true/true/true/true/version/5.default_binary_value.bin");
invokeServletWithDifferentPropertyDefs();
verify(response).sendError(HttpServletResponse.SC_NOT_FOUND);
}
@Test
public void testUnsuccessfulMultipleMatches() throws ServletException, IOException, NoSuchNodeTypeException, RepositoryException {
when(request.getRequestURI()).thenReturn("/ns:ntName/binPropDef/binary/true/true/true/true/version/5.default_binary_value.bin");
invokeServletWithEqualPropertyDefs();
verify(response).sendError(HttpServletResponse.SC_NOT_FOUND);
}
@Test
public void testUnsuccessfulNoMatches() throws ServletException, IOException, NoSuchNodeTypeException, RepositoryException {
when(request.getRequestURI()).thenReturn("/ns:ntName/binPropDef/binary/true/true/true/true/ignore/default_binary_value.bin");
invokeServletWithDifferentPropertyDefs();
verify(response).sendError(HttpServletResponse.SC_NOT_FOUND);
}
}