code.gitea.io/gitea@v1.21.7/routers/web/repo/wiki_test.go (about) 1 // Copyright 2017 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package repo 5 6 import ( 7 "io" 8 "net/http" 9 "net/url" 10 "testing" 11 12 repo_model "code.gitea.io/gitea/models/repo" 13 "code.gitea.io/gitea/models/unittest" 14 "code.gitea.io/gitea/modules/contexttest" 15 "code.gitea.io/gitea/modules/git" 16 "code.gitea.io/gitea/modules/web" 17 "code.gitea.io/gitea/services/forms" 18 wiki_service "code.gitea.io/gitea/services/wiki" 19 20 "github.com/stretchr/testify/assert" 21 ) 22 23 const ( 24 content = "Wiki contents for unit tests" 25 message = "Wiki commit message for unit tests" 26 ) 27 28 func wikiEntry(t *testing.T, repo *repo_model.Repository, wikiName wiki_service.WebPath) *git.TreeEntry { 29 wikiRepo, err := git.OpenRepository(git.DefaultContext, repo.WikiPath()) 30 assert.NoError(t, err) 31 defer wikiRepo.Close() 32 commit, err := wikiRepo.GetBranchCommit("master") 33 assert.NoError(t, err) 34 entries, err := commit.ListEntries() 35 assert.NoError(t, err) 36 for _, entry := range entries { 37 if entry.Name() == wiki_service.WebPathToGitPath(wikiName) { 38 return entry 39 } 40 } 41 return nil 42 } 43 44 func wikiContent(t *testing.T, repo *repo_model.Repository, wikiName wiki_service.WebPath) string { 45 entry := wikiEntry(t, repo, wikiName) 46 if !assert.NotNil(t, entry) { 47 return "" 48 } 49 reader, err := entry.Blob().DataAsync() 50 assert.NoError(t, err) 51 defer reader.Close() 52 bytes, err := io.ReadAll(reader) 53 assert.NoError(t, err) 54 return string(bytes) 55 } 56 57 func assertWikiExists(t *testing.T, repo *repo_model.Repository, wikiName wiki_service.WebPath) { 58 assert.NotNil(t, wikiEntry(t, repo, wikiName)) 59 } 60 61 func assertWikiNotExists(t *testing.T, repo *repo_model.Repository, wikiName wiki_service.WebPath) { 62 assert.Nil(t, wikiEntry(t, repo, wikiName)) 63 } 64 65 func assertPagesMetas(t *testing.T, expectedNames []string, metas any) { 66 pageMetas, ok := metas.([]PageMeta) 67 if !assert.True(t, ok) { 68 return 69 } 70 if !assert.Len(t, pageMetas, len(expectedNames)) { 71 return 72 } 73 for i, pageMeta := range pageMetas { 74 assert.EqualValues(t, expectedNames[i], pageMeta.Name) 75 } 76 } 77 78 func TestWiki(t *testing.T) { 79 unittest.PrepareTestEnv(t) 80 81 ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/?action=_pages") 82 ctx.SetParams("*", "Home") 83 contexttest.LoadRepo(t, ctx, 1) 84 Wiki(ctx) 85 assert.EqualValues(t, http.StatusOK, ctx.Resp.Status()) 86 assert.EqualValues(t, "Home", ctx.Data["Title"]) 87 assertPagesMetas(t, []string{"Home", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"]) 88 } 89 90 func TestWikiPages(t *testing.T) { 91 unittest.PrepareTestEnv(t) 92 93 ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/?action=_pages") 94 contexttest.LoadRepo(t, ctx, 1) 95 WikiPages(ctx) 96 assert.EqualValues(t, http.StatusOK, ctx.Resp.Status()) 97 assertPagesMetas(t, []string{"Home", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"]) 98 } 99 100 func TestNewWiki(t *testing.T) { 101 unittest.PrepareTestEnv(t) 102 103 ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/?action=_new") 104 contexttest.LoadUser(t, ctx, 2) 105 contexttest.LoadRepo(t, ctx, 1) 106 NewWiki(ctx) 107 assert.EqualValues(t, http.StatusOK, ctx.Resp.Status()) 108 assert.EqualValues(t, ctx.Tr("repo.wiki.new_page"), ctx.Data["Title"]) 109 } 110 111 func TestNewWikiPost(t *testing.T) { 112 for _, title := range []string{ 113 "New page", 114 "&&&&", 115 } { 116 unittest.PrepareTestEnv(t) 117 118 ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/?action=_new") 119 contexttest.LoadUser(t, ctx, 2) 120 contexttest.LoadRepo(t, ctx, 1) 121 web.SetForm(ctx, &forms.NewWikiForm{ 122 Title: title, 123 Content: content, 124 Message: message, 125 }) 126 NewWikiPost(ctx) 127 assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status()) 128 assertWikiExists(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title)) 129 assert.Equal(t, wikiContent(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title)), content) 130 } 131 } 132 133 func TestNewWikiPost_ReservedName(t *testing.T) { 134 unittest.PrepareTestEnv(t) 135 136 ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/?action=_new") 137 contexttest.LoadUser(t, ctx, 2) 138 contexttest.LoadRepo(t, ctx, 1) 139 web.SetForm(ctx, &forms.NewWikiForm{ 140 Title: "_edit", 141 Content: content, 142 Message: message, 143 }) 144 NewWikiPost(ctx) 145 assert.EqualValues(t, http.StatusOK, ctx.Resp.Status()) 146 assert.EqualValues(t, ctx.Tr("repo.wiki.reserved_page"), ctx.Flash.ErrorMsg) 147 assertWikiNotExists(t, ctx.Repo.Repository, "_edit") 148 } 149 150 func TestEditWiki(t *testing.T) { 151 unittest.PrepareTestEnv(t) 152 153 ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/Home?action=_edit") 154 ctx.SetParams("*", "Home") 155 contexttest.LoadUser(t, ctx, 2) 156 contexttest.LoadRepo(t, ctx, 1) 157 EditWiki(ctx) 158 assert.EqualValues(t, http.StatusOK, ctx.Resp.Status()) 159 assert.EqualValues(t, "Home", ctx.Data["Title"]) 160 assert.Equal(t, wikiContent(t, ctx.Repo.Repository, "Home"), ctx.Data["content"]) 161 } 162 163 func TestEditWikiPost(t *testing.T) { 164 for _, title := range []string{ 165 "Home", 166 "New/<page>", 167 } { 168 unittest.PrepareTestEnv(t) 169 ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/Home?action=_new") 170 ctx.SetParams("*", "Home") 171 contexttest.LoadUser(t, ctx, 2) 172 contexttest.LoadRepo(t, ctx, 1) 173 web.SetForm(ctx, &forms.NewWikiForm{ 174 Title: title, 175 Content: content, 176 Message: message, 177 }) 178 EditWikiPost(ctx) 179 assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status()) 180 assertWikiExists(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title)) 181 assert.Equal(t, wikiContent(t, ctx.Repo.Repository, wiki_service.UserTitleToWebPath("", title)), content) 182 if title != "Home" { 183 assertWikiNotExists(t, ctx.Repo.Repository, "Home") 184 } 185 } 186 } 187 188 func TestDeleteWikiPagePost(t *testing.T) { 189 unittest.PrepareTestEnv(t) 190 191 ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/Home?action=_delete") 192 contexttest.LoadUser(t, ctx, 2) 193 contexttest.LoadRepo(t, ctx, 1) 194 DeleteWikiPagePost(ctx) 195 assert.EqualValues(t, http.StatusOK, ctx.Resp.Status()) 196 assertWikiNotExists(t, ctx.Repo.Repository, "Home") 197 } 198 199 func TestWikiRaw(t *testing.T) { 200 for filepath, filetype := range map[string]string{ 201 "jpeg.jpg": "image/jpeg", 202 "images/jpeg.jpg": "image/jpeg", 203 "Page With Spaced Name": "text/plain; charset=utf-8", 204 "Page-With-Spaced-Name": "text/plain; charset=utf-8", 205 "Page With Spaced Name.md": "", // there is no "Page With Spaced Name.md" in repo 206 "Page-With-Spaced-Name.md": "text/plain; charset=utf-8", 207 } { 208 unittest.PrepareTestEnv(t) 209 210 ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/raw/"+url.PathEscape(filepath)) 211 ctx.SetParams("*", filepath) 212 contexttest.LoadUser(t, ctx, 2) 213 contexttest.LoadRepo(t, ctx, 1) 214 WikiRaw(ctx) 215 if filetype == "" { 216 assert.EqualValues(t, http.StatusNotFound, ctx.Resp.Status(), "filepath: %s", filepath) 217 } else { 218 assert.EqualValues(t, http.StatusOK, ctx.Resp.Status(), "filepath: %s", filepath) 219 assert.EqualValues(t, filetype, ctx.Resp.Header().Get("Content-Type"), "filepath: %s", filepath) 220 } 221 } 222 }