/******************************************************************************** * CruiseControl, a Continuous Integration Toolkit * Copyright (c) 2007, ThoughtWorks, Inc. * 200 E. Randolph, 25th Floor * Chicago, IL 60601 USA * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * + Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * + Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the * names of its contributors may be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ********************************************************************************/ package net.sourceforge.cruisecontrol.dashboard.web; import net.sourceforge.cruisecontrol.Modification; import net.sourceforge.cruisecontrol.dashboard.ModificationKey; import net.sourceforge.cruisecontrol.dashboard.StoryTracker; import net.sourceforge.cruisecontrol.dashboard.repository.BuildInformationRepository; import net.sourceforge.cruisecontrol.dashboard.service.BuildLoopQueryService; import net.sourceforge.cruisecontrol.dashboard.service.DashboardConfigFileFactory; import net.sourceforge.cruisecontrol.dashboard.service.DashboardConfigService; import net.sourceforge.cruisecontrol.dashboard.service.DashboardXmlConfigService; import net.sourceforge.cruisecontrol.dashboard.service.EnvironmentService; import net.sourceforge.cruisecontrol.dashboard.web.view.JsonView; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import org.jmock.Mock; import org.jmock.cglib.MockObjectTestCase; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.web.servlet.ModelAndView; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Map; public class GetCommitMessageControllerTest extends MockObjectTestCase { private MockHttpServletRequest request = new MockHttpServletRequest(); private MockHttpServletResponse response = new MockHttpServletResponse(); private Mock buildLoopQueryServiceMock = mock(BuildLoopQueryService.class, new Class[] {EnvironmentService.class, BuildInformationRepository.class}, new Object[] {new EnvironmentService(new DashboardConfigService[] {}), null}); private Mock dashboardConfigMock = mock(DashboardXmlConfigService.class, new Class[] {DashboardConfigFileFactory.class}, new Object[] {null}); private GetCommitMessageController controller = new GetCommitMessageController((BuildLoopQueryService) buildLoopQueryServiceMock.proxy(), (DashboardXmlConfigService) dashboardConfigMock.proxy()); public void testJSONObjectTypeShouldBeArray() throws Exception { buildLoopQueryServiceMock.expects(once()).method("getCommitMessages").with(eq("project1")).will( returnValue(Arrays.asList(new ModificationKey[] {}))); dashboardConfigMock.expects(never()).method("getStoryTrackers").will(returnValue(new HashMap())); request.setParameter("project", "project1"); controller.handleRequest(request, response); String json = response.getContentAsString(); assertEquals("", json); } public void testShouldReturnEmptyArrayIfThereIsNoCommitMessages() throws Exception { buildLoopQueryServiceMock.expects(once()).method("getCommitMessages").with(eq("project1")).will( returnValue(Arrays.asList(new ModificationKey[] {}))); dashboardConfigMock.expects(never()).method("getStoryTrackers").will(returnValue(new HashMap())); request.setParameter("project", "project1"); controller.handleRequest(request, response); String json = response.getContentAsString(); assertEquals("", json); } public void testJSONObjectShouldHasUserAndMessageProperty() throws Exception { buildLoopQueryServiceMock.expects(once()).method("getCommitMessages").with(eq("project1")).will( returnValue(Arrays.asList(new Modification[] {createModification("joe", "add new feature"), createModification("joe", "update build")}))); dashboardConfigMock.expects(once()).method("getStoryTrackers").will(returnValue(new HashMap())); request.setParameter("project", "project1"); String json = getResponse(controller.handleRequest(request, response)); assertTrue(StringUtils.contains(json, "{")); assertTrue(StringUtils.contains(json, "user")); assertTrue(StringUtils.contains(json, "joe")); assertTrue(StringUtils.contains(json, "build")); } public Modification createModification(String username, String comment) { Modification m1 = new Modification(); m1.userName = username; m1.comment = comment; m1.modifiedTime = new Date(); return m1; } public void testShouldContainHyperlinkIfConfiguredStoryTracker() throws Exception { buildLoopQueryServiceMock.expects(once()).method("getCommitMessages").with(eq("project_with_story_tracker")) .will( returnValue(Arrays.asList(new Modification[] { createModification("joe", "add new feature"), createModification("joe", "update build456")}))); Map expectedMap = new HashMap(); StoryTracker expectedStoryTracker = new StoryTracker("project_with_story_tracker", "http://abc/", "build,bug"); expectedMap.put("project_with_story_tracker", expectedStoryTracker); dashboardConfigMock.expects(once()).method("getStoryTrackers").will(returnValue(expectedMap)); request.setParameter("project", "project_with_story_tracker"); String json = getResponse(controller.handleRequest(request, response)); assertTrue(StringUtils.contains(json, "{")); String escaped = StringEscapeUtils.escapeJavaScript("<a href=\"http://abc/456\">"); assertTrue(StringUtils.contains(json, escaped)); assertTrue(StringUtils.contains(json, "user")); assertTrue(StringUtils.contains(json, "}")); } private String getResponse(ModelAndView mov) throws Exception { JsonView jsonView = (JsonView) mov.getView(); jsonView.render(mov.getModel(), request, response); return response.getContentAsString(); } }