package org.apache.sling.webresource.impl;
import static org.junit.Assert.*;
import static org.easymock.EasyMock.*;
import java.util.Calendar;
import org.apache.sling.webresource.WebResourceScriptCompiler;
import org.apache.sling.webresource.model.WebResourceGroup;
import org.junit.Before;
import org.junit.Test;
import javax.jcr.Node;
import javax.jcr.Property;
public class WebResourceScriptCacheImplTest {
private WebResourceScriptCacheImpl webResourceScriptCache;
// Mocks
private Node mockNode;
private WebResourceScriptCompiler mockScriptCompiler;
@Before
public void setUp() throws Exception {
webResourceScriptCache = new WebResourceScriptCacheImpl();
mockNode = createMock(Node.class);
mockScriptCompiler = createMock(WebResourceScriptCompiler.class);
}
@Test
public void testGetCachedCompiledScriptPathGroupCachePath()
throws Exception {
WebResourceGroup webResrouceGroup = new WebResourceGroup();
webResrouceGroup.setCachePath("/test/cache/path");
webResrouceGroup.setGroupPath("/test/group/path");
webResrouceGroup.setName("testGroup");
expect(mockScriptCompiler.compiledScriptExtension()).andReturn("js");
expect(mockNode.getName()).andReturn("test.coffee");
expect(mockNode.getPath()).andReturn("/test/group/path/test.coffee");
replay(mockNode);
replay(mockScriptCompiler);
String result = webResourceScriptCache.getCachedCompiledScriptPath(
mockNode, webResrouceGroup, mockScriptCompiler);
assertEquals("Cache Path should be overriden",
"/test/cache/path/test.js", result);
verify(mockNode);
verify(mockScriptCompiler);
}
@Test
public void testGetCachedCompiledScriptPathGroupNoOverride()
throws Exception {
WebResourceGroup webResrouceGroup = new WebResourceGroup();
webResrouceGroup.setGroupPath("/test/group/path");
webResrouceGroup.setName("testGroup");
expect(mockScriptCompiler.compiledScriptExtension()).andReturn("js");
expect(mockNode.getName()).andReturn("test.coffee");
expect(mockNode.getPath()).andReturn("/test/group/path/test.coffee");
replay(mockNode);
replay(mockScriptCompiler);
String result = webResourceScriptCache.getCachedCompiledScriptPath(
mockNode, webResrouceGroup, mockScriptCompiler);
assertEquals("Cache Path should be group default",
"/var/webresource/groups/test.js", result);
verify(mockNode);
verify(mockScriptCompiler);
}
@Test
public void testGetCachedCompiledScriptPathPathBased() throws Exception {
expect(mockScriptCompiler.compiledScriptExtension()).andReturn("js");
expect(mockNode.getName()).andReturn("test.coffee");
expect(mockNode.getPath()).andReturn("/test/path/test.coffee");
expect(mockScriptCompiler.getCacheRoot()).andReturn("/compile/cache");
replay(mockNode);
replay(mockScriptCompiler);
String result = webResourceScriptCache.getCachedCompiledScriptPath(
mockNode, null, mockScriptCompiler);
assertEquals("Cache Path should be compiler default",
"/compile/cache/test/path/test.js", result);
verify(mockNode);
verify(mockScriptCompiler);
}
@Test
public void testIsCacheFresh() throws Exception {
Node mockCacheNode = createMock(Node.class);
Node mockSourceNode = createMock(Node.class);
Property mockSourceProperty = createMock(Property.class);
Property mockCacheProperty = createMock(Property.class);
Calendar olderCalendar = Calendar.getInstance();
Calendar newerCalendar = Calendar.getInstance();
newerCalendar.add(Calendar.MINUTE, 5);
expect(mockCacheNode.getNode(Property.JCR_CONTENT)).andReturn(
mockCacheNode);
expect(mockSourceNode.getNode(Property.JCR_CONTENT)).andReturn(
mockSourceNode);
expect(mockCacheNode.getProperty(Property.JCR_LAST_MODIFIED))
.andReturn(mockCacheProperty);
expect(mockSourceNode.getProperty(Property.JCR_LAST_MODIFIED))
.andReturn(mockSourceProperty);
expect(mockSourceProperty.getDate()).andReturn(olderCalendar);
expect(mockCacheProperty.getDate()).andReturn(newerCalendar);
replay(mockCacheNode);
replay(mockSourceNode);
replay(mockSourceProperty);
replay(mockCacheProperty);
boolean result = webResourceScriptCache.isCacheFresh(mockCacheNode,
mockSourceNode);
assertTrue("Should be cache hit", result);
verify(mockCacheNode);
verify(mockSourceNode);
verify(mockCacheProperty);
verify(mockSourceProperty);
}
@Test
public void testIsCacheNotFresh() throws Exception {
Node mockCacheNode = createMock(Node.class);
Node mockSourceNode = createMock(Node.class);
Property mockSourceProperty = createMock(Property.class);
Property mockCacheProperty = createMock(Property.class);
Calendar olderCalendar = Calendar.getInstance();
Calendar newerCalendar = Calendar.getInstance();
newerCalendar.add(Calendar.MINUTE, 5);
expect(mockCacheNode.getNode(Property.JCR_CONTENT)).andReturn(
mockCacheNode);
expect(mockSourceNode.getNode(Property.JCR_CONTENT)).andReturn(
mockSourceNode);
expect(mockCacheNode.getProperty(Property.JCR_LAST_MODIFIED))
.andReturn(mockCacheProperty);
expect(mockSourceNode.getProperty(Property.JCR_LAST_MODIFIED))
.andReturn(mockSourceProperty);
expect(mockCacheProperty.getDate()).andReturn(olderCalendar);
expect(mockSourceProperty.getDate()).andReturn(newerCalendar);
replay(mockCacheNode);
replay(mockSourceNode);
replay(mockSourceProperty);
replay(mockCacheProperty);
boolean result = webResourceScriptCache.isCacheFresh(mockCacheNode,
mockSourceNode);
assertFalse("Should be cache miss", result);
verify(mockCacheNode);
verify(mockSourceNode);
verify(mockCacheProperty);
verify(mockSourceProperty);
}
}