Skip to content

Commit ab50a41

Browse files
6543zeripath
authored andcommitted
Add TestPrepareWikiFileName (go-gitea#16487)
* Add TestPrepareWikiFileName * use LsTree as LsFiles is index only * ajust other tests Co-authored-by: Andrew Thornton <[email protected]>
1 parent 207fb61 commit ab50a41

File tree

7 files changed

+76
-4
lines changed

7 files changed

+76
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
423313fbd38093bb10d0c8387db9105409c6f196
1+
0dca5bd9b5d7ef937710e056f575e86c0184ba85

modules/git/tree.go

+21
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package git
77

88
import (
9+
"bytes"
910
"strings"
1011
)
1112

@@ -45,3 +46,23 @@ func (t *Tree) SubTree(rpath string) (*Tree, error) {
4546
}
4647
return g, nil
4748
}
49+
50+
// LsTree checks if the given filenames are in the tree
51+
func (repo *Repository) LsTree(ref string, filenames ...string) ([]string, error) {
52+
cmd := NewCommand("ls-tree", "-z", "--name-only", "--", ref)
53+
for _, arg := range filenames {
54+
if arg != "" {
55+
cmd.AddArguments(arg)
56+
}
57+
}
58+
res, err := cmd.RunInDirBytes(repo.Path)
59+
if err != nil {
60+
return nil, err
61+
}
62+
filelist := make([]string, 0, len(filenames))
63+
for _, line := range bytes.Split(res, []byte{'\000'}) {
64+
filelist = append(filelist, string(line))
65+
}
66+
67+
return filelist, err
68+
}

routers/web/repo/wiki_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func TestWiki(t *testing.T) {
8181
Wiki(ctx)
8282
assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
8383
assert.EqualValues(t, "Home", ctx.Data["Title"])
84-
assertPagesMetas(t, []string{"Home", "Page With Image", "Page With Spaced Name"}, ctx.Data["Pages"])
84+
assertPagesMetas(t, []string{"Home", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"])
8585
}
8686

8787
func TestWikiPages(t *testing.T) {
@@ -91,7 +91,7 @@ func TestWikiPages(t *testing.T) {
9191
test.LoadRepo(t, ctx, 1)
9292
WikiPages(ctx)
9393
assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
94-
assertPagesMetas(t, []string{"Home", "Page With Image", "Page With Spaced Name"}, ctx.Data["Pages"])
94+
assertPagesMetas(t, []string{"Home", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"])
9595
}
9696

9797
func TestNewWiki(t *testing.T) {

services/wiki/wiki.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func prepareWikiFileName(gitRepo *git.Repository, wikiName string) (bool, string
8888
escaped := NameToFilename(wikiName)
8989

9090
// Look for both files
91-
filesInIndex, err := gitRepo.LsFiles(unescaped, escaped)
91+
filesInIndex, err := gitRepo.LsTree("master", unescaped, escaped)
9292
if err != nil {
9393
log.Error("%v", err)
9494
return false, escaped, err

services/wiki/wiki_test.go

+51
Original file line numberDiff line numberDiff line change
@@ -210,3 +210,54 @@ func TestRepository_DeleteWikiPage(t *testing.T) {
210210
_, err = masterTree.GetTreeEntryByPath(wikiPath)
211211
assert.Error(t, err)
212212
}
213+
214+
func TestPrepareWikiFileName(t *testing.T) {
215+
models.PrepareTestEnv(t)
216+
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
217+
gitRepo, err := git.OpenRepository(repo.WikiPath())
218+
defer gitRepo.Close()
219+
assert.NoError(t, err)
220+
221+
tests := []struct {
222+
name string
223+
arg string
224+
existence bool
225+
wikiPath string
226+
wantErr bool
227+
}{{
228+
name: "add suffix",
229+
arg: "Home",
230+
existence: true,
231+
wikiPath: "Home.md",
232+
wantErr: false,
233+
}, {
234+
name: "test special chars",
235+
arg: "home of and & or wiki page!",
236+
existence: false,
237+
wikiPath: "home-of-and-%26-or-wiki-page%21.md",
238+
wantErr: false,
239+
}, {
240+
name: "fount unescaped cases",
241+
arg: "Unescaped File",
242+
existence: true,
243+
wikiPath: "Unescaped File.md",
244+
wantErr: false,
245+
}}
246+
for _, tt := range tests {
247+
t.Run(tt.name, func(t *testing.T) {
248+
existence, newWikiPath, err := prepareWikiFileName(gitRepo, tt.arg)
249+
if (err != nil) != tt.wantErr {
250+
assert.NoError(t, err)
251+
return
252+
}
253+
if existence != tt.existence {
254+
if existence {
255+
t.Errorf("expect to find no escaped file but we detect one")
256+
} else {
257+
t.Errorf("expect to find an escaped file but we could not detect one")
258+
}
259+
}
260+
assert.Equal(t, tt.wikiPath, newWikiPath)
261+
})
262+
}
263+
}

0 commit comments

Comments
 (0)