選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

api_repo_lfs_locks_test.go 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package integrations
  5. import (
  6. "fmt"
  7. "net/http"
  8. "testing"
  9. "time"
  10. "code.gitea.io/gitea/models"
  11. "code.gitea.io/gitea/modules/setting"
  12. api "code.gitea.io/sdk/gitea"
  13. "github.com/stretchr/testify/assert"
  14. )
  15. func TestAPILFSLocksNotStarted(t *testing.T) {
  16. prepareTestEnv(t)
  17. setting.LFS.StartServer = false
  18. user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User)
  19. repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
  20. req := NewRequestf(t, "GET", "/%s/%s/info/lfs/locks", user.Name, repo.Name)
  21. MakeRequest(t, req, http.StatusNotFound)
  22. req = NewRequestf(t, "POST", "/%s/%s/info/lfs/locks", user.Name, repo.Name)
  23. MakeRequest(t, req, http.StatusNotFound)
  24. req = NewRequestf(t, "GET", "/%s/%s/info/lfs/locks/verify", user.Name, repo.Name)
  25. MakeRequest(t, req, http.StatusNotFound)
  26. req = NewRequestf(t, "GET", "/%s/%s/info/lfs/locks/10/unlock", user.Name, repo.Name)
  27. MakeRequest(t, req, http.StatusNotFound)
  28. }
  29. func TestAPILFSLocksNotLogin(t *testing.T) {
  30. prepareTestEnv(t)
  31. setting.LFS.StartServer = true
  32. user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User)
  33. repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
  34. req := NewRequestf(t, "GET", "/%s/%s/info/lfs/locks", user.Name, repo.Name)
  35. req.Header.Set("Accept", "application/vnd.git-lfs+json")
  36. req.Header.Set("Content-Type", "application/vnd.git-lfs+json")
  37. resp := MakeRequest(t, req, http.StatusForbidden)
  38. var lfsLockError api.LFSLockError
  39. DecodeJSON(t, resp, &lfsLockError)
  40. assert.Equal(t, "You must have pull access to list locks : User undefined doesn't have rigth to list for lfs lock [rid: 1]", lfsLockError.Message)
  41. }
  42. func TestAPILFSLocksLogged(t *testing.T) {
  43. prepareTestEnv(t)
  44. setting.LFS.StartServer = true
  45. user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) //in org 3
  46. user4 := models.AssertExistsAndLoadBean(t, &models.User{ID: 4}).(*models.User) //in org 3
  47. repo1 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
  48. repo3 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*models.Repository) // own by org 3
  49. tests := []struct {
  50. user *models.User
  51. repo *models.Repository
  52. path string
  53. httpResult int
  54. addTime []int
  55. }{
  56. {user: user2, repo: repo1, path: "foo/bar.zip", httpResult: http.StatusCreated, addTime: []int{0}},
  57. {user: user2, repo: repo1, path: "path/test", httpResult: http.StatusCreated, addTime: []int{0}},
  58. {user: user2, repo: repo1, path: "path/test", httpResult: http.StatusConflict},
  59. {user: user2, repo: repo1, path: "Foo/BaR.zip", httpResult: http.StatusConflict},
  60. {user: user2, repo: repo1, path: "Foo/Test/../subFOlder/../Relative/../BaR.zip", httpResult: http.StatusConflict},
  61. {user: user4, repo: repo1, path: "FoO/BaR.zip", httpResult: http.StatusForbidden},
  62. {user: user4, repo: repo1, path: "path/test-user4", httpResult: http.StatusForbidden},
  63. {user: user2, repo: repo1, path: "patH/Test-user4", httpResult: http.StatusCreated, addTime: []int{0}},
  64. {user: user2, repo: repo1, path: "some/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/path", httpResult: http.StatusCreated, addTime: []int{0}},
  65. {user: user2, repo: repo3, path: "test/foo/bar.zip", httpResult: http.StatusCreated, addTime: []int{1, 2}},
  66. {user: user4, repo: repo3, path: "test/foo/bar.zip", httpResult: http.StatusConflict},
  67. {user: user4, repo: repo3, path: "test/foo/bar.bin", httpResult: http.StatusCreated, addTime: []int{1, 2}},
  68. }
  69. resultsTests := []struct {
  70. user *models.User
  71. repo *models.Repository
  72. totalCount int
  73. oursCount int
  74. theirsCount int
  75. locksOwners []*models.User
  76. locksTimes []time.Time
  77. }{
  78. {user: user2, repo: repo1, totalCount: 4, oursCount: 4, theirsCount: 0, locksOwners: []*models.User{user2, user2, user2, user2}, locksTimes: []time.Time{}},
  79. {user: user2, repo: repo3, totalCount: 2, oursCount: 1, theirsCount: 1, locksOwners: []*models.User{user2, user4}, locksTimes: []time.Time{}},
  80. {user: user4, repo: repo3, totalCount: 2, oursCount: 1, theirsCount: 1, locksOwners: []*models.User{user2, user4}, locksTimes: []time.Time{}},
  81. }
  82. deleteTests := []struct {
  83. user *models.User
  84. repo *models.Repository
  85. lockID string
  86. }{}
  87. //create locks
  88. for _, test := range tests {
  89. session := loginUser(t, test.user.Name)
  90. req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/%s/info/lfs/locks", test.repo.FullName()), map[string]string{"path": test.path})
  91. req.Header.Set("Accept", "application/vnd.git-lfs+json")
  92. req.Header.Set("Content-Type", "application/vnd.git-lfs+json")
  93. session.MakeRequest(t, req, test.httpResult)
  94. if len(test.addTime) > 0 {
  95. for _, id := range test.addTime {
  96. resultsTests[id].locksTimes = append(resultsTests[id].locksTimes, time.Now())
  97. }
  98. }
  99. }
  100. //check creation
  101. for _, test := range resultsTests {
  102. session := loginUser(t, test.user.Name)
  103. req := NewRequestf(t, "GET", "/%s/info/lfs/locks", test.repo.FullName())
  104. req.Header.Set("Accept", "application/vnd.git-lfs+json")
  105. req.Header.Set("Content-Type", "application/vnd.git-lfs+json")
  106. resp := session.MakeRequest(t, req, http.StatusOK)
  107. var lfsLocks api.LFSLockList
  108. DecodeJSON(t, resp, &lfsLocks)
  109. assert.Len(t, lfsLocks.Locks, test.totalCount)
  110. for i, lock := range lfsLocks.Locks {
  111. assert.EqualValues(t, test.locksOwners[i].DisplayName(), lock.Owner.Name)
  112. assert.WithinDuration(t, test.locksTimes[i], lock.LockedAt, 1*time.Second)
  113. }
  114. req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/%s/info/lfs/locks/verify", test.repo.FullName()), map[string]string{})
  115. req.Header.Set("Accept", "application/vnd.git-lfs+json")
  116. req.Header.Set("Content-Type", "application/vnd.git-lfs+json")
  117. resp = session.MakeRequest(t, req, http.StatusOK)
  118. var lfsLocksVerify api.LFSLockListVerify
  119. DecodeJSON(t, resp, &lfsLocksVerify)
  120. assert.Len(t, lfsLocksVerify.Ours, test.oursCount)
  121. assert.Len(t, lfsLocksVerify.Theirs, test.theirsCount)
  122. for _, lock := range lfsLocksVerify.Ours {
  123. assert.EqualValues(t, test.user.DisplayName(), lock.Owner.Name)
  124. deleteTests = append(deleteTests, struct {
  125. user *models.User
  126. repo *models.Repository
  127. lockID string
  128. }{test.user, test.repo, lock.ID})
  129. }
  130. for _, lock := range lfsLocksVerify.Theirs {
  131. assert.NotEqual(t, test.user.DisplayName(), lock.Owner.Name)
  132. }
  133. }
  134. //remove all locks
  135. for _, test := range deleteTests {
  136. session := loginUser(t, test.user.Name)
  137. req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/%s/info/lfs/locks/%s/unlock", test.repo.FullName(), test.lockID), map[string]string{})
  138. req.Header.Set("Accept", "application/vnd.git-lfs+json")
  139. req.Header.Set("Content-Type", "application/vnd.git-lfs+json")
  140. resp := session.MakeRequest(t, req, http.StatusOK)
  141. var lfsLockRep api.LFSLockResponse
  142. DecodeJSON(t, resp, &lfsLockRep)
  143. assert.Equal(t, test.lockID, lfsLockRep.Lock.ID)
  144. assert.Equal(t, test.user.DisplayName(), lfsLockRep.Lock.Owner.Name)
  145. }
  146. // check that we don't have any lock
  147. for _, test := range resultsTests {
  148. session := loginUser(t, test.user.Name)
  149. req := NewRequestf(t, "GET", "/%s/info/lfs/locks", test.repo.FullName())
  150. req.Header.Set("Accept", "application/vnd.git-lfs+json")
  151. req.Header.Set("Content-Type", "application/vnd.git-lfs+json")
  152. resp := session.MakeRequest(t, req, http.StatusOK)
  153. var lfsLocks api.LFSLockList
  154. DecodeJSON(t, resp, &lfsLocks)
  155. assert.Len(t, lfsLocks.Locks, 0)
  156. }
  157. }