/*
* #%L
* ACS AEM Commons Bundle
* %%
* Copyright (C) 2013 Adobe
* %%
* Licensed 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.
* #L%
*/
package com.adobe.acs.commons.images.impl;
import com.adobe.acs.commons.images.ImageTransformer;
import com.adobe.acs.commons.images.NamedImageTransformer;
import com.day.image.Layer;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.wrappers.ValueMapDecorator;
import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class NamedTransformImageServletTest {
final String NAMED_TRANSFORM_FEATURE = "feature";
final String NAMED_TRANSFORM_SMALL = "small";
final String IMAGE_TRANSFORM_RESIZE = "resize";
final String IMAGE_TRANSFORM_GREYSCALE = "greyscale";
@Spy
private FeaturedNamedImageTransformer featureImageTransformer = new FeaturedNamedImageTransformer();
@Spy
private SmallNamedImageTransformer smallImageTransformer = new SmallNamedImageTransformer();
@Spy
private Map<String, NamedImageTransformer> namedImageTransformers = new HashMap<String, NamedImageTransformer>();
@Spy
private EmptyImageTransformer resizeImageTransformer = new EmptyImageTransformer();
@Spy
private EmptyImageTransformer greyscaleImageTransformer = new EmptyImageTransformer();
@Spy
private Map<String, ImageTransformer> imageTransformers = new HashMap<String, ImageTransformer>();
@InjectMocks
private NamedTransformImageServlet servlet;
private MockSlingHttpServletRequest mockRequest;
@Before
public void setUp() throws Exception {
servlet = new NamedTransformImageServlet();
imageTransformers.put(IMAGE_TRANSFORM_RESIZE, resizeImageTransformer);
imageTransformers.put(IMAGE_TRANSFORM_GREYSCALE, greyscaleImageTransformer);
namedImageTransformers.put(NAMED_TRANSFORM_FEATURE, featureImageTransformer);
namedImageTransformers.put(NAMED_TRANSFORM_SMALL, smallImageTransformer);
mockRequest = new MockSlingHttpServletRequest(
"/path",
"",
"transform",
NAMED_TRANSFORM_FEATURE + "/" + new Random().nextInt() + "/image.png",
"");
MockitoAnnotations.initMocks(this);
}
@Test
public void testAccepts() throws Exception {
final boolean result = servlet.accepts(mockRequest);
assertTrue(result);
}
@Test
public void testAccepts_invalidNamedTransform() throws Exception {
MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(
"/path",
"",
"transform",
"unknown/image.png",
"");
final boolean result = servlet.accepts(request);
assertFalse(result);
}
@Test
public void testAccepts_invalidLastSuffix() throws Exception {
MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(
"/path",
"",
"transform",
NAMED_TRANSFORM_FEATURE + "/" + new Random().nextInt() + "/foo",
"");
final boolean result = servlet.accepts(request);
assertFalse(result);
}
@Test
public void testAccepts_multipleTransforms() throws Exception {
MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(
"/path",
"",
"transform",
NAMED_TRANSFORM_FEATURE + "/" + NAMED_TRANSFORM_SMALL + "/image.png",
"");
final boolean result = servlet.accepts(request);
assertTrue(result);
}
@Test
public void test_getImageTransformersWithParams() {
List<NamedImageTransformer> selectedNamedImageTransformers = new ArrayList<NamedImageTransformer>();
selectedNamedImageTransformers.add(featureImageTransformer);
selectedNamedImageTransformers.add(smallImageTransformer);
final ValueMap imageTransformersWithParams = servlet.getImageTransformersWithParams(selectedNamedImageTransformers);
assertEquals(IMAGE_TRANSFORM_RESIZE, imageTransformersWithParams.keySet().toArray()[0]);
ValueMap resize = (ValueMap) imageTransformersWithParams.values().toArray()[0];
assertEquals("width", resize.keySet().toArray()[0]);
assertEquals("10", resize.values().toArray()[0]);
assertEquals(1, resize.keySet().size());
assertEquals(IMAGE_TRANSFORM_GREYSCALE, imageTransformersWithParams.keySet().toArray()[1]);
ValueMap greyscale = (ValueMap) imageTransformersWithParams.values().toArray()[1];
assertEquals("greyscale", greyscale.keySet().toArray()[0]);
assertEquals("true", greyscale.values().toArray()[0]);
}
@Test
public void test_multipleTransforms() throws Exception {
List<NamedImageTransformer> selectedNamedImageTransformers = new ArrayList<NamedImageTransformer>();
selectedNamedImageTransformers.add(featureImageTransformer);
selectedNamedImageTransformers.add(smallImageTransformer);
final ValueMap imageTransformersWithParams = servlet.getImageTransformersWithParams(selectedNamedImageTransformers);
servlet.transform(mock(Layer.class), imageTransformersWithParams);
org.mockito.Mockito.verify(resizeImageTransformer, times(1)).transform(any(Layer.class), any(ValueMap.class));
org.mockito.Mockito.verify(greyscaleImageTransformer, times(1)).transform(any(Layer.class), any(ValueMap.class));
}
@Test
public void test_getQuality() throws Exception {
ValueMap qualityTransforms = new ValueMapDecorator(new HashMap<String, Object>());
qualityTransforms.put("quality", 0);
assertEquals(0D, servlet.getQuality("image/jpg", qualityTransforms), 0);
qualityTransforms.put("quality", 100);
assertEquals(1D, servlet.getQuality("image/jpg", qualityTransforms), 0);
qualityTransforms.put("quality", 50);
assertEquals(0.5D, servlet.getQuality("image/jpg", qualityTransforms), 0);
qualityTransforms.put("quality", 101);
assertEquals(.82D, servlet.getQuality("image/jpg", qualityTransforms), 0);
qualityTransforms.put("quality", -1);
assertEquals(.82D, servlet.getQuality("image/jpg", qualityTransforms), 0);
/* Gifs */
qualityTransforms.put("quality", 0);
assertEquals(0D, servlet.getQuality("image/gif", qualityTransforms), 0);
qualityTransforms.put("quality", 100);
assertEquals(255D, servlet.getQuality("image/gif", qualityTransforms), 0);
qualityTransforms.put("quality", 50);
assertEquals(127.5D, servlet.getQuality("image/gif", qualityTransforms), 0);
qualityTransforms.put("quality", 101);
assertEquals(209.1D, servlet.getQuality("image/gif", qualityTransforms), 0);
qualityTransforms.put("quality", -1);
assertEquals(209.1D, servlet.getQuality("image/gif", qualityTransforms), 0);
}
@Test
public void test_isProgressiveJpeg() throws Exception {
ValueMap progressiveTransforms = new ValueMapDecorator(new HashMap<String, Object>());
// Disabled
progressiveTransforms.put("enabled", false);
assertFalse(servlet.isProgressiveJpeg("image/png", progressiveTransforms));
progressiveTransforms.put("enabled", false);
assertFalse(servlet.isProgressiveJpeg("image/jpg", progressiveTransforms));
progressiveTransforms.put("enabled", false);
assertFalse(servlet.isProgressiveJpeg("image/jpeg", progressiveTransforms));
// Enabled
progressiveTransforms.put("enabled", true);
assertFalse(servlet.isProgressiveJpeg("image/png", progressiveTransforms));
progressiveTransforms.put("enabled", true);
assertTrue(servlet.isProgressiveJpeg("image/jpg", progressiveTransforms));
progressiveTransforms.put("enabled", true);
assertTrue(servlet.isProgressiveJpeg("image/jpeg", progressiveTransforms));
// Invalid
progressiveTransforms.put("enabled", true);
assertFalse(servlet.isProgressiveJpeg(null, progressiveTransforms));
progressiveTransforms.put("enabled", true);
assertFalse(servlet.isProgressiveJpeg("", progressiveTransforms));
progressiveTransforms.remove("enabled");
assertFalse(servlet.isProgressiveJpeg("", progressiveTransforms));
}
/* Testing for resolveImage requires too much orchestration/mocking to be useful */
}