/*************************GO-LICENSE-START********************************* * Copyright 2014 ThoughtWorks, Inc. * * 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. *************************GO-LICENSE-END***********************************/ package com.thoughtworks.go.domain; import org.apache.commons.lang.StringEscapeUtils; import org.junit.Test; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.StringContains.containsString; import static org.junit.Assert.assertThat; public class DefaultCommentRendererTest { DefaultCommentRenderer trackingTool; @Test public void shouldReturnOriginalStringIfNothingSpecified() { trackingTool = new DefaultCommentRenderer("", ""); String toRender = "some string"; String result = trackingTool.render(toRender); assertThat(result, is(toRender)); } @Test public void shouldReturnEmptyStringIfNothingToRender() { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "(evo-\\d+)"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render(null); assertThat(result, is("")); } @Test public void shouldRenderStringWithoutSpecifiedRegexAndLinkIfHasGroupsAndNoneMaterialize() throws Exception { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "evo-(\\d+)|evo-"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render("evo-abc: checkin message"); assertThat(result, is("evo-abc: checkin message")); } @Test public void shouldRenderStringWithSpecifiedRegexAndLinkIfHasGroupsAndOtherThanFirstMaterializes() throws Exception { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "evo-(\\d+)|evo-(ab)"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render("evo-abc: checkin message"); assertThat(result, is("<a href=\"" + "http://mingle05/projects/cce/cards/ab\" target=\"story_tracker\">evo-ab</a>c: checkin message")); } @Test public void shouldRenderStringWithSpecifiedRegexAndLink() throws Exception { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "(evo-\\d+)"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render("evo-111: checkin message"); assertThat(result, is("<a href=\"" + "http://mingle05/projects/cce/cards/evo-111\" " + "target=\"story_tracker\">evo-111</a>: checkin message")); } @Test public void shouldRenderStringWithSpecifiedRegexAndLink1() throws Exception { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "(?:Task |#|Bug )(\\d+)"; trackingTool = new DefaultCommentRenderer(link, regex); assertThat(trackingTool.render("Task 111: checkin message"), is("<a href=\"" + "http://mingle05/projects/cce/cards/111\" " + "target=\"story_tracker\">Task 111</a>: checkin message")); assertThat(trackingTool.render("Bug 111: checkin message"), is("<a href=\"" + "http://mingle05/projects/cce/cards/111\" " + "target=\"story_tracker\">Bug 111</a>: checkin message")); assertThat(trackingTool.render("#111: checkin message"), is("<a href=\"" + "http://mingle05/projects/cce/cards/111\" " + "target=\"story_tracker\">#111</a>: checkin message")); } @Test public void shouldRenderStringWithRegexThatHasSubSelect() throws Exception { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "evo-(\\d+)"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render("evo-111: checkin message"); assertThat(result, is("<a href=\"" + "http://mingle05/projects/cce/cards/111\" " + "target=\"story_tracker\">evo-111</a>: checkin message")); } @Test public void shouldReturnMatchedStringIfRegexDoesNotHaveGroup() throws Exception { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "\\d+"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render("evo-1020: checkin message"); assertThat(result, is("evo-<a href=\"" + "http://mingle05/projects/cce/cards/1020\" " + "target=\"story_tracker\">1020</a>: checkin message")); } @Test public void shouldReturnMatchedStringFromFirstGroupIfMultipleGroupsAreDefined() throws Exception { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "(\\d+)-(evo\\d+)"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render("1020-evo1: checkin message"); assertThat(result, is("<a href=\"" + "http://mingle05/projects/cce/cards/1020\" " + "target=\"story_tracker\">1020-evo1</a>: checkin message")); } @Test public void shouldReturnOriginalStringIfRegexDoesNotMatch() throws Exception { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "evo-(\\d+)"; trackingTool = new DefaultCommentRenderer(link, regex); String toRender = "evo-abc: checkin message"; String result = trackingTool.render(toRender); assertThat(result, is(toRender)); } @Test public void shouldReturnOriginalStringIfRegexIsIllegal() throws Exception { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "++"; trackingTool = new DefaultCommentRenderer(link, regex); String toRender = "evo-abc: checkin message"; String result = trackingTool.render(toRender); assertThat(result, is(toRender)); } @Test public void shouldRenderUsingFixedUrlIfLinkDoesNotContainVariable() throws Exception { String link = "http://mingle05/projects/cce/cards/wall-E"; String regex = "(evo-\\d+)"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render("evo-111: checkin message"); assertThat(result, is("<a href=\"" + "http://mingle05/projects/cce/cards/wall-E\" " + "target=\"story_tracker\">evo-111</a>: checkin message")); } @Test public void shouldUseLinkFromConfigurationRegardlessOfItsValidity() throws Exception { String link = "aaa${ID}"; String regex = "\\d+"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render("111: checkin message"); assertThat(result, is("<a href=\"aaa111\" target=\"story_tracker\">111</a>: checkin message")); } @Test // #2324 public void shouldRenderAllPossibleMatches() throws Exception { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "#(\\d+)"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render("#111, #222: checkin message; #333: another message"); assertThat(result, is("<a href=\"http://mingle05/projects/cce/cards/111\" target=\"story_tracker\">#111</a>, " + "<a href=\"http://mingle05/projects/cce/cards/222\" " + "target=\"story_tracker\">#222</a>: checkin message; " + "<a href=\"http://mingle05/projects/cce/cards/333\" " + "target=\"story_tracker\">#333</a>: another message")); } @Test public void shouldReplaceBasedOnRegexInsteadOfPureStringReplacement() throws Exception { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "evo-(\\d+)"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render("Replace evo-1994. Don't replace 1994"); assertThat(result, containsString( "<a href=\"http://mingle05/projects/cce/cards/1994\" " + "target=\"story_tracker\">evo-1994</a>")); assertThat(result, containsString("Don't replace 1994")); } @Test public void shouldSupportUTF8() throws Exception { String link = "http://mingle05/projects/cce/cards/${ID}"; String regex = "#(\\d+)"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render("The story #111 is fixed by 德里克. #122 is also related to this"); assertThat(result, is("The story " + dynamicLink("111") + " is fixed by " + StringEscapeUtils.escapeHtml("德里克") + ". " + dynamicLink("122") + " is also related to this")); } @Test public void shouldEscapeTheWholeCommentIfNoneIsMatched() { trackingTool = new DefaultCommentRenderer("", ""); String toRender = "some <string>"; String result = trackingTool.render(toRender); assertThat(result, is(StringEscapeUtils.escapeHtml(toRender))); } @Test public void shouldEscapeDynamicLink() { String link = "http://jira.example.com/${ID}"; String regex = "^ABC-[^ ]+"; trackingTool = new DefaultCommentRenderer(link, regex); String result = trackingTool.render("ABC-\"><svg/onload=\"alert(1)"); assertThat(result, is("<a href=\"http://jira.example.com/ABC-"><svg/onload="alert(1)\" " + "target=\"story_tracker\">ABC-"><svg/onload="alert(1)</a>")); } private String dynamicLink(String id) { return "<a href=\"http://mingle05/projects/cce/cards/" + id + "\" target=\"story_tracker\">#" + id + "</a>"; } }