You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

markdown_test.go 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. package markdown_test
  2. import (
  3. "testing"
  4. . "github.com/smartystreets/goconvey/convey"
  5. . "github.com/gogits/gogs/modules/markdown"
  6. "github.com/gogits/gogs/modules/setting"
  7. )
  8. func TestMarkdown(t *testing.T) {
  9. var (
  10. urlPrefix = "/prefix"
  11. metas map[string]string = nil
  12. )
  13. setting.AppSubUrlDepth = 0
  14. Convey("Rendering an issue link", t, func () {
  15. Convey("To the internal issue tracker", func () {
  16. Convey("It should not render anything when there are no issues", func () {
  17. testCases := []string {
  18. "",
  19. "this is a test",
  20. "test 123 123 1234",
  21. "#",
  22. "# # #",
  23. "# 123",
  24. "#abcd",
  25. "##1234",
  26. "test#1234",
  27. "#1234test",
  28. " test #1234test",
  29. }
  30. for i := 0; i < len(testCases); i++ {
  31. So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i])
  32. }
  33. })
  34. Convey("It should render freestanding issue mentions", func () {
  35. testCases := []string {
  36. "#1234 test", "<a href=\"/prefix/issues/1234\">#1234</a> test",
  37. "test #1234 issue", "test <a href=\"/prefix/issues/1234\">#1234</a> issue",
  38. "test issue #1234", "test issue <a href=\"/prefix/issues/1234\">#1234</a>",
  39. "#5 test", "<a href=\"/prefix/issues/5\">#5</a> test",
  40. "test #5 issue", "test <a href=\"/prefix/issues/5\">#5</a> issue",
  41. "test issue #5", "test issue <a href=\"/prefix/issues/5\">#5</a>",
  42. }
  43. for i := 0; i < len(testCases); i += 2 {
  44. So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1])
  45. }
  46. })
  47. Convey("It should not render issue without leading space", func () {
  48. input := []byte("test#54321 issue")
  49. expected := "test#54321 issue"
  50. So(string(RenderIssueIndexPattern(input, urlPrefix, metas)), ShouldEqual, expected)
  51. })
  52. Convey("It should not render issue without trailing space", func () {
  53. input := []byte("test #54321issue")
  54. expected := "test #54321issue"
  55. So(string(RenderIssueIndexPattern(input, urlPrefix, metas)), ShouldEqual, expected)
  56. })
  57. Convey("It should render issue in parentheses", func () {
  58. testCases := []string {
  59. "(#54321 issue)", "(<a href=\"/prefix/issues/54321\">#54321</a> issue)",
  60. "test (#54321) issue", "test (<a href=\"/prefix/issues/54321\">#54321</a>) issue",
  61. "test (#54321 extra) issue", "test (<a href=\"/prefix/issues/54321\">#54321</a> extra) issue",
  62. "test (#54321 issue)", "test (<a href=\"/prefix/issues/54321\">#54321</a> issue)",
  63. "test (#54321)", "test (<a href=\"/prefix/issues/54321\">#54321</a>)",
  64. }
  65. for i := 0; i < len(testCases); i += 2 {
  66. So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1])
  67. }
  68. })
  69. Convey("It should render multiple issues in the same line", func () {
  70. testCases := []string {
  71. "#54321 #1243", "<a href=\"/prefix/issues/54321\">#54321</a> <a href=\"/prefix/issues/1243\">#1243</a>",
  72. "test #54321 #1243", "test <a href=\"/prefix/issues/54321\">#54321</a> <a href=\"/prefix/issues/1243\">#1243</a>",
  73. "(#54321 #1243)", "(<a href=\"/prefix/issues/54321\">#54321</a> <a href=\"/prefix/issues/1243\">#1243</a>)",
  74. "(#54321)(#1243)", "(<a href=\"/prefix/issues/54321\">#54321</a>)(<a href=\"/prefix/issues/1243\">#1243</a>)",
  75. "text #54321 test #1243 issue", "text <a href=\"/prefix/issues/54321\">#54321</a> test <a href=\"/prefix/issues/1243\">#1243</a> issue",
  76. "#1 (#4321) test", "<a href=\"/prefix/issues/1\">#1</a> (<a href=\"/prefix/issues/4321\">#4321</a>) test",
  77. }
  78. for i := 0; i < len(testCases); i += 2 {
  79. So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1])
  80. }
  81. })
  82. })
  83. Convey("To an external issue tracker with numeric style", func () {
  84. metas = make(map[string]string)
  85. metas["format"] = "https://someurl.com/{user}/{repo}/{index}"
  86. metas["user"] = "someuser"
  87. metas["repo"] = "somerepo"
  88. metas["style"] = ISSUE_NAME_STYLE_NUMERIC
  89. Convey("should not render anything when there are no issues", func () {
  90. testCases := []string {
  91. "this is a test",
  92. "test 123 123 1234",
  93. "#",
  94. "# # #",
  95. "# 123",
  96. "#abcd",
  97. }
  98. for i := 0; i < len(testCases); i++ {
  99. So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i])
  100. }
  101. })
  102. Convey("It should render freestanding issue", func () {
  103. testCases := []string {
  104. "#1234 test", "<a href=\"https://someurl.com/someuser/somerepo/1234\">#1234</a> test",
  105. "test #1234 issue", "test <a href=\"https://someurl.com/someuser/somerepo/1234\">#1234</a> issue",
  106. "test issue #1234", "test issue <a href=\"https://someurl.com/someuser/somerepo/1234\">#1234</a>",
  107. "#5 test", "<a href=\"https://someurl.com/someuser/somerepo/5\">#5</a> test",
  108. "test #5 issue", "test <a href=\"https://someurl.com/someuser/somerepo/5\">#5</a> issue",
  109. "test issue #5", "test issue <a href=\"https://someurl.com/someuser/somerepo/5\">#5</a>",
  110. }
  111. for i := 0; i < len(testCases); i += 2 {
  112. So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1])
  113. }
  114. })
  115. Convey("It should not render issue mention without leading space", func () {
  116. input := []byte("test#54321 issue")
  117. expected := "test#54321 issue"
  118. So(string(RenderIssueIndexPattern(input, urlPrefix, metas)), ShouldEqual, expected)
  119. })
  120. Convey("It should not render issue mention without trailing space", func () {
  121. input := []byte("test #54321issue")
  122. expected := "test #54321issue"
  123. So(string(RenderIssueIndexPattern(input, urlPrefix, metas)), ShouldEqual, expected)
  124. })
  125. Convey("It should render mention in parentheses", func () {
  126. testCases := []string {
  127. "(#54321 issue)", "(<a href=\"https://someurl.com/someuser/somerepo/54321\">#54321</a> issue)",
  128. "test (#54321) issue", "test (<a href=\"https://someurl.com/someuser/somerepo/54321\">#54321</a>) issue",
  129. "test (#54321 extra) issue", "test (<a href=\"https://someurl.com/someuser/somerepo/54321\">#54321</a> extra) issue",
  130. "test (#54321 issue)", "test (<a href=\"https://someurl.com/someuser/somerepo/54321\">#54321</a> issue)",
  131. "test (#54321)", "test (<a href=\"https://someurl.com/someuser/somerepo/54321\">#54321</a>)",
  132. }
  133. for i := 0; i < len(testCases); i += 2 {
  134. So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1])
  135. }
  136. })
  137. Convey("It should render multiple mentions in the same line", func () {
  138. testCases := []string {
  139. "#54321 #1243", "<a href=\"https://someurl.com/someuser/somerepo/54321\">#54321</a> <a href=\"https://someurl.com/someuser/somerepo/1243\">#1243</a>",
  140. "test #54321 #1243", "test <a href=\"https://someurl.com/someuser/somerepo/54321\">#54321</a> <a href=\"https://someurl.com/someuser/somerepo/1243\">#1243</a>",
  141. "(#54321 #1243)", "(<a href=\"https://someurl.com/someuser/somerepo/54321\">#54321</a> <a href=\"https://someurl.com/someuser/somerepo/1243\">#1243</a>)",
  142. "(#54321)(#1243)", "(<a href=\"https://someurl.com/someuser/somerepo/54321\">#54321</a>)(<a href=\"https://someurl.com/someuser/somerepo/1243\">#1243</a>)",
  143. "text #54321 test #1243 issue", "text <a href=\"https://someurl.com/someuser/somerepo/54321\">#54321</a> test <a href=\"https://someurl.com/someuser/somerepo/1243\">#1243</a> issue",
  144. "#1 (#4321) test", "<a href=\"https://someurl.com/someuser/somerepo/1\">#1</a> (<a href=\"https://someurl.com/someuser/somerepo/4321\">#4321</a>) test",
  145. }
  146. for i := 0; i < len(testCases); i += 2 {
  147. So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1])
  148. }
  149. })
  150. })
  151. Convey("To an external issue tracker with alphanumeric style", func () {
  152. metas = make(map[string]string)
  153. metas["format"] = "https://someurl.com/{user}/{repo}/?b={index}"
  154. metas["user"] = "someuser"
  155. metas["repo"] = "somerepo"
  156. metas["style"] = ISSUE_NAME_STYLE_ALPHANUMERIC
  157. Convey("It should not render anything when there are no issues", func () {
  158. testCases := []string {
  159. "",
  160. "this is a test",
  161. "test 123 123 1234",
  162. "#",
  163. "##1234",
  164. "# 123",
  165. "#abcd",
  166. "test #123",
  167. "abc-1234", // issue prefix must be capital
  168. "ABc-1234", // issue prefix must be _all_ capital
  169. "ABCDEFGHIJK-1234", // the limit is 10 characters in the prefix
  170. "ABC1234", // dash is required
  171. "test ABC- test", // number is required
  172. "test -1234 test", // prefix is required
  173. "testABC-123 test", // leading space is required
  174. "test ABC-123test", // trailing space is required
  175. "ABC-0123", // no leading zero
  176. }
  177. for i := 0; i < len(testCases); i += 2 {
  178. So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i])
  179. }
  180. })
  181. Convey("It should render freestanding issue", func () {
  182. testCases := []string {
  183. "OTT-1234 test", "<a href=\"https://someurl.com/someuser/somerepo/?b=OTT-1234\">OTT-1234</a> test",
  184. "test T-12 issue", "test <a href=\"https://someurl.com/someuser/somerepo/?b=T-12\">T-12</a> issue",
  185. "test issue ABCDEFGHIJ-1234567890", "test issue <a href=\"https://someurl.com/someuser/somerepo/?b=ABCDEFGHIJ-1234567890\">ABCDEFGHIJ-1234567890</a>",
  186. "A-1 test", "<a href=\"https://someurl.com/someuser/somerepo/?b=A-1\">A-1</a> test",
  187. "test ZED-1 issue", "test <a href=\"https://someurl.com/someuser/somerepo/?b=ZED-1\">ZED-1</a> issue",
  188. "test issue DEED-7154", "test issue <a href=\"https://someurl.com/someuser/somerepo/?b=DEED-7154\">DEED-7154</a>",
  189. }
  190. for i := 0; i < len(testCases); i += 2 {
  191. So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1])
  192. }
  193. })
  194. Convey("It should render mention in parentheses", func () {
  195. testCases := []string {
  196. "(ABG-124 issue)", "(<a href=\"https://someurl.com/someuser/somerepo/?b=ABG-124\">ABG-124</a> issue)",
  197. "test (ABG-124) issue", "test (<a href=\"https://someurl.com/someuser/somerepo/?b=ABG-124\">ABG-124</a>) issue",
  198. "test (ABG-124 extra) issue", "test (<a href=\"https://someurl.com/someuser/somerepo/?b=ABG-124\">ABG-124</a> extra) issue",
  199. "test (ABG-124 issue)", "test (<a href=\"https://someurl.com/someuser/somerepo/?b=ABG-124\">ABG-124</a> issue)",
  200. "test (ABG-124)", "test (<a href=\"https://someurl.com/someuser/somerepo/?b=ABG-124\">ABG-124</a>)",
  201. }
  202. for i := 0; i < len(testCases); i += 2 {
  203. So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1])
  204. }
  205. })
  206. Convey("It should render multiple mentions in the same line", func () {
  207. testCases := []string {
  208. "ABG-124 OTT-4321", "<a href=\"https://someurl.com/someuser/somerepo/?b=ABG-124\">ABG-124</a> <a href=\"https://someurl.com/someuser/somerepo/?b=OTT-4321\">OTT-4321</a>",
  209. "test ABG-124 OTT-4321", "test <a href=\"https://someurl.com/someuser/somerepo/?b=ABG-124\">ABG-124</a> <a href=\"https://someurl.com/someuser/somerepo/?b=OTT-4321\">OTT-4321</a>",
  210. "(ABG-124 OTT-4321)", "(<a href=\"https://someurl.com/someuser/somerepo/?b=ABG-124\">ABG-124</a> <a href=\"https://someurl.com/someuser/somerepo/?b=OTT-4321\">OTT-4321</a>)",
  211. "(ABG-124)(OTT-4321)", "(<a href=\"https://someurl.com/someuser/somerepo/?b=ABG-124\">ABG-124</a>)(<a href=\"https://someurl.com/someuser/somerepo/?b=OTT-4321\">OTT-4321</a>)",
  212. "text ABG-124 test OTT-4321 issue", "text <a href=\"https://someurl.com/someuser/somerepo/?b=ABG-124\">ABG-124</a> test <a href=\"https://someurl.com/someuser/somerepo/?b=OTT-4321\">OTT-4321</a> issue",
  213. "A-1 (RRE-345) test", "<a href=\"https://someurl.com/someuser/somerepo/?b=A-1\">A-1</a> (<a href=\"https://someurl.com/someuser/somerepo/?b=RRE-345\">RRE-345</a>) test",
  214. }
  215. for i := 0; i < len(testCases); i += 2 {
  216. So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1])
  217. }
  218. })
  219. })
  220. })
  221. }