mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 19:06:18 +01:00 
			
		
		
		
	* fix typo * Migrate reviews when migrating repository from github * fix lint * Added test and migration when external user login * fix test * fix commented state * Some improvements * fix bug when get pull request and ref original author on code comments * Fix migrated line; Added comment for review * Don't load all pull requests attributes * Fix typo * wrong change copy head * fix tests * fix reactions * Fix test * fix fmt * fix review comment reactions
		
			
				
	
	
		
			220 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			220 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2014 The Gogs Authors. All rights reserved.
 | |
| // 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 gitdiff
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"html/template"
 | |
| 	"strings"
 | |
| 	"testing"
 | |
| 
 | |
| 	"code.gitea.io/gitea/models"
 | |
| 	"code.gitea.io/gitea/modules/git"
 | |
| 	"code.gitea.io/gitea/modules/setting"
 | |
| 
 | |
| 	dmp "github.com/sergi/go-diff/diffmatchpatch"
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| )
 | |
| 
 | |
| func assertEqual(t *testing.T, s1 string, s2 template.HTML) {
 | |
| 	if s1 != string(s2) {
 | |
| 		t.Errorf("%s should be equal %s", s2, s1)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestDiffToHTML(t *testing.T) {
 | |
| 	assertEqual(t, "foo <span class=\"added-code\">bar</span> biz", diffToHTML([]dmp.Diff{
 | |
| 		{Type: dmp.DiffEqual, Text: "foo "},
 | |
| 		{Type: dmp.DiffInsert, Text: "bar"},
 | |
| 		{Type: dmp.DiffDelete, Text: " baz"},
 | |
| 		{Type: dmp.DiffEqual, Text: " biz"},
 | |
| 	}, DiffLineAdd))
 | |
| 
 | |
| 	assertEqual(t, "foo <span class=\"removed-code\">bar</span> biz", diffToHTML([]dmp.Diff{
 | |
| 		{Type: dmp.DiffEqual, Text: "foo "},
 | |
| 		{Type: dmp.DiffDelete, Text: "bar"},
 | |
| 		{Type: dmp.DiffInsert, Text: " baz"},
 | |
| 		{Type: dmp.DiffEqual, Text: " biz"},
 | |
| 	}, DiffLineDel))
 | |
| }
 | |
| 
 | |
| const exampleDiff = `diff --git a/README.md b/README.md
 | |
| --- a/README.md
 | |
| +++ b/README.md
 | |
| @@ -1,3 +1,6 @@
 | |
|  # gitea-github-migrator
 | |
| +
 | |
| + Build Status
 | |
| - Latest Release
 | |
|  Docker Pulls
 | |
| + cut off
 | |
| + cut off`
 | |
| 
 | |
| func TestCutDiffAroundLine(t *testing.T) {
 | |
| 	result := CutDiffAroundLine(strings.NewReader(exampleDiff), 4, false, 3)
 | |
| 	resultByLine := strings.Split(result, "\n")
 | |
| 	assert.Len(t, resultByLine, 7)
 | |
| 	// Check if headers got transferred
 | |
| 	assert.Equal(t, "diff --git a/README.md b/README.md", resultByLine[0])
 | |
| 	assert.Equal(t, "--- a/README.md", resultByLine[1])
 | |
| 	assert.Equal(t, "+++ b/README.md", resultByLine[2])
 | |
| 	// Check if hunk header is calculated correctly
 | |
| 	assert.Equal(t, "@@ -2,2 +3,2 @@", resultByLine[3])
 | |
| 	// Check if line got transferred
 | |
| 	assert.Equal(t, "+ Build Status", resultByLine[4])
 | |
| 
 | |
| 	// Must be same result as before since old line 3 == new line 5
 | |
| 	newResult := CutDiffAroundLine(strings.NewReader(exampleDiff), 3, true, 3)
 | |
| 	assert.Equal(t, result, newResult, "Must be same result as before since old line 3 == new line 5")
 | |
| 
 | |
| 	newResult = CutDiffAroundLine(strings.NewReader(exampleDiff), 6, false, 300)
 | |
| 	assert.Equal(t, exampleDiff, newResult)
 | |
| 
 | |
| 	emptyResult := CutDiffAroundLine(strings.NewReader(exampleDiff), 6, false, 0)
 | |
| 	assert.Empty(t, emptyResult)
 | |
| 
 | |
| 	// Line is out of scope
 | |
| 	emptyResult = CutDiffAroundLine(strings.NewReader(exampleDiff), 434, false, 0)
 | |
| 	assert.Empty(t, emptyResult)
 | |
| }
 | |
| 
 | |
| func BenchmarkCutDiffAroundLine(b *testing.B) {
 | |
| 	for n := 0; n < b.N; n++ {
 | |
| 		CutDiffAroundLine(strings.NewReader(exampleDiff), 3, true, 3)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func ExampleCutDiffAroundLine() {
 | |
| 	const diff = `diff --git a/README.md b/README.md
 | |
| --- a/README.md
 | |
| +++ b/README.md
 | |
| @@ -1,3 +1,6 @@
 | |
|  # gitea-github-migrator
 | |
| +
 | |
| + Build Status
 | |
| - Latest Release
 | |
|  Docker Pulls
 | |
| + cut off
 | |
| + cut off`
 | |
| 	result := CutDiffAroundLine(strings.NewReader(diff), 4, false, 3)
 | |
| 	println(result)
 | |
| }
 | |
| 
 | |
| func TestParsePatch(t *testing.T) {
 | |
| 	var diff = `diff --git "a/README.md" "b/README.md"
 | |
| --- a/README.md
 | |
| +++ b/README.md
 | |
| @@ -1,3 +1,6 @@
 | |
|  # gitea-github-migrator
 | |
| +
 | |
| + Build Status
 | |
| - Latest Release
 | |
|  Docker Pulls
 | |
| + cut off
 | |
| + cut off`
 | |
| 	result, err := ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, strings.NewReader(diff))
 | |
| 	if err != nil {
 | |
| 		t.Errorf("ParsePatch failed: %s", err)
 | |
| 	}
 | |
| 	println(result)
 | |
| 
 | |
| 	var diff2 = `diff --git "a/A \\ B" "b/A \\ B"
 | |
| --- "a/A \\ B"
 | |
| +++ "b/A \\ B"
 | |
| @@ -1,3 +1,6 @@
 | |
|  # gitea-github-migrator
 | |
| +
 | |
| + Build Status
 | |
| - Latest Release
 | |
|  Docker Pulls
 | |
| + cut off
 | |
| + cut off`
 | |
| 	result, err = ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, strings.NewReader(diff2))
 | |
| 	if err != nil {
 | |
| 		t.Errorf("ParsePatch failed: %s", err)
 | |
| 	}
 | |
| 	println(result)
 | |
| 
 | |
| 	var diff3 = `diff --git a/README.md b/README.md
 | |
| --- a/README.md
 | |
| +++ b/README.md
 | |
| @@ -1,3 +1,6 @@
 | |
|  # gitea-github-migrator
 | |
| +
 | |
| + Build Status
 | |
| - Latest Release
 | |
|  Docker Pulls
 | |
| + cut off
 | |
| + cut off`
 | |
| 	result, err = ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, strings.NewReader(diff3))
 | |
| 	if err != nil {
 | |
| 		t.Errorf("ParsePatch failed: %s", err)
 | |
| 	}
 | |
| 	println(result)
 | |
| }
 | |
| 
 | |
| func setupDefaultDiff() *Diff {
 | |
| 	return &Diff{
 | |
| 		Files: []*DiffFile{
 | |
| 			{
 | |
| 				Name: "README.md",
 | |
| 				Sections: []*DiffSection{
 | |
| 					{
 | |
| 						Lines: []*DiffLine{
 | |
| 							{
 | |
| 								LeftIdx:  4,
 | |
| 								RightIdx: 4,
 | |
| 							},
 | |
| 						},
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| func TestDiff_LoadComments(t *testing.T) {
 | |
| 	assert.NoError(t, models.PrepareTestDatabase())
 | |
| 
 | |
| 	issue := models.AssertExistsAndLoadBean(t, &models.Issue{ID: 2}).(*models.Issue)
 | |
| 	user := models.AssertExistsAndLoadBean(t, &models.User{ID: 1}).(*models.User)
 | |
| 	diff := setupDefaultDiff()
 | |
| 	assert.NoError(t, diff.LoadComments(issue, user))
 | |
| 	assert.Len(t, diff.Files[0].Sections[0].Lines[0].Comments, 2)
 | |
| }
 | |
| 
 | |
| func TestDiffLine_CanComment(t *testing.T) {
 | |
| 	assert.False(t, (&DiffLine{Type: DiffLineSection}).CanComment())
 | |
| 	assert.False(t, (&DiffLine{Type: DiffLineAdd, Comments: []*models.Comment{{Content: "bla"}}}).CanComment())
 | |
| 	assert.True(t, (&DiffLine{Type: DiffLineAdd}).CanComment())
 | |
| 	assert.True(t, (&DiffLine{Type: DiffLineDel}).CanComment())
 | |
| 	assert.True(t, (&DiffLine{Type: DiffLinePlain}).CanComment())
 | |
| }
 | |
| 
 | |
| func TestDiffLine_GetCommentSide(t *testing.T) {
 | |
| 	assert.Equal(t, "previous", (&DiffLine{Comments: []*models.Comment{{Line: -3}}}).GetCommentSide())
 | |
| 	assert.Equal(t, "proposed", (&DiffLine{Comments: []*models.Comment{{Line: 3}}}).GetCommentSide())
 | |
| }
 | |
| 
 | |
| func TestGetDiffRangeWithWhitespaceBehavior(t *testing.T) {
 | |
| 	git.Debug = true
 | |
| 	for _, behavior := range []string{"-w", "--ignore-space-at-eol", "-b", ""} {
 | |
| 		diffs, err := GetDiffRangeWithWhitespaceBehavior("./testdata/academic-module", "559c156f8e0178b71cb44355428f24001b08fc68", "bd7063cc7c04689c4d082183d32a604ed27a24f9",
 | |
| 			setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffFiles, behavior)
 | |
| 		assert.NoError(t, err, fmt.Sprintf("Error when diff with %s", behavior))
 | |
| 		for _, f := range diffs.Files {
 | |
| 			assert.True(t, len(f.Sections) > 0, fmt.Sprintf("%s should have sections", f.Name))
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestParseDiffHunkString(t *testing.T) {
 | |
| 	leftLine, leftHunk, rightLine, rightHunk := ParseDiffHunkString("@@ -19,3 +19,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER")
 | |
| 	assert.EqualValues(t, 19, leftLine)
 | |
| 	assert.EqualValues(t, 3, leftHunk)
 | |
| 	assert.EqualValues(t, 19, rightLine)
 | |
| 	assert.EqualValues(t, 5, rightHunk)
 | |
| }
 |