gitea源码

api_repo_git_hook_test.go 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "fmt"
  6. "net/http"
  7. "testing"
  8. auth_model "code.gitea.io/gitea/models/auth"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. "code.gitea.io/gitea/models/unittest"
  11. user_model "code.gitea.io/gitea/models/user"
  12. "code.gitea.io/gitea/modules/setting"
  13. api "code.gitea.io/gitea/modules/structs"
  14. "code.gitea.io/gitea/modules/test"
  15. "code.gitea.io/gitea/tests"
  16. "github.com/stretchr/testify/assert"
  17. )
  18. func TestAPIGitHooks(t *testing.T) {
  19. defer tests.PrepareTestEnv(t)()
  20. defer test.MockVariableValue(&setting.DisableGitHooks, false)()
  21. const testHookContent = `#!/bin/bash
  22. echo "TestGitHookScript"
  23. `
  24. t.Run("ListGitHooks", func(t *testing.T) {
  25. defer tests.PrintCurrentTest(t)()
  26. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 37})
  27. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  28. // user1 is an admin user
  29. session := loginUser(t, "user1")
  30. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
  31. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git", owner.Name, repo.Name).
  32. AddTokenAuth(token)
  33. resp := MakeRequest(t, req, http.StatusOK)
  34. var apiGitHooks []*api.GitHook
  35. DecodeJSON(t, resp, &apiGitHooks)
  36. assert.Len(t, apiGitHooks, 3)
  37. for _, apiGitHook := range apiGitHooks {
  38. if apiGitHook.Name == "pre-receive" {
  39. assert.True(t, apiGitHook.IsActive)
  40. assert.Equal(t, testHookContent, apiGitHook.Content)
  41. } else {
  42. assert.False(t, apiGitHook.IsActive)
  43. assert.Empty(t, apiGitHook.Content)
  44. }
  45. }
  46. })
  47. t.Run("NoGitHooks", func(t *testing.T) {
  48. defer tests.PrintCurrentTest(t)()
  49. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  50. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  51. // user1 is an admin user
  52. session := loginUser(t, "user1")
  53. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
  54. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git", owner.Name, repo.Name).
  55. AddTokenAuth(token)
  56. resp := MakeRequest(t, req, http.StatusOK)
  57. var apiGitHooks []*api.GitHook
  58. DecodeJSON(t, resp, &apiGitHooks)
  59. assert.Len(t, apiGitHooks, 3)
  60. for _, apiGitHook := range apiGitHooks {
  61. assert.False(t, apiGitHook.IsActive)
  62. assert.Empty(t, apiGitHook.Content)
  63. }
  64. })
  65. t.Run("ListGitHooksNoAccess", func(t *testing.T) {
  66. defer tests.PrintCurrentTest(t)()
  67. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  68. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  69. session := loginUser(t, owner.Name)
  70. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
  71. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git", owner.Name, repo.Name).
  72. AddTokenAuth(token)
  73. MakeRequest(t, req, http.StatusForbidden)
  74. })
  75. t.Run("GetGitHook", func(t *testing.T) {
  76. defer tests.PrintCurrentTest(t)()
  77. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 37})
  78. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  79. // user1 is an admin user
  80. session := loginUser(t, "user1")
  81. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
  82. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git/pre-receive", owner.Name, repo.Name).
  83. AddTokenAuth(token)
  84. resp := MakeRequest(t, req, http.StatusOK)
  85. var apiGitHook *api.GitHook
  86. DecodeJSON(t, resp, &apiGitHook)
  87. assert.True(t, apiGitHook.IsActive)
  88. assert.Equal(t, testHookContent, apiGitHook.Content)
  89. })
  90. t.Run("GetGitHookNoAccess", func(t *testing.T) {
  91. defer tests.PrintCurrentTest(t)()
  92. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  93. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  94. session := loginUser(t, owner.Name)
  95. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
  96. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git/pre-receive", owner.Name, repo.Name).
  97. AddTokenAuth(token)
  98. MakeRequest(t, req, http.StatusForbidden)
  99. })
  100. t.Run("EditGitHook", func(t *testing.T) {
  101. defer tests.PrintCurrentTest(t)()
  102. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  103. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  104. // user1 is an admin user
  105. session := loginUser(t, "user1")
  106. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  107. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/hooks/git/pre-receive",
  108. owner.Name, repo.Name)
  109. req := NewRequestWithJSON(t, "PATCH", urlStr, &api.EditGitHookOption{
  110. Content: testHookContent,
  111. }).AddTokenAuth(token)
  112. resp := MakeRequest(t, req, http.StatusOK)
  113. var apiGitHook *api.GitHook
  114. DecodeJSON(t, resp, &apiGitHook)
  115. assert.True(t, apiGitHook.IsActive)
  116. assert.Equal(t, testHookContent, apiGitHook.Content)
  117. req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git/pre-receive", owner.Name, repo.Name).
  118. AddTokenAuth(token)
  119. resp = MakeRequest(t, req, http.StatusOK)
  120. var apiGitHook2 *api.GitHook
  121. DecodeJSON(t, resp, &apiGitHook2)
  122. assert.True(t, apiGitHook2.IsActive)
  123. assert.Equal(t, testHookContent, apiGitHook2.Content)
  124. })
  125. t.Run("EditGitHookNoAccess", func(t *testing.T) {
  126. defer tests.PrintCurrentTest(t)()
  127. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  128. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  129. session := loginUser(t, owner.Name)
  130. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  131. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/hooks/git/pre-receive", owner.Name, repo.Name)
  132. req := NewRequestWithJSON(t, "PATCH", urlStr, &api.EditGitHookOption{
  133. Content: testHookContent,
  134. }).AddTokenAuth(token)
  135. MakeRequest(t, req, http.StatusForbidden)
  136. })
  137. t.Run("DeleteGitHook", func(t *testing.T) {
  138. defer tests.PrintCurrentTest(t)()
  139. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 37})
  140. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  141. // user1 is an admin user
  142. session := loginUser(t, "user1")
  143. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  144. req := NewRequestf(t, "DELETE", "/api/v1/repos/%s/%s/hooks/git/pre-receive", owner.Name, repo.Name).
  145. AddTokenAuth(token)
  146. MakeRequest(t, req, http.StatusNoContent)
  147. req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git/pre-receive", owner.Name, repo.Name).
  148. AddTokenAuth(token)
  149. resp := MakeRequest(t, req, http.StatusOK)
  150. var apiGitHook2 *api.GitHook
  151. DecodeJSON(t, resp, &apiGitHook2)
  152. assert.False(t, apiGitHook2.IsActive)
  153. assert.Empty(t, apiGitHook2.Content)
  154. })
  155. t.Run("DeleteGitHookNoAccess", func(t *testing.T) {
  156. defer tests.PrintCurrentTest(t)()
  157. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  158. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  159. session := loginUser(t, owner.Name)
  160. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  161. req := NewRequestf(t, "DELETE", "/api/v1/repos/%s/%s/hooks/git/pre-receive", owner.Name, repo.Name).
  162. AddTokenAuth(token)
  163. MakeRequest(t, req, http.StatusForbidden)
  164. })
  165. }