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.5KB

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