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.

wiki_test.go 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package wiki
  5. import (
  6. "os"
  7. "path/filepath"
  8. "testing"
  9. "code.gitea.io/gitea/models"
  10. repo_model "code.gitea.io/gitea/models/repo"
  11. "code.gitea.io/gitea/models/unittest"
  12. user_model "code.gitea.io/gitea/models/user"
  13. "code.gitea.io/gitea/modules/git"
  14. "code.gitea.io/gitea/modules/util"
  15. "github.com/stretchr/testify/assert"
  16. )
  17. func TestMain(m *testing.M) {
  18. unittest.MainTest(m, &unittest.TestOptions{
  19. GiteaRootPath: filepath.Join("..", ".."),
  20. })
  21. }
  22. func TestWikiNameToSubURL(t *testing.T) {
  23. type test struct {
  24. Expected string
  25. WikiName string
  26. }
  27. for _, test := range []test{
  28. {"wiki-name", "wiki name"},
  29. {"wiki-name", "wiki-name"},
  30. {"name-with%2Fslash", "name with/slash"},
  31. {"name-with%25percent", "name with%percent"},
  32. } {
  33. assert.Equal(t, test.Expected, NameToSubURL(test.WikiName))
  34. }
  35. }
  36. func TestNormalizeWikiName(t *testing.T) {
  37. type test struct {
  38. Expected string
  39. WikiName string
  40. }
  41. for _, test := range []test{
  42. {"wiki name", "wiki name"},
  43. {"wiki name", "wiki-name"},
  44. {"name with/slash", "name with/slash"},
  45. {"name with%percent", "name-with%percent"},
  46. {"%2F", "%2F"},
  47. } {
  48. assert.Equal(t, test.Expected, NormalizeWikiName(test.WikiName))
  49. }
  50. }
  51. func TestWikiNameToFilename(t *testing.T) {
  52. type test struct {
  53. Expected string
  54. WikiName string
  55. }
  56. for _, test := range []test{
  57. {"wiki-name.md", "wiki name"},
  58. {"wiki-name.md", "wiki-name"},
  59. {"name-with%2Fslash.md", "name with/slash"},
  60. {"name-with%25percent.md", "name with%percent"},
  61. } {
  62. assert.Equal(t, test.Expected, NameToFilename(test.WikiName))
  63. }
  64. }
  65. func TestWikiFilenameToName(t *testing.T) {
  66. type test struct {
  67. Expected string
  68. Filename string
  69. }
  70. for _, test := range []test{
  71. {"hello world", "hello-world.md"},
  72. {"symbols/?*", "symbols%2F%3F%2A.md"},
  73. } {
  74. name, err := FilenameToName(test.Filename)
  75. assert.NoError(t, err)
  76. assert.Equal(t, test.Expected, name)
  77. }
  78. for _, badFilename := range []string{
  79. "nofileextension",
  80. "wrongfileextension.txt",
  81. } {
  82. _, err := FilenameToName(badFilename)
  83. assert.Error(t, err)
  84. assert.True(t, models.IsErrWikiInvalidFileName(err))
  85. }
  86. _, err := FilenameToName("badescaping%%.md")
  87. assert.Error(t, err)
  88. assert.False(t, models.IsErrWikiInvalidFileName(err))
  89. }
  90. func TestWikiNameToFilenameToName(t *testing.T) {
  91. // converting from wiki name to filename, then back to wiki name should
  92. // return the original (normalized) name
  93. for _, name := range []string{
  94. "wiki-name",
  95. "wiki name",
  96. "wiki name with/slash",
  97. "$$$%%%^^&&!@#$(),.<>",
  98. } {
  99. filename := NameToFilename(name)
  100. resultName, err := FilenameToName(filename)
  101. assert.NoError(t, err)
  102. assert.Equal(t, NormalizeWikiName(name), resultName)
  103. }
  104. }
  105. func TestRepository_InitWiki(t *testing.T) {
  106. unittest.PrepareTestEnv(t)
  107. // repo1 already has a wiki
  108. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}).(*repo_model.Repository)
  109. assert.NoError(t, InitWiki(git.DefaultContext, repo1))
  110. // repo2 does not already have a wiki
  111. repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}).(*repo_model.Repository)
  112. assert.NoError(t, InitWiki(git.DefaultContext, repo2))
  113. assert.True(t, repo2.HasWiki())
  114. }
  115. func TestRepository_AddWikiPage(t *testing.T) {
  116. assert.NoError(t, unittest.PrepareTestDatabase())
  117. const wikiContent = "This is the wiki content"
  118. const commitMsg = "Commit message"
  119. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}).(*repo_model.Repository)
  120. doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  121. for _, wikiName := range []string{
  122. "Another page",
  123. "Here's a <tag> and a/slash",
  124. } {
  125. wikiName := wikiName
  126. t.Run("test wiki exist: "+wikiName, func(t *testing.T) {
  127. t.Parallel()
  128. assert.NoError(t, AddWikiPage(git.DefaultContext, doer, repo, wikiName, wikiContent, commitMsg))
  129. // Now need to show that the page has been added:
  130. gitRepo, err := git.OpenRepository(git.DefaultContext, repo.WikiPath())
  131. assert.NoError(t, err)
  132. defer gitRepo.Close()
  133. masterTree, err := gitRepo.GetTree("master")
  134. assert.NoError(t, err)
  135. wikiPath := NameToFilename(wikiName)
  136. entry, err := masterTree.GetTreeEntryByPath(wikiPath)
  137. assert.NoError(t, err)
  138. assert.Equal(t, wikiPath, entry.Name(), "%s not added correctly", wikiName)
  139. })
  140. }
  141. t.Run("check wiki already exist", func(t *testing.T) {
  142. t.Parallel()
  143. // test for already-existing wiki name
  144. err := AddWikiPage(git.DefaultContext, doer, repo, "Home", wikiContent, commitMsg)
  145. assert.Error(t, err)
  146. assert.True(t, models.IsErrWikiAlreadyExist(err))
  147. })
  148. t.Run("check wiki reserved name", func(t *testing.T) {
  149. t.Parallel()
  150. // test for reserved wiki name
  151. err := AddWikiPage(git.DefaultContext, doer, repo, "_edit", wikiContent, commitMsg)
  152. assert.Error(t, err)
  153. assert.True(t, models.IsErrWikiReservedName(err))
  154. })
  155. }
  156. func TestRepository_EditWikiPage(t *testing.T) {
  157. assert.NoError(t, unittest.PrepareTestDatabase())
  158. const newWikiContent = "This is the new content"
  159. const commitMsg = "Commit message"
  160. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}).(*repo_model.Repository)
  161. doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  162. for _, newWikiName := range []string{
  163. "Home", // same name as before
  164. "New home",
  165. "New/name/with/slashes",
  166. } {
  167. unittest.PrepareTestEnv(t)
  168. assert.NoError(t, EditWikiPage(git.DefaultContext, doer, repo, "Home", newWikiName, newWikiContent, commitMsg))
  169. // Now need to show that the page has been added:
  170. gitRepo, err := git.OpenRepository(git.DefaultContext, repo.WikiPath())
  171. assert.NoError(t, err)
  172. masterTree, err := gitRepo.GetTree("master")
  173. assert.NoError(t, err)
  174. wikiPath := NameToFilename(newWikiName)
  175. entry, err := masterTree.GetTreeEntryByPath(wikiPath)
  176. assert.NoError(t, err)
  177. assert.Equal(t, wikiPath, entry.Name(), "%s not edited correctly", newWikiName)
  178. if newWikiName != "Home" {
  179. _, err := masterTree.GetTreeEntryByPath("Home.md")
  180. assert.Error(t, err)
  181. }
  182. gitRepo.Close()
  183. }
  184. }
  185. func TestRepository_DeleteWikiPage(t *testing.T) {
  186. unittest.PrepareTestEnv(t)
  187. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}).(*repo_model.Repository)
  188. doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  189. assert.NoError(t, DeleteWikiPage(git.DefaultContext, doer, repo, "Home"))
  190. // Now need to show that the page has been added:
  191. gitRepo, err := git.OpenRepository(git.DefaultContext, repo.WikiPath())
  192. assert.NoError(t, err)
  193. defer gitRepo.Close()
  194. masterTree, err := gitRepo.GetTree("master")
  195. assert.NoError(t, err)
  196. wikiPath := NameToFilename("Home")
  197. _, err = masterTree.GetTreeEntryByPath(wikiPath)
  198. assert.Error(t, err)
  199. }
  200. func TestPrepareWikiFileName(t *testing.T) {
  201. unittest.PrepareTestEnv(t)
  202. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}).(*repo_model.Repository)
  203. gitRepo, err := git.OpenRepository(git.DefaultContext, repo.WikiPath())
  204. defer gitRepo.Close()
  205. assert.NoError(t, err)
  206. tests := []struct {
  207. name string
  208. arg string
  209. existence bool
  210. wikiPath string
  211. wantErr bool
  212. }{{
  213. name: "add suffix",
  214. arg: "Home",
  215. existence: true,
  216. wikiPath: "Home.md",
  217. wantErr: false,
  218. }, {
  219. name: "test special chars",
  220. arg: "home of and & or wiki page!",
  221. existence: false,
  222. wikiPath: "home-of-and-%26-or-wiki-page%21.md",
  223. wantErr: false,
  224. }, {
  225. name: "found unescaped cases",
  226. arg: "Unescaped File",
  227. existence: true,
  228. wikiPath: "Unescaped File.md",
  229. wantErr: false,
  230. }}
  231. for _, tt := range tests {
  232. t.Run(tt.name, func(t *testing.T) {
  233. existence, newWikiPath, err := prepareWikiFileName(gitRepo, tt.arg)
  234. if (err != nil) != tt.wantErr {
  235. assert.NoError(t, err)
  236. return
  237. }
  238. if existence != tt.existence {
  239. if existence {
  240. t.Errorf("expect to find no escaped file but we detect one")
  241. } else {
  242. t.Errorf("expect to find an escaped file but we could not detect one")
  243. }
  244. }
  245. assert.Equal(t, tt.wikiPath, newWikiPath)
  246. })
  247. }
  248. }
  249. func TestPrepareWikiFileName_FirstPage(t *testing.T) {
  250. unittest.PrepareTestEnv(t)
  251. // Now create a temporaryDirectory
  252. tmpDir, err := os.MkdirTemp("", "empty-wiki")
  253. assert.NoError(t, err)
  254. defer func() {
  255. if _, err := os.Stat(tmpDir); !os.IsNotExist(err) {
  256. _ = util.RemoveAll(tmpDir)
  257. }
  258. }()
  259. err = git.InitRepository(git.DefaultContext, tmpDir, true)
  260. assert.NoError(t, err)
  261. gitRepo, err := git.OpenRepository(git.DefaultContext, tmpDir)
  262. defer gitRepo.Close()
  263. assert.NoError(t, err)
  264. existence, newWikiPath, err := prepareWikiFileName(gitRepo, "Home")
  265. assert.False(t, existence)
  266. assert.NoError(t, err)
  267. assert.Equal(t, "Home.md", newWikiPath)
  268. }