/** * This Source Code Form is subject to the terms of the Mozilla Public License, * v. 2.0. If a copy of the MPL was not distributed with this file, You can * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. * * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS * graphic logo is a trademark of OpenMRS Inc. */ package org.openmrs.module.web; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.File; import java.io.FileNotFoundException; import java.util.HashMap; import java.util.Properties; import java.util.Scanner; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.junit.Test; import org.junit.runner.RunWith; import org.openmrs.module.Module; import org.openmrs.module.ModuleException; import org.openmrs.module.ModuleFactory; import org.openmrs.web.DispatcherServlet; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * */ @RunWith(PowerMockRunner.class) @PrepareForTest(WebModuleUtil.class) public class WebModuleUtilTest { private static final String REAL_PATH = "/usr/local/apache-tomcat-7.0.27/webapps/openmrs"; /** * @see WebModuleUtil#isModulePackageNameInTaskClass(String, String) * @throws Exception */ @Test public void isModulePackageNameInTaskClass_shouldReturnFalseForDifferentPackageName() { String modulePackageName = "org.openmrs.logic.task"; String taskClass = "org.openmrs.logic.TaskInitializeLogicRuleProvidersTask"; boolean result = WebModuleUtil.isModulePackageNameInTaskClass(modulePackageName, taskClass); assertFalse(result); } /** * @see WebModuleUtil#isModulePackageNameInTaskClass(String, String) * @throws Exception */ @Test public void isModulePackageNameInTaskClass_shouldReturnFalseIfModuleHasLongerPackageName() { String modulePackageName = "org.openmrs.logic.task"; String taskClass = "org.openmrs.logic.TaskInitializeLogicRuleProvidersTask"; boolean result = WebModuleUtil.isModulePackageNameInTaskClass(modulePackageName, taskClass); assertFalse(result); } /** * @see WebModuleUtil#isModulePackageNameInTaskClass(String, String) * @throws Exception */ @Test public void isModulePackageNameInTaskClass_shouldProperlyMatchSubpackages() { String modulePackageName = "org.openmrs.module.xforms"; String taskClass = "org.openmrs.module.xforms.ProcessXformsQueueTask"; boolean result = WebModuleUtil.isModulePackageNameInTaskClass(modulePackageName, taskClass); assertTrue(result); } /** * @see WebModuleUtil#isModulePackageNameInTaskClass(String, String) * @throws Exception */ @Test public void isModulePackageNameInTaskClass_shouldReturnFalseForEmptyPackageNames() { String modulePackageName = ""; String taskClass = ""; boolean result = WebModuleUtil.isModulePackageNameInTaskClass(modulePackageName, taskClass); assertFalse(result); } /** * @throws ParserConfigurationException * @see WebModuleUtil#startModule(Module, ServletContext, boolean) */ @Test public void startModule_shouldCreateDwrModulesXmlIfNotExists() throws ParserConfigurationException { // create dummy module and start it Module mod = buildModuleForMessageTest(); ModuleFactory.getStartedModulesMap().put(mod.getModuleId(), mod); ServletContext servletContext = mock(ServletContext.class); String realPath = servletContext.getRealPath(""); if (realPath == null) realPath = System.getProperty("user.dir"); // manually delete dwr-modules.xml File f = new File(realPath + "/WEB-INF/dwr-modules.xml"); f.delete(); // start the dummy module WebModuleUtil.startModule(mod, servletContext, true); // test if dwr-modules.xml is created assertTrue(f.exists()); ModuleFactory.getStartedModulesMap().clear(); } /** * @throws ParserConfigurationException * @throws FileNotFoundException * @see WebModuleUtil#startModule(Module, ServletContext, boolean) */ @Test public void startModule_dwrModuleXmlshouldContainModuleInfo() throws ParserConfigurationException, FileNotFoundException { // create dummy module and start it Module mod = buildModuleForMessageTest(); ModuleFactory.getStartedModulesMap().put(mod.getModuleId(), mod); ServletContext servletContext = mock(ServletContext.class); String realPath = servletContext.getRealPath(""); if (realPath == null) realPath = System.getProperty("user.dir"); WebModuleUtil.startModule(mod, servletContext, true); // test if dwr-modules.xml contains id of started dummy module File f = new File(realPath + "/WEB-INF/dwr-modules.xml"); Scanner scanner = new Scanner(f); boolean found = false; while (scanner.hasNextLine()) { String line = scanner.nextLine(); if (line.contains(mod.getModuleId())) { found = true; break; } } if (scanner != null) scanner.close(); assertTrue(found); ModuleFactory.getStartedModulesMap().clear(); } private Module buildModuleForMessageTest() throws ParserConfigurationException { Properties englishMessages = new Properties(); englishMessages.put("withoutPrefix", "Without prefix"); Module mod = new Module("My Module"); mod.setModuleId("mymodule"); mod.setMessages(new HashMap<String, Properties>()); mod.getMessages().put("en", englishMessages); mod.setFile(new File("sampleFile.jar")); mod.setConfig(buildModuleConfig()); return mod; } private Document buildModuleConfig() throws ParserConfigurationException { DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc = docBuilder.newDocument(); Element rootElement = doc.createElement("module"); doc.appendChild(rootElement); Element dwr = doc.createElement("dwr"); dwr.appendChild(doc.createTextNode("")); rootElement.appendChild(dwr); Element allow = doc.createElement("allow"); allow.appendChild(doc.createTextNode("")); dwr.appendChild(allow); Attr attr = doc.createAttribute("moduleId"); attr.setValue("mymodule"); allow.setAttributeNode(attr); Element create = doc.createElement("create"); allow.appendChild(create); return doc; } /** * @see WebModuleUtil#getModuleWebFolder(String) */ @Test(expected = ModuleException.class) public void getModuleWebFolder_shouldReturnNullIfTheDispatcherServletIsNotYetSet() { //We need to do this in case it is run after getModuleWebFolder_shouldReturnTheCorrectModuleFolder WebModuleUtil.setDispatcherServlet(null); WebModuleUtil.getModuleWebFolder(""); } /** * @see WebModuleUtil#getModuleWebFolder(String) */ @Test public void getModuleWebFolder_shouldReturnTheCorrectModuleFolder() { setupMocks(false); String moduleId = "basicmodule"; String expectedPath = (REAL_PATH + "/WEB-INF/view/module/" + moduleId).replace("/", File.separator); String actualPath = WebModuleUtil.getModuleWebFolder(moduleId); assertEquals(expectedPath, actualPath); } /** * @see WebModuleUtil#getModuleWebFolder(String) */ @Test public void getModuleWebFolder_shouldReturnTheCorrectModuleFolderIfRealPathHasATrailingSlash() { setupMocks(true); String moduleId = "basicmodule"; String expectedPath = (REAL_PATH + "/WEB-INF/view/module/" + moduleId).replace("/", File.separator); String actualPath = WebModuleUtil.getModuleWebFolder(moduleId); assertEquals(expectedPath, actualPath); } private static void setupMocks(boolean includeTrailingSlash) { ServletConfig servletConfig = mock(ServletConfig.class); ServletContext servletContext = mock(ServletContext.class); String realPath = (includeTrailingSlash) ? REAL_PATH + "/" : REAL_PATH; when(servletContext.getRealPath("")).thenReturn(realPath); DispatcherServlet dispatcherServlet = mock(DispatcherServlet.class); when(dispatcherServlet.getServletConfig()).thenReturn(servletConfig); when(dispatcherServlet.getServletContext()).thenReturn(servletContext); WebModuleUtil.setDispatcherServlet(dispatcherServlet); } }