diff --git a/core/test/org/tangram/view/velocity/test/IncludeDirectiveTest.java b/core/test/org/tangram/view/velocity/test/IncludeDirectiveTest.java new file mode 100644 index 00000000..1c58ae3a --- /dev/null +++ b/core/test/org/tangram/view/velocity/test/IncludeDirectiveTest.java @@ -0,0 +1,101 @@ +/* + * + * Copyright 2016 Martin Goellnitz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + */ +package org.tangram.view.velocity.test; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.io.output.StringBuilderWriter; +import org.apache.velocity.context.Context; +import org.apache.velocity.context.InternalContextAdapter; +import org.apache.velocity.context.InternalContextAdapterImpl; +import org.apache.velocity.runtime.RuntimeInstance; +import org.apache.velocity.runtime.directive.DirectiveConstants; +import org.apache.velocity.runtime.parser.node.Node; +import org.mockito.Mockito; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.mock.web.MockServletContext; +import org.tangram.Constants; +import org.tangram.view.DefaultViewContextFactory; +import org.tangram.view.ViewContextFactory; +import org.tangram.view.ViewUtilities; +import org.tangram.view.velocity.IncludeDirective; +import org.testng.Assert; +import org.testng.annotations.Test; + + +/** + * Test aspects of the velocity directive to include views for beans. + */ +public class IncludeDirectiveTest { + + private final ViewContextFactory contextFactory = new DefaultViewContextFactory(); + + + @Test + public void testIncludeDirective() { + String bean = "linkit"; + String view = "default"; + String url = "/testapp/id_RootTopic:1"; + + IncludeDirective includeDirective = new IncludeDirective(); + Assert.assertEquals(includeDirective.getName(), "include", "Unexpected name for link directive."); + Assert.assertEquals(includeDirective.getType(), DirectiveConstants.LINE, "Unexpected type for include directive."); + StringBuilder output = new StringBuilder(); + StringBuilderWriter writer = new StringBuilderWriter(output); + + Context c = Mockito.mock(Context.class); + InternalContextAdapter context = new InternalContextAdapterImpl(c); + + ServletContext app = new MockServletContext(); + HttpServletRequest request = new MockHttpServletRequest(app, "GET", url); + MockHttpServletResponse response = new MockHttpServletResponse(); + ViewUtilities viewUtilities = Mockito.mock(ViewUtilities.class); + Mockito.when(viewUtilities.getViewContextFactory()).thenReturn(contextFactory); + + String[] keys = {Constants.ATTRIBUTE_REQUEST, Constants.ATTRIBUTE_RESPONSE, Constants.ATTRIBUTE_VIEW_UTILITIES}; + Mockito.when(context.get(Constants.ATTRIBUTE_REQUEST)).thenReturn(request); + Mockito.when(context.get(Constants.ATTRIBUTE_RESPONSE)).thenReturn(response); + Mockito.when(context.get(Constants.ATTRIBUTE_VIEW_UTILITIES)).thenReturn(viewUtilities); + Mockito.when(context.getKeys()).thenReturn(keys); + + Node node = Mockito.mock(Node.class); + Node beanNode = Mockito.mock(Node.class); + Node viewNode = Mockito.mock(Node.class); + Mockito.when(beanNode.value(context)).thenReturn(bean); + Mockito.when(viewNode.value(context)).thenReturn(view); + Mockito.when(node.jjtGetChild(0)).thenReturn(beanNode); + Mockito.when(node.jjtGetChild(1)).thenReturn(viewNode); + Mockito.when(node.jjtGetNumChildren()).thenReturn(2); + + RuntimeInstance runtime = new RuntimeInstance(); + runtime.addDirective(includeDirective); + includeDirective.init(runtime, context, node); + + boolean result = true; + try { + result = includeDirective.render(context, writer, node); + } catch (Throwable t) { + Assert.fail("Cannot handle request.", t); + } // try/catch + Assert.assertFalse(result, "Include directive should return false."); + Assert.assertEquals(writer.toString(), "", "Unexpected result on writer."); + } // testIncludeDirective() + +} // IncludeDirectiveTest diff --git a/core/test/org/tangram/view/velocity/test/LinkDirectiveTest.java b/core/test/org/tangram/view/velocity/test/LinkDirectiveTest.java new file mode 100644 index 00000000..50f8de1a --- /dev/null +++ b/core/test/org/tangram/view/velocity/test/LinkDirectiveTest.java @@ -0,0 +1,108 @@ +/* + * + * Copyright 2016 Martin Goellnitz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + */ +package org.tangram.view.velocity.test; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.io.output.StringBuilderWriter; +import org.apache.velocity.context.Context; +import org.apache.velocity.context.InternalContextAdapter; +import org.apache.velocity.context.InternalContextAdapterImpl; +import org.apache.velocity.runtime.RuntimeInstance; +import org.apache.velocity.runtime.directive.DirectiveConstants; +import org.apache.velocity.runtime.parser.node.Node; +import org.mockito.Mockito; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.mock.web.MockServletContext; +import org.tangram.Constants; +import org.tangram.link.Link; +import org.tangram.link.LinkFactoryAggregator; +import org.tangram.view.velocity.LinkDirective; +import org.testng.Assert; +import org.testng.annotations.Test; + + +/** + * Test aspects of the velocity directive to generate and output links. + */ +public class LinkDirectiveTest { + + @Test + public void testLinkDirective() { + String bean = "linkit"; + String view = "default"; + String action = "none"; + String url = "/testapp/id_RootTopic:1"; + + LinkDirective linkDirective = new LinkDirective(); + + Assert.assertEquals(linkDirective.getName(), "link", "Unexpected name for link directive."); + Assert.assertEquals(linkDirective.getType(), DirectiveConstants.LINE, "Unexpected type for link directive."); + StringBuilder output = new StringBuilder(); + StringBuilderWriter writer = new StringBuilderWriter(output); + + Context c = Mockito.mock(Context.class); + InternalContextAdapter context = new InternalContextAdapterImpl(c); + + ServletContext app = new MockServletContext(); + HttpServletRequest request = new MockHttpServletRequest(app, "GET", url); + MockHttpServletResponse response = new MockHttpServletResponse(); + LinkFactoryAggregator aggregator = Mockito.mock(LinkFactoryAggregator.class); + Mockito.when(aggregator.createLink(request, response, bean, action, view)).thenReturn(new Link(url)); + + Mockito.when(context.get(Constants.ATTRIBUTE_REQUEST)).thenReturn(request); + Mockito.when(context.get(Constants.ATTRIBUTE_RESPONSE)).thenReturn(response); + Mockito.when(context.get(Constants.ATTRIBUTE_LINK_FACTORY_AGGREGATOR)).thenReturn(aggregator); + + Node node = Mockito.mock(Node.class); + Node beanNode = Mockito.mock(Node.class); + Node viewNode = Mockito.mock(Node.class); + Node actionNode = Mockito.mock(Node.class); + Node hrefNode = Mockito.mock(Node.class); + Node targetNode = Mockito.mock(Node.class); + Node handlersNode = Mockito.mock(Node.class); + Mockito.when(beanNode.value(context)).thenReturn(bean); + Mockito.when(viewNode.value(context)).thenReturn(view); + Mockito.when(actionNode.value(context)).thenReturn(action); + Mockito.when(hrefNode.value(context)).thenReturn(true); + Mockito.when(targetNode.value(context)).thenReturn(false); + Mockito.when(handlersNode.value(context)).thenReturn(false); + Mockito.when(node.jjtGetChild(0)).thenReturn(beanNode); + Mockito.when(node.jjtGetChild(1)).thenReturn(viewNode); + Mockito.when(node.jjtGetChild(2)).thenReturn(actionNode); + Mockito.when(node.jjtGetChild(3)).thenReturn(hrefNode); + Mockito.when(node.jjtGetChild(4)).thenReturn(targetNode); + Mockito.when(node.jjtGetChild(5)).thenReturn(handlersNode); + Mockito.when(node.jjtGetNumChildren()).thenReturn(6); + + RuntimeInstance runtime = new RuntimeInstance(); + runtime.addDirective(linkDirective); + linkDirective.init(runtime, context, node); + boolean result = true; + try { + result = linkDirective.render(context, writer, node); + } catch (Throwable t) { + Assert.fail("Cannot handle request.", t); + } // try/catch + Assert.assertFalse(result, "Link directive should return false."); + Assert.assertEquals(writer.toString(), "href=\""+url+"\" ", "Unexpected result on writer."); + } // testLinkDirective() + +} // LinkDirectiveTest diff --git a/core/test/org/tangram/view/velocity/test/VelocityLogTest.java b/core/test/org/tangram/view/velocity/test/VelocityLogTest.java new file mode 100644 index 00000000..af0ba2f9 --- /dev/null +++ b/core/test/org/tangram/view/velocity/test/VelocityLogTest.java @@ -0,0 +1,54 @@ +/* + * + * Copyright 2016 Martin Goellnitz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + */ +package org.tangram.view.velocity.test; + +import org.tangram.view.velocity.VelocityLog; +import org.testng.Assert; +import org.testng.annotations.Test; + + +/** + * Just trigger the log somehow. + */ +public class VelocityLogTest { + + @Test + public void testVelocityLog() { + VelocityLog log = new VelocityLog(); + + log.log(VelocityLog.DEBUG_ID, "just trigger log"); + log.log(VelocityLog.INFO_ID, "just trigger log"); + log.log(VelocityLog.WARN_ID, "just trigger log"); + log.log(VelocityLog.ERROR_ID, "just trigger log"); + + Throwable t = new Throwable("Test"); + log.log(VelocityLog.DEBUG_ID, "just trigger log", t); + log.log(VelocityLog.INFO_ID, "just trigger log", t); + log.log(VelocityLog.WARN_ID, "just trigger log", t); + log.log(VelocityLog.ERROR_ID, "just trigger log", t); + + Assert.assertTrue(log.isLevelEnabled(VelocityLog.DEBUG_ID), "Level debug should be enabled during test."); + Assert.assertTrue(log.isLevelEnabled(VelocityLog.ERROR_ID), "Level error should be enabled during test."); + Assert.assertTrue(log.isLevelEnabled(VelocityLog.INFO_ID), "Level info should be enabled during test."); + Assert.assertFalse(log.isLevelEnabled(VelocityLog.TRACE_ID), "Level trace should be disabled during test."); + Assert.assertTrue(log.isLevelEnabled(VelocityLog.WARN_ID), "Level warn should be enabled during test."); + + } // testVelocityLog() + +} // VelocityLogTest diff --git a/core/test/org/tangram/view/velocity/test/VelocityResourceLoaderTest.java b/core/test/org/tangram/view/velocity/test/VelocityResourceLoaderTest.java new file mode 100644 index 00000000..28a1a6f7 --- /dev/null +++ b/core/test/org/tangram/view/velocity/test/VelocityResourceLoaderTest.java @@ -0,0 +1,68 @@ +/* + * + * Copyright 2016 Martin Goellnitz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + */ +package org.tangram.view.velocity.test; + +import org.apache.velocity.runtime.resource.Resource; +import org.mockito.Mockito; +import org.tangram.content.CodeResourceCache; +import org.tangram.content.TransientCode; +import org.tangram.view.velocity.VelocityPatchBean; +import org.tangram.view.velocity.VelocityResourceLoader; +import org.testng.Assert; +import org.testng.annotations.Test; + + +/** + * Test some aspects of the velocity template loading from the code resource cache. + */ +public class VelocityResourceLoaderTest { + + @Test + public void testVelocityResourceLoader() { + CodeResourceCache codeCache = Mockito.mock(CodeResourceCache.class); + TransientCode code = new TransientCode("org.tangram.example.Topic", "text/html", "Code:42", "", 12345); + Mockito.when(codeCache.get("org.tangram.example.Topic")).thenReturn(code); + + VelocityPatchBean bean = new VelocityPatchBean(); + bean.setCodeResourceCache(codeCache); + + VelocityResourceLoader resourceLoader = new VelocityResourceLoader(); + resourceLoader.init(null); + + boolean resourceExists = resourceLoader.resourceExists("org.tangram.example.Topic.name"); + Assert.assertFalse(resourceExists, "The given resource should not exist."); + resourceExists = resourceLoader.resourceExists("org.tangram.example.Topic"); + Assert.assertTrue(resourceExists, "The given resource should exist."); + + Resource resource = Mockito.mock(Resource.class); + Mockito.when(resource.getName()).thenReturn("org.tangram.example.Topic"); + Mockito.when(resource.getLastModified()).thenReturn(1234L); + boolean sourceModified = resourceLoader.isSourceModified(resource); + Assert.assertTrue(sourceModified, "The given source should be modified."); + + resource = Mockito.mock(Resource.class); + Mockito.when(resource.getName()).thenReturn("org.tangram.example.Topic"); + Mockito.when(resource.getLastModified()).thenReturn(12345L); + sourceModified = resourceLoader.isSourceModified(resource); + Assert.assertFalse(sourceModified, "The given source should not be modified."); + + Assert.assertNotNull(resourceLoader.getResourceStream("org.tangram.example.Topic"), "Stream should not be null for existing resources."); + } // testVelocityResourceLoader() + +} // VelocityResourceLoaderTest