gitea源码

api_comment_attachment_test.go 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "bytes"
  6. "fmt"
  7. "io"
  8. "mime/multipart"
  9. "net/http"
  10. "testing"
  11. auth_model "code.gitea.io/gitea/models/auth"
  12. issues_model "code.gitea.io/gitea/models/issues"
  13. repo_model "code.gitea.io/gitea/models/repo"
  14. "code.gitea.io/gitea/models/unittest"
  15. user_model "code.gitea.io/gitea/models/user"
  16. api "code.gitea.io/gitea/modules/structs"
  17. "code.gitea.io/gitea/services/convert"
  18. "code.gitea.io/gitea/tests"
  19. "github.com/stretchr/testify/assert"
  20. )
  21. func TestAPIGetCommentAttachment(t *testing.T) {
  22. defer tests.PrepareTestEnv(t)()
  23. comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 2})
  24. assert.NoError(t, comment.LoadIssue(t.Context()))
  25. assert.NoError(t, comment.LoadAttachments(t.Context()))
  26. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: comment.Attachments[0].ID})
  27. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: comment.Issue.RepoID})
  28. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  29. t.Run("UnrelatedCommentID", func(t *testing.T) {
  30. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
  31. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  32. token := getUserToken(t, repoOwner.Name, auth_model.AccessTokenScopeWriteIssue)
  33. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d/assets/%d", repoOwner.Name, repo.Name, comment.ID, attachment.ID).
  34. AddTokenAuth(token)
  35. MakeRequest(t, req, http.StatusNotFound)
  36. })
  37. session := loginUser(t, repoOwner.Name)
  38. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadIssue)
  39. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d/assets/%d", repoOwner.Name, repo.Name, comment.ID, attachment.ID).
  40. AddTokenAuth(token)
  41. session.MakeRequest(t, req, http.StatusOK)
  42. req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d/assets/%d", repoOwner.Name, repo.Name, comment.ID, attachment.ID).
  43. AddTokenAuth(token)
  44. resp := session.MakeRequest(t, req, http.StatusOK)
  45. var apiAttachment api.Attachment
  46. DecodeJSON(t, resp, &apiAttachment)
  47. expect := convert.ToAPIAttachment(repo, attachment)
  48. assert.Equal(t, expect.ID, apiAttachment.ID)
  49. assert.Equal(t, expect.Name, apiAttachment.Name)
  50. assert.Equal(t, expect.UUID, apiAttachment.UUID)
  51. assert.Equal(t, expect.Created.Unix(), apiAttachment.Created.Unix())
  52. assert.Equal(t, expect.DownloadURL, apiAttachment.DownloadURL)
  53. }
  54. func TestAPIListCommentAttachments(t *testing.T) {
  55. defer tests.PrepareTestEnv(t)()
  56. comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 2})
  57. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: comment.IssueID})
  58. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issue.RepoID})
  59. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  60. session := loginUser(t, repoOwner.Name)
  61. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadIssue)
  62. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d/assets", repoOwner.Name, repo.Name, comment.ID).
  63. AddTokenAuth(token)
  64. resp := session.MakeRequest(t, req, http.StatusOK)
  65. var apiAttachments []*api.Attachment
  66. DecodeJSON(t, resp, &apiAttachments)
  67. expectedCount := unittest.GetCount(t, &repo_model.Attachment{CommentID: comment.ID})
  68. assert.Len(t, apiAttachments, expectedCount)
  69. unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: apiAttachments[0].ID, CommentID: comment.ID})
  70. }
  71. func TestAPICreateCommentAttachment(t *testing.T) {
  72. defer tests.PrepareTestEnv(t)()
  73. comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 2})
  74. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: comment.IssueID})
  75. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issue.RepoID})
  76. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  77. session := loginUser(t, repoOwner.Name)
  78. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  79. filename := "image.png"
  80. buff := generateImg()
  81. body := &bytes.Buffer{}
  82. // Setup multi-part
  83. writer := multipart.NewWriter(body)
  84. part, err := writer.CreateFormFile("attachment", filename)
  85. assert.NoError(t, err)
  86. _, err = io.Copy(part, &buff)
  87. assert.NoError(t, err)
  88. err = writer.Close()
  89. assert.NoError(t, err)
  90. req := NewRequestWithBody(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/issues/comments/%d/assets", repoOwner.Name, repo.Name, comment.ID), body).
  91. AddTokenAuth(token).
  92. SetHeader("Content-Type", writer.FormDataContentType())
  93. resp := session.MakeRequest(t, req, http.StatusCreated)
  94. apiAttachment := new(api.Attachment)
  95. DecodeJSON(t, resp, &apiAttachment)
  96. unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: apiAttachment.ID, CommentID: comment.ID})
  97. }
  98. func TestAPICreateCommentAttachmentWithUnallowedFile(t *testing.T) {
  99. defer tests.PrepareTestEnv(t)()
  100. comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 2})
  101. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: comment.IssueID})
  102. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issue.RepoID})
  103. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  104. session := loginUser(t, repoOwner.Name)
  105. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  106. filename := "file.bad"
  107. body := &bytes.Buffer{}
  108. // Setup multi-part.
  109. writer := multipart.NewWriter(body)
  110. _, err := writer.CreateFormFile("attachment", filename)
  111. assert.NoError(t, err)
  112. err = writer.Close()
  113. assert.NoError(t, err)
  114. req := NewRequestWithBody(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/issues/comments/%d/assets", repoOwner.Name, repo.Name, comment.ID), body).
  115. AddTokenAuth(token).
  116. SetHeader("Content-Type", writer.FormDataContentType())
  117. session.MakeRequest(t, req, http.StatusUnprocessableEntity)
  118. }
  119. func TestAPIEditCommentAttachment(t *testing.T) {
  120. defer tests.PrepareTestEnv(t)()
  121. const newAttachmentName = "newAttachmentName.txt"
  122. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 6})
  123. comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: attachment.CommentID})
  124. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: comment.IssueID})
  125. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issue.RepoID})
  126. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  127. session := loginUser(t, repoOwner.Name)
  128. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  129. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/comments/%d/assets/%d",
  130. repoOwner.Name, repo.Name, comment.ID, attachment.ID)
  131. req := NewRequestWithValues(t, "PATCH", urlStr, map[string]string{
  132. "name": newAttachmentName,
  133. }).AddTokenAuth(token)
  134. resp := session.MakeRequest(t, req, http.StatusCreated)
  135. apiAttachment := new(api.Attachment)
  136. DecodeJSON(t, resp, &apiAttachment)
  137. unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: apiAttachment.ID, CommentID: comment.ID, Name: apiAttachment.Name})
  138. }
  139. func TestAPIEditCommentAttachmentWithUnallowedFile(t *testing.T) {
  140. defer tests.PrepareTestEnv(t)()
  141. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 6})
  142. comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: attachment.CommentID})
  143. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: comment.IssueID})
  144. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issue.RepoID})
  145. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  146. session := loginUser(t, repoOwner.Name)
  147. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  148. filename := "file.bad"
  149. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/comments/%d/assets/%d",
  150. repoOwner.Name, repo.Name, comment.ID, attachment.ID)
  151. req := NewRequestWithValues(t, "PATCH", urlStr, map[string]string{
  152. "name": filename,
  153. }).AddTokenAuth(token)
  154. session.MakeRequest(t, req, http.StatusUnprocessableEntity)
  155. }
  156. func TestAPIDeleteCommentAttachment(t *testing.T) {
  157. defer tests.PrepareTestEnv(t)()
  158. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 6})
  159. comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: attachment.CommentID})
  160. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: comment.IssueID})
  161. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issue.RepoID})
  162. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  163. session := loginUser(t, repoOwner.Name)
  164. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  165. req := NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/repos/%s/%s/issues/comments/%d/assets/%d", repoOwner.Name, repo.Name, comment.ID, attachment.ID)).
  166. AddTokenAuth(token)
  167. session.MakeRequest(t, req, http.StatusNoContent)
  168. unittest.AssertNotExistsBean(t, &repo_model.Attachment{ID: attachment.ID, CommentID: comment.ID})
  169. }