gitea源码

devtest.go 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package devtest
  4. import (
  5. "fmt"
  6. "html/template"
  7. "net/http"
  8. "path"
  9. "strconv"
  10. "strings"
  11. "time"
  12. "unicode"
  13. "code.gitea.io/gitea/models/asymkey"
  14. "code.gitea.io/gitea/models/db"
  15. user_model "code.gitea.io/gitea/models/user"
  16. "code.gitea.io/gitea/modules/badge"
  17. "code.gitea.io/gitea/modules/git"
  18. "code.gitea.io/gitea/modules/templates"
  19. "code.gitea.io/gitea/modules/util"
  20. "code.gitea.io/gitea/services/context"
  21. )
  22. // List all devtest templates, they will be used for e2e tests for the UI components
  23. func List(ctx *context.Context) {
  24. templateNames, err := templates.AssetFS().ListFiles("devtest", true)
  25. if err != nil {
  26. ctx.ServerError("AssetFS().ListFiles", err)
  27. return
  28. }
  29. var subNames []string
  30. for _, tmplName := range templateNames {
  31. subName := strings.TrimSuffix(tmplName, ".tmpl")
  32. if !strings.HasPrefix(subName, "devtest-") {
  33. subNames = append(subNames, subName)
  34. }
  35. }
  36. ctx.Data["SubNames"] = subNames
  37. ctx.HTML(http.StatusOK, "devtest/devtest-list")
  38. }
  39. func FetchActionTest(ctx *context.Context) {
  40. _ = ctx.Req.ParseForm()
  41. ctx.Flash.Info("fetch-action: " + ctx.Req.Method + " " + ctx.Req.RequestURI + "<br>" +
  42. "Form: " + ctx.Req.Form.Encode() + "<br>" +
  43. "PostForm: " + ctx.Req.PostForm.Encode(),
  44. )
  45. time.Sleep(2 * time.Second)
  46. ctx.JSONRedirect("")
  47. }
  48. func prepareMockDataGiteaUI(ctx *context.Context) {
  49. now := time.Now()
  50. ctx.Data["TimeNow"] = now
  51. ctx.Data["TimePast5s"] = now.Add(-5 * time.Second)
  52. ctx.Data["TimeFuture5s"] = now.Add(5 * time.Second)
  53. ctx.Data["TimePast2m"] = now.Add(-2 * time.Minute)
  54. ctx.Data["TimeFuture2m"] = now.Add(2 * time.Minute)
  55. ctx.Data["TimePast1y"] = now.Add(-1 * 366 * 86400 * time.Second)
  56. ctx.Data["TimeFuture1y"] = now.Add(1 * 366 * 86400 * time.Second)
  57. }
  58. func prepareMockDataBadgeCommitSign(ctx *context.Context) {
  59. var commits []*asymkey.SignCommit
  60. mockUsers, _ := db.Find[user_model.User](ctx, user_model.SearchUserOptions{ListOptions: db.ListOptions{PageSize: 1}})
  61. mockUser := mockUsers[0]
  62. commits = append(commits, &asymkey.SignCommit{
  63. Verification: &asymkey.CommitVerification{},
  64. UserCommit: &user_model.UserCommit{
  65. Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()},
  66. },
  67. })
  68. commits = append(commits, &asymkey.SignCommit{
  69. Verification: &asymkey.CommitVerification{
  70. Verified: true,
  71. Reason: "name / key-id",
  72. SigningUser: mockUser,
  73. SigningKey: &asymkey.GPGKey{KeyID: "12345678"},
  74. TrustStatus: "trusted",
  75. },
  76. UserCommit: &user_model.UserCommit{
  77. User: mockUser,
  78. Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()},
  79. },
  80. })
  81. commits = append(commits, &asymkey.SignCommit{
  82. Verification: &asymkey.CommitVerification{
  83. Verified: true,
  84. Reason: "name / key-id",
  85. SigningUser: mockUser,
  86. SigningSSHKey: &asymkey.PublicKey{Fingerprint: "aa:bb:cc:dd:ee"},
  87. TrustStatus: "untrusted",
  88. },
  89. UserCommit: &user_model.UserCommit{
  90. User: mockUser,
  91. Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()},
  92. },
  93. })
  94. commits = append(commits, &asymkey.SignCommit{
  95. Verification: &asymkey.CommitVerification{
  96. Verified: true,
  97. Reason: "name / key-id",
  98. SigningUser: mockUser,
  99. SigningSSHKey: &asymkey.PublicKey{Fingerprint: "aa:bb:cc:dd:ee"},
  100. TrustStatus: "other(unmatch)",
  101. },
  102. UserCommit: &user_model.UserCommit{
  103. User: mockUser,
  104. Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()},
  105. },
  106. })
  107. commits = append(commits, &asymkey.SignCommit{
  108. Verification: &asymkey.CommitVerification{
  109. Warning: true,
  110. Reason: "gpg.error",
  111. SigningEmail: "test@example.com",
  112. },
  113. UserCommit: &user_model.UserCommit{
  114. User: mockUser,
  115. Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()},
  116. },
  117. })
  118. ctx.Data["MockCommits"] = commits
  119. }
  120. func prepareMockDataBadgeActionsSvg(ctx *context.Context) {
  121. fontFamilyNames := strings.Split(badge.DefaultFontFamily, ",")
  122. selectedFontFamilyName := ctx.FormString("font", fontFamilyNames[0])
  123. selectedStyle := ctx.FormString("style", badge.DefaultStyle)
  124. var badges []badge.Badge
  125. badges = append(badges, badge.GenerateBadge("啊啊啊啊啊啊啊啊啊啊啊啊", "🌞🌞🌞🌞🌞", "green"))
  126. for r := range rune(256) {
  127. if unicode.IsPrint(r) {
  128. s := strings.Repeat(string(r), 15)
  129. badges = append(badges, badge.GenerateBadge(s, util.TruncateRunes(s, 7), "green"))
  130. }
  131. }
  132. var badgeSVGs []template.HTML
  133. for i, b := range badges {
  134. b.IDPrefix = "devtest-" + strconv.FormatInt(int64(i), 10) + "-"
  135. b.FontFamily = selectedFontFamilyName
  136. var h template.HTML
  137. var err error
  138. switch selectedStyle {
  139. case badge.StyleFlat:
  140. h, err = ctx.RenderToHTML("shared/actions/runner_badge_flat", map[string]any{"Badge": b})
  141. case badge.StyleFlatSquare:
  142. h, err = ctx.RenderToHTML("shared/actions/runner_badge_flat-square", map[string]any{"Badge": b})
  143. default:
  144. err = fmt.Errorf("unknown badge style: %s", selectedStyle)
  145. }
  146. if err != nil {
  147. ctx.ServerError("RenderToHTML", err)
  148. return
  149. }
  150. badgeSVGs = append(badgeSVGs, h)
  151. }
  152. ctx.Data["BadgeSVGs"] = badgeSVGs
  153. ctx.Data["BadgeFontFamilyNames"] = fontFamilyNames
  154. ctx.Data["SelectedFontFamilyName"] = selectedFontFamilyName
  155. ctx.Data["BadgeStyles"] = badge.GlobalVars().AllStyles
  156. ctx.Data["SelectedStyle"] = selectedStyle
  157. }
  158. func prepareMockData(ctx *context.Context) {
  159. switch ctx.Req.URL.Path {
  160. case "/devtest/gitea-ui":
  161. prepareMockDataGiteaUI(ctx)
  162. case "/devtest/badge-commit-sign":
  163. prepareMockDataBadgeCommitSign(ctx)
  164. case "/devtest/badge-actions-svg":
  165. prepareMockDataBadgeActionsSvg(ctx)
  166. }
  167. }
  168. func TmplCommon(ctx *context.Context) {
  169. prepareMockData(ctx)
  170. if ctx.Req.Method == http.MethodPost {
  171. _ = ctx.Req.ParseForm()
  172. ctx.Flash.Info("form: "+ctx.Req.Method+" "+ctx.Req.RequestURI+"<br>"+
  173. "Form: "+ctx.Req.Form.Encode()+"<br>"+
  174. "PostForm: "+ctx.Req.PostForm.Encode(),
  175. true,
  176. )
  177. time.Sleep(2 * time.Second)
  178. }
  179. ctx.HTML(http.StatusOK, templates.TplName("devtest"+path.Clean("/"+ctx.PathParam("sub"))))
  180. }