gitea源码

api_repo_git_trees_test.go 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "net/http"
  6. "testing"
  7. auth_model "code.gitea.io/gitea/models/auth"
  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. "github.com/stretchr/testify/require"
  15. )
  16. func TestAPIReposGitTrees(t *testing.T) {
  17. defer tests.PrepareTestEnv(t)()
  18. user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo1 & repo16
  19. org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) // owner of the repo3
  20. user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) // owner of neither repos
  21. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) // public repo
  22. repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) // public repo
  23. repo16 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) // private repo
  24. repo1TreeSHA := "65f1bf27bc3bf70f64657658635e66094edbcb4d"
  25. repo3TreeSHA := "2a47ca4b614a9f5a43abbd5ad851a54a616ffee6"
  26. repo16TreeSHA := "69554a64c1e6030f051e5c3f94bfbd773cd6a324"
  27. badSHA := "0000000000000000000000000000000000000000"
  28. // Login as User2.
  29. session := loginUser(t, user2.Name)
  30. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
  31. // Test a public repo that anyone can GET the tree of
  32. _ = MakeRequest(t, NewRequest(t, "GET", "/api/v1/repos/user2/repo1/git/trees/master"), http.StatusOK)
  33. resp := MakeRequest(t, NewRequest(t, "GET", "/api/v1/repos/user2/repo1/git/trees/62fb502a7172d4453f0322a2cc85bddffa57f07a?per_page=1"), http.StatusOK)
  34. var respGitTree api.GitTreeResponse
  35. DecodeJSON(t, resp, &respGitTree)
  36. assert.True(t, respGitTree.Truncated)
  37. require.Len(t, respGitTree.Entries, 1)
  38. assert.Equal(t, "File-WoW", respGitTree.Entries[0].Path)
  39. resp = MakeRequest(t, NewRequest(t, "GET", "/api/v1/repos/user2/repo1/git/trees/62fb502a7172d4453f0322a2cc85bddffa57f07a?page=2&per_page=1"), http.StatusOK)
  40. respGitTree = api.GitTreeResponse{}
  41. DecodeJSON(t, resp, &respGitTree)
  42. assert.False(t, respGitTree.Truncated)
  43. require.Len(t, respGitTree.Entries, 1)
  44. assert.Equal(t, "README.md", respGitTree.Entries[0].Path)
  45. // Tests a private repo with no token so will fail
  46. for _, ref := range [...]string{
  47. "master", // Branch
  48. repo1TreeSHA, // Tag
  49. } {
  50. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/git/trees/%s", user2.Name, repo16.Name, ref)
  51. MakeRequest(t, req, http.StatusNotFound)
  52. }
  53. // Test using access token for a private repo that the user of the token owns
  54. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/git/trees/%s", user2.Name, repo16.Name, repo16TreeSHA).
  55. AddTokenAuth(token)
  56. MakeRequest(t, req, http.StatusOK)
  57. // Test using bad sha
  58. req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/git/trees/%s", user2.Name, repo1.Name, badSHA)
  59. MakeRequest(t, req, http.StatusBadRequest)
  60. // Test using org repo "org3/repo3" where user2 is a collaborator
  61. req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/git/trees/%s", org3.Name, repo3.Name, repo3TreeSHA).
  62. AddTokenAuth(token)
  63. MakeRequest(t, req, http.StatusOK)
  64. // Test using org repo "org3/repo3" with no user token
  65. req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/git/trees/%s", org3.Name, repo3TreeSHA, repo3.Name)
  66. MakeRequest(t, req, http.StatusNotFound)
  67. // Login as User4.
  68. session = loginUser(t, user4.Name)
  69. token4 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeAll)
  70. // Test using org repo "org3/repo3" where user4 is a NOT collaborator
  71. req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/git/trees/d56a3073c1dbb7b15963110a049d50cdb5db99fc?access=%s", org3.Name, repo3.Name, token4)
  72. MakeRequest(t, req, http.StatusNotFound)
  73. }