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.

api_repo_git_hook_test.go 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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. api "code.gitea.io/gitea/modules/structs"
  13. "code.gitea.io/gitea/tests"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. const testHookContent = `#!/bin/bash
  17. echo Hello, World!
  18. `
  19. func TestAPIListGitHooks(t *testing.T) {
  20. defer tests.PrepareTestEnv(t)()
  21. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 37})
  22. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  23. // user1 is an admin user
  24. session := loginUser(t, "user1")
  25. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
  26. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git?token=%s",
  27. owner.Name, repo.Name, token)
  28. resp := MakeRequest(t, req, http.StatusOK)
  29. var apiGitHooks []*api.GitHook
  30. DecodeJSON(t, resp, &apiGitHooks)
  31. assert.Len(t, apiGitHooks, 3)
  32. for _, apiGitHook := range apiGitHooks {
  33. if apiGitHook.Name == "pre-receive" {
  34. assert.True(t, apiGitHook.IsActive)
  35. assert.Equal(t, testHookContent, apiGitHook.Content)
  36. } else {
  37. assert.False(t, apiGitHook.IsActive)
  38. assert.Empty(t, apiGitHook.Content)
  39. }
  40. }
  41. }
  42. func TestAPIListGitHooksNoHooks(t *testing.T) {
  43. defer tests.PrepareTestEnv(t)()
  44. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  45. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  46. // user1 is an admin user
  47. session := loginUser(t, "user1")
  48. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
  49. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git?token=%s",
  50. owner.Name, repo.Name, token)
  51. resp := MakeRequest(t, req, http.StatusOK)
  52. var apiGitHooks []*api.GitHook
  53. DecodeJSON(t, resp, &apiGitHooks)
  54. assert.Len(t, apiGitHooks, 3)
  55. for _, apiGitHook := range apiGitHooks {
  56. assert.False(t, apiGitHook.IsActive)
  57. assert.Empty(t, apiGitHook.Content)
  58. }
  59. }
  60. func TestAPIListGitHooksNoAccess(t *testing.T) {
  61. defer tests.PrepareTestEnv(t)()
  62. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  63. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  64. session := loginUser(t, owner.Name)
  65. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
  66. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git?token=%s",
  67. owner.Name, repo.Name, token)
  68. MakeRequest(t, req, http.StatusForbidden)
  69. }
  70. func TestAPIGetGitHook(t *testing.T) {
  71. defer tests.PrepareTestEnv(t)()
  72. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 37})
  73. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  74. // user1 is an admin user
  75. session := loginUser(t, "user1")
  76. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
  77. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s",
  78. owner.Name, repo.Name, token)
  79. resp := MakeRequest(t, req, http.StatusOK)
  80. var apiGitHook *api.GitHook
  81. DecodeJSON(t, resp, &apiGitHook)
  82. assert.True(t, apiGitHook.IsActive)
  83. assert.Equal(t, testHookContent, apiGitHook.Content)
  84. }
  85. func TestAPIGetGitHookNoAccess(t *testing.T) {
  86. defer tests.PrepareTestEnv(t)()
  87. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  88. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  89. session := loginUser(t, owner.Name)
  90. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
  91. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s",
  92. owner.Name, repo.Name, token)
  93. MakeRequest(t, req, http.StatusForbidden)
  94. }
  95. func TestAPIEditGitHook(t *testing.T) {
  96. defer tests.PrepareTestEnv(t)()
  97. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  98. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  99. // user1 is an admin user
  100. session := loginUser(t, "user1")
  101. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  102. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s",
  103. owner.Name, repo.Name, token)
  104. req := NewRequestWithJSON(t, "PATCH", urlStr, &api.EditGitHookOption{
  105. Content: testHookContent,
  106. })
  107. resp := MakeRequest(t, req, http.StatusOK)
  108. var apiGitHook *api.GitHook
  109. DecodeJSON(t, resp, &apiGitHook)
  110. assert.True(t, apiGitHook.IsActive)
  111. assert.Equal(t, testHookContent, apiGitHook.Content)
  112. req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s",
  113. owner.Name, repo.Name, token)
  114. resp = MakeRequest(t, req, http.StatusOK)
  115. var apiGitHook2 *api.GitHook
  116. DecodeJSON(t, resp, &apiGitHook2)
  117. assert.True(t, apiGitHook2.IsActive)
  118. assert.Equal(t, testHookContent, apiGitHook2.Content)
  119. }
  120. func TestAPIEditGitHookNoAccess(t *testing.T) {
  121. defer tests.PrepareTestEnv(t)()
  122. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  123. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  124. session := loginUser(t, owner.Name)
  125. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  126. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s",
  127. owner.Name, repo.Name, token)
  128. req := NewRequestWithJSON(t, "PATCH", urlStr, &api.EditGitHookOption{
  129. Content: testHookContent,
  130. })
  131. MakeRequest(t, req, http.StatusForbidden)
  132. }
  133. func TestAPIDeleteGitHook(t *testing.T) {
  134. defer tests.PrepareTestEnv(t)()
  135. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 37})
  136. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  137. // user1 is an admin user
  138. session := loginUser(t, "user1")
  139. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  140. req := NewRequestf(t, "DELETE", "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s",
  141. owner.Name, repo.Name, token)
  142. MakeRequest(t, req, http.StatusNoContent)
  143. req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s",
  144. owner.Name, repo.Name, token)
  145. resp := MakeRequest(t, req, http.StatusOK)
  146. var apiGitHook2 *api.GitHook
  147. DecodeJSON(t, resp, &apiGitHook2)
  148. assert.False(t, apiGitHook2.IsActive)
  149. assert.Empty(t, apiGitHook2.Content)
  150. }
  151. func TestAPIDeleteGitHookNoAccess(t *testing.T) {
  152. defer tests.PrepareTestEnv(t)()
  153. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  154. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  155. session := loginUser(t, owner.Name)
  156. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  157. req := NewRequestf(t, "DELETE", "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s",
  158. owner.Name, repo.Name, token)
  159. MakeRequest(t, req, http.StatusForbidden)
  160. }