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 7.5KB

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