gitea源码

path_test.go 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package util
  4. import (
  5. "net/url"
  6. "os"
  7. "runtime"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/stretchr/testify/require"
  11. )
  12. func TestFileURLToPath(t *testing.T) {
  13. cases := []struct {
  14. url string
  15. expected string
  16. haserror bool
  17. windows bool
  18. }{
  19. // case 0
  20. {
  21. url: "",
  22. haserror: true,
  23. },
  24. // case 1
  25. {
  26. url: "http://test.io",
  27. haserror: true,
  28. },
  29. // case 2
  30. {
  31. url: "file:///path",
  32. expected: "/path",
  33. },
  34. // case 3
  35. {
  36. url: "file:///C:/path",
  37. expected: "C:/path",
  38. windows: true,
  39. },
  40. }
  41. for n, c := range cases {
  42. if c.windows && runtime.GOOS != "windows" {
  43. continue
  44. }
  45. u, _ := url.Parse(c.url)
  46. p, err := FileURLToPath(u)
  47. if c.haserror {
  48. assert.Error(t, err, "case %d: should return error", n)
  49. } else {
  50. assert.NoError(t, err, "case %d: should not return error", n)
  51. assert.Equal(t, c.expected, p, "case %d: should be equal", n)
  52. }
  53. }
  54. }
  55. func TestMisc_IsReadmeFileName(t *testing.T) {
  56. trueTestCases := []string{
  57. "readme",
  58. "README",
  59. "readME.mdown",
  60. "README.md",
  61. "readme.i18n.md",
  62. }
  63. falseTestCases := []string{
  64. "test.md",
  65. "wow.MARKDOWN",
  66. "LOL.mDoWn",
  67. "test",
  68. "abcdefg",
  69. "abcdefghijklmnopqrstuvwxyz",
  70. "test.md.test",
  71. "readmf",
  72. }
  73. for _, testCase := range trueTestCases {
  74. assert.True(t, IsReadmeFileName(testCase))
  75. }
  76. for _, testCase := range falseTestCases {
  77. assert.False(t, IsReadmeFileName(testCase))
  78. }
  79. type extensionTestcase struct {
  80. name string
  81. expected bool
  82. idx int
  83. }
  84. exts := []string{".md", ".txt", ""}
  85. testCasesExtensions := []extensionTestcase{
  86. {
  87. name: "readme",
  88. expected: true,
  89. idx: 2,
  90. },
  91. {
  92. name: "readme.md",
  93. expected: true,
  94. idx: 0,
  95. },
  96. {
  97. name: "README.md",
  98. expected: true,
  99. idx: 0,
  100. },
  101. {
  102. name: "ReAdMe.Md",
  103. expected: true,
  104. idx: 0,
  105. },
  106. {
  107. name: "readme.txt",
  108. expected: true,
  109. idx: 1,
  110. },
  111. {
  112. name: "readme.doc",
  113. expected: true,
  114. idx: 3,
  115. },
  116. {
  117. name: "readmee.md",
  118. },
  119. {
  120. name: "readme..",
  121. expected: true,
  122. idx: 3,
  123. },
  124. }
  125. for _, testCase := range testCasesExtensions {
  126. idx, ok := IsReadmeFileExtension(testCase.name, exts...)
  127. assert.Equal(t, testCase.expected, ok)
  128. assert.Equal(t, testCase.idx, idx)
  129. }
  130. }
  131. func TestCleanPath(t *testing.T) {
  132. cases := []struct {
  133. elems []string
  134. expected string
  135. }{
  136. {[]string{}, ``},
  137. {[]string{``}, ``},
  138. {[]string{`..`}, `.`},
  139. {[]string{`a`}, `a`},
  140. {[]string{`/a/`}, `a`},
  141. {[]string{`../a/`, `../b`, `c/..`, `d`}, `a/b/d`},
  142. {[]string{`a\..\b`}, `a\..\b`},
  143. {[]string{`a`, ``, `b`}, `a/b`},
  144. {[]string{`a`, `..`, `b`}, `a/b`},
  145. {[]string{`lfs`, `repo/..`, `user/../path`}, `lfs/path`},
  146. }
  147. for _, c := range cases {
  148. assert.Equal(t, c.expected, PathJoinRel(c.elems...), "case: %v", c.elems)
  149. }
  150. cases = []struct {
  151. elems []string
  152. expected string
  153. }{
  154. {[]string{}, ``},
  155. {[]string{``}, ``},
  156. {[]string{`..`}, `.`},
  157. {[]string{`a`}, `a`},
  158. {[]string{`/a/`}, `a`},
  159. {[]string{`../a/`, `../b`, `c/..`, `d`}, `a/b/d`},
  160. {[]string{`a\..\b`}, `b`},
  161. {[]string{`a`, ``, `b`}, `a/b`},
  162. {[]string{`a`, `..`, `b`}, `a/b`},
  163. {[]string{`lfs`, `repo/..`, `user/../path`}, `lfs/path`},
  164. }
  165. for _, c := range cases {
  166. assert.Equal(t, c.expected, PathJoinRelX(c.elems...), "case: %v", c.elems)
  167. }
  168. // for POSIX only, but the result is similar on Windows, because the first element must be an absolute path
  169. if isOSWindows() {
  170. cases = []struct {
  171. elems []string
  172. expected string
  173. }{
  174. {[]string{`C:\..`}, `C:\`},
  175. {[]string{`C:\a`}, `C:\a`},
  176. {[]string{`C:\a/`}, `C:\a`},
  177. {[]string{`C:\..\a\`, `../b`, `c\..`, `d`}, `C:\a\b\d`},
  178. {[]string{`C:\a/..\b`}, `C:\b`},
  179. {[]string{`C:\a`, ``, `b`}, `C:\a\b`},
  180. {[]string{`C:\a`, `..`, `b`}, `C:\a\b`},
  181. {[]string{`C:\lfs`, `repo/..`, `user/../path`}, `C:\lfs\path`},
  182. }
  183. } else {
  184. cases = []struct {
  185. elems []string
  186. expected string
  187. }{
  188. {[]string{`/..`}, `/`},
  189. {[]string{`/a`}, `/a`},
  190. {[]string{`/a/`}, `/a`},
  191. {[]string{`/../a/`, `../b`, `c/..`, `d`}, `/a/b/d`},
  192. {[]string{`/a\..\b`}, `/b`},
  193. {[]string{`/a`, ``, `b`}, `/a/b`},
  194. {[]string{`/a`, `..`, `b`}, `/a/b`},
  195. {[]string{`/lfs`, `repo/..`, `user/../path`}, `/lfs/path`},
  196. }
  197. }
  198. for _, c := range cases {
  199. assert.Equal(t, c.expected, FilePathJoinAbs(c.elems[0], c.elems[1:]...), "case: %v", c.elems)
  200. }
  201. }
  202. func TestListDirRecursively(t *testing.T) {
  203. tmpDir := t.TempDir()
  204. _ = os.WriteFile(tmpDir+"/.config", nil, 0o644)
  205. _ = os.Mkdir(tmpDir+"/d1", 0o755)
  206. _ = os.WriteFile(tmpDir+"/d1/f-d1", nil, 0o644)
  207. _ = os.Mkdir(tmpDir+"/d1/s1", 0o755)
  208. _ = os.WriteFile(tmpDir+"/d1/s1/f-d1s1", nil, 0o644)
  209. _ = os.Mkdir(tmpDir+"/d2", 0o755)
  210. res, err := ListDirRecursively(tmpDir, &ListDirOptions{IncludeDir: true})
  211. require.NoError(t, err)
  212. assert.ElementsMatch(t, []string{".config", "d1/", "d1/f-d1", "d1/s1/", "d1/s1/f-d1s1", "d2/"}, res)
  213. res, err = ListDirRecursively(tmpDir, &ListDirOptions{SkipCommonHiddenNames: true})
  214. require.NoError(t, err)
  215. assert.ElementsMatch(t, []string{"d1/f-d1", "d1/s1/f-d1s1"}, res)
  216. }