aboutsummaryrefslogtreecommitdiffstats
path: root/modules/references/references_test.go
diff options
context:
space:
mode:
authorguillep2k <18600385+guillep2k@users.noreply.github.com>2019-10-13 19:29:10 -0300
committerzeripath <art27@cantab.net>2019-10-13 23:29:10 +0100
commit15809d81f7d36759f289b941352a9754611c5dba (patch)
treef9362e535fb67aa59859b535ec6c58ccf5a139bf /modules/references/references_test.go
parent6e3f51098b29cd5c61d62732a42a7554cbc8cc2f (diff)
downloadgitea-15809d81f7d36759f289b941352a9754611c5dba.tar.gz
gitea-15809d81f7d36759f289b941352a9754611c5dba.zip
Rewrite reference processing code in preparation for opening/closing from comment references (#8261)
* Add a markdown stripper for mentions and xrefs * Improve comments * Small code simplification * Move reference code to modules/references * Fix typo * Make MarkdownStripper return [][]byte * Implement preliminary keywords parsing * Add FIXME comment * Fix comment * make fmt * Fix permissions check * Fix text assumptions * Fix imports * Fix lint, fmt * Fix unused import * Add missing export comment * Bypass revive on implemented interface * Move mdstripper into its own package * Support alphanumeric patterns * Refactor FindAllMentions * Move mentions test to references * Parse mentions from reference package * Refactor code to implement renderizable references * Fix typo * Move patterns and tests to the references package * Fix nil reference * Preliminary rendering attempt of closing keywords * Normalize names, comments, general tidy-up * Add CSS style for action keywords * Fix permission for admin and owner * Fix golangci-lint * Fix golangci-lint
Diffstat (limited to 'modules/references/references_test.go')
-rw-r--r--modules/references/references_test.go296
1 files changed, 296 insertions, 0 deletions
diff --git a/modules/references/references_test.go b/modules/references/references_test.go
new file mode 100644
index 0000000000..f8153ffe36
--- /dev/null
+++ b/modules/references/references_test.go
@@ -0,0 +1,296 @@
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package references
+
+import (
+ "testing"
+
+ "code.gitea.io/gitea/modules/setting"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestFindAllIssueReferences(t *testing.T) {
+
+ type result struct {
+ Index int64
+ Owner string
+ Name string
+ Issue string
+ Action XRefAction
+ RefLocation *RefSpan
+ ActionLocation *RefSpan
+ }
+
+ type testFixture struct {
+ input string
+ expected []result
+ }
+
+ fixtures := []testFixture{
+ {
+ "Simply closes: #29 yes",
+ []result{
+ {29, "", "", "29", XRefActionCloses, &RefSpan{Start: 15, End: 18}, &RefSpan{Start: 7, End: 13}},
+ },
+ },
+ {
+ "#123 no, this is a title.",
+ []result{},
+ },
+ {
+ " #124 yes, this is a reference.",
+ []result{
+ {124, "", "", "124", XRefActionNone, &RefSpan{Start: 0, End: 4}, nil},
+ },
+ },
+ {
+ "```\nThis is a code block.\n#723 no, it's a code block.```",
+ []result{},
+ },
+ {
+ "This `#724` no, it's inline code.",
+ []result{},
+ },
+ {
+ "This user3/repo4#200 yes.",
+ []result{
+ {200, "user3", "repo4", "200", XRefActionNone, &RefSpan{Start: 5, End: 20}, nil},
+ },
+ },
+ {
+ "This [one](#919) no, this is a URL fragment.",
+ []result{},
+ },
+ {
+ "This [two](/user2/repo1/issues/921) yes.",
+ []result{
+ {921, "user2", "repo1", "921", XRefActionNone, nil, nil},
+ },
+ },
+ {
+ "This [three](/user2/repo1/pulls/922) yes.",
+ []result{
+ {922, "user2", "repo1", "922", XRefActionNone, nil, nil},
+ },
+ },
+ {
+ "This [four](http://gitea.com:3000/user3/repo4/issues/203) yes.",
+ []result{
+ {203, "user3", "repo4", "203", XRefActionNone, nil, nil},
+ },
+ },
+ {
+ "This [five](http://github.com/user3/repo4/issues/204) no.",
+ []result{},
+ },
+ {
+ "This http://gitea.com:3000/user4/repo5/201 no, bad URL.",
+ []result{},
+ },
+ {
+ "This http://gitea.com:3000/user4/repo5/pulls/202 yes.",
+ []result{
+ {202, "user4", "repo5", "202", XRefActionNone, nil, nil},
+ },
+ },
+ {
+ "This http://GiTeA.COM:3000/user4/repo6/pulls/205 yes.",
+ []result{
+ {205, "user4", "repo6", "205", XRefActionNone, nil, nil},
+ },
+ },
+ {
+ "Reopens #15 yes",
+ []result{
+ {15, "", "", "15", XRefActionReopens, &RefSpan{Start: 8, End: 11}, &RefSpan{Start: 0, End: 7}},
+ },
+ },
+ {
+ "This closes #20 for you yes",
+ []result{
+ {20, "", "", "20", XRefActionCloses, &RefSpan{Start: 12, End: 15}, &RefSpan{Start: 5, End: 11}},
+ },
+ },
+ {
+ "Do you fix user6/repo6#300 ? yes",
+ []result{
+ {300, "user6", "repo6", "300", XRefActionCloses, &RefSpan{Start: 11, End: 26}, &RefSpan{Start: 7, End: 10}},
+ },
+ },
+ {
+ "For 999 #1235 no keyword, but yes",
+ []result{
+ {1235, "", "", "1235", XRefActionNone, &RefSpan{Start: 8, End: 13}, nil},
+ },
+ },
+ {
+ "Which abc. #9434 same as above",
+ []result{
+ {9434, "", "", "9434", XRefActionNone, &RefSpan{Start: 11, End: 16}, nil},
+ },
+ },
+ {
+ "This closes #600 and reopens #599",
+ []result{
+ {600, "", "", "600", XRefActionCloses, &RefSpan{Start: 12, End: 16}, &RefSpan{Start: 5, End: 11}},
+ {599, "", "", "599", XRefActionReopens, &RefSpan{Start: 29, End: 33}, &RefSpan{Start: 21, End: 28}},
+ },
+ },
+ }
+
+ // Save original value for other tests that may rely on it
+ prevURL := setting.AppURL
+ setting.AppURL = "https://gitea.com:3000/"
+
+ for _, fixture := range fixtures {
+ expraw := make([]*rawReference, len(fixture.expected))
+ for i, e := range fixture.expected {
+ expraw[i] = &rawReference{
+ index: e.Index,
+ owner: e.Owner,
+ name: e.Name,
+ action: e.Action,
+ issue: e.Issue,
+ refLocation: e.RefLocation,
+ actionLocation: e.ActionLocation,
+ }
+ }
+ expref := rawToIssueReferenceList(expraw)
+ refs := FindAllIssueReferencesMarkdown(fixture.input)
+ assert.EqualValues(t, expref, refs, "Failed to parse: {%s}", fixture.input)
+ rawrefs := findAllIssueReferencesMarkdown(fixture.input)
+ assert.EqualValues(t, expraw, rawrefs, "Failed to parse: {%s}", fixture.input)
+ }
+
+ // Restore for other tests that may rely on the original value
+ setting.AppURL = prevURL
+
+ type alnumFixture struct {
+ input string
+ issue string
+ refLocation *RefSpan
+ action XRefAction
+ actionLocation *RefSpan
+ }
+
+ alnumFixtures := []alnumFixture{
+ {
+ "This ref ABC-123 is alphanumeric",
+ "ABC-123", &RefSpan{Start: 9, End: 16},
+ XRefActionNone, nil,
+ },
+ {
+ "This closes ABCD-1234 alphanumeric",
+ "ABCD-1234", &RefSpan{Start: 12, End: 21},
+ XRefActionCloses, &RefSpan{Start: 5, End: 11},
+ },
+ }
+
+ for _, fixture := range alnumFixtures {
+ found, ref := FindRenderizableReferenceAlphanumeric(fixture.input)
+ if fixture.issue == "" {
+ assert.False(t, found, "Failed to parse: {%s}", fixture.input)
+ } else {
+ assert.True(t, found, "Failed to parse: {%s}", fixture.input)
+ assert.Equal(t, fixture.issue, ref.Issue, "Failed to parse: {%s}", fixture.input)
+ assert.Equal(t, fixture.refLocation, ref.RefLocation, "Failed to parse: {%s}", fixture.input)
+ assert.Equal(t, fixture.action, ref.Action, "Failed to parse: {%s}", fixture.input)
+ assert.Equal(t, fixture.actionLocation, ref.ActionLocation, "Failed to parse: {%s}", fixture.input)
+ }
+ }
+}
+
+func TestRegExp_mentionPattern(t *testing.T) {
+ trueTestCases := []string{
+ "@Unknwon",
+ "@ANT_123",
+ "@xxx-DiN0-z-A..uru..s-xxx",
+ " @lol ",
+ " @Te-st",
+ "(@gitea)",
+ "[@gitea]",
+ }
+ falseTestCases := []string{
+ "@ 0",
+ "@ ",
+ "@",
+ "",
+ "ABC",
+ "/home/gitea/@gitea",
+ "\"@gitea\"",
+ }
+
+ for _, testCase := range trueTestCases {
+ res := mentionPattern.MatchString(testCase)
+ assert.True(t, res)
+ }
+ for _, testCase := range falseTestCases {
+ res := mentionPattern.MatchString(testCase)
+ assert.False(t, res)
+ }
+}
+
+func TestRegExp_issueNumericPattern(t *testing.T) {
+ trueTestCases := []string{
+ "#1234",
+ "#0",
+ "#1234567890987654321",
+ " #12",
+ "#12:",
+ "ref: #12: msg",
+ }
+ falseTestCases := []string{
+ "# 1234",
+ "# 0",
+ "# ",
+ "#",
+ "#ABC",
+ "#1A2B",
+ "",
+ "ABC",
+ }
+
+ for _, testCase := range trueTestCases {
+ assert.True(t, issueNumericPattern.MatchString(testCase))
+ }
+ for _, testCase := range falseTestCases {
+ assert.False(t, issueNumericPattern.MatchString(testCase))
+ }
+}
+
+func TestRegExp_issueAlphanumericPattern(t *testing.T) {
+ trueTestCases := []string{
+ "ABC-1234",
+ "A-1",
+ "RC-80",
+ "ABCDEFGHIJ-1234567890987654321234567890",
+ "ABC-123.",
+ "(ABC-123)",
+ "[ABC-123]",
+ "ABC-123:",
+ }
+ falseTestCases := []string{
+ "RC-08",
+ "PR-0",
+ "ABCDEFGHIJK-1",
+ "PR_1",
+ "",
+ "#ABC",
+ "",
+ "ABC",
+ "GG-",
+ "rm-1",
+ "/home/gitea/ABC-1234",
+ "MY-STRING-ABC-123",
+ }
+
+ for _, testCase := range trueTestCases {
+ assert.True(t, issueAlphanumericPattern.MatchString(testCase))
+ }
+ for _, testCase := range falseTestCases {
+ assert.False(t, issueAlphanumericPattern.MatchString(testCase))
+ }
+}