gitea源码

api_issue_attachment_test.go 7.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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/tests"
  18. "github.com/stretchr/testify/assert"
  19. )
  20. func TestAPIGetIssueAttachment(t *testing.T) {
  21. defer tests.PrepareTestEnv(t)()
  22. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 1})
  23. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: attachment.RepoID})
  24. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: attachment.IssueID})
  25. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  26. session := loginUser(t, repoOwner.Name)
  27. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadIssue)
  28. req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/assets/%d", repoOwner.Name, repo.Name, issue.Index, attachment.ID)).
  29. AddTokenAuth(token)
  30. resp := session.MakeRequest(t, req, http.StatusOK)
  31. apiAttachment := new(api.Attachment)
  32. DecodeJSON(t, resp, &apiAttachment)
  33. unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: apiAttachment.ID, IssueID: issue.ID})
  34. }
  35. func TestAPIListIssueAttachments(t *testing.T) {
  36. defer tests.PrepareTestEnv(t)()
  37. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 1})
  38. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: attachment.RepoID})
  39. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: attachment.IssueID})
  40. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  41. session := loginUser(t, repoOwner.Name)
  42. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadIssue)
  43. req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/assets", repoOwner.Name, repo.Name, issue.Index)).
  44. AddTokenAuth(token)
  45. resp := session.MakeRequest(t, req, http.StatusOK)
  46. apiAttachment := new([]api.Attachment)
  47. DecodeJSON(t, resp, &apiAttachment)
  48. unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: (*apiAttachment)[0].ID, IssueID: issue.ID})
  49. }
  50. func TestAPICreateIssueAttachment(t *testing.T) {
  51. defer tests.PrepareTestEnv(t)()
  52. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  53. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
  54. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  55. session := loginUser(t, repoOwner.Name)
  56. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  57. filename := "image.png"
  58. buff := generateImg()
  59. body := &bytes.Buffer{}
  60. // Setup multi-part
  61. writer := multipart.NewWriter(body)
  62. part, err := writer.CreateFormFile("attachment", filename)
  63. assert.NoError(t, err)
  64. _, err = io.Copy(part, &buff)
  65. assert.NoError(t, err)
  66. err = writer.Close()
  67. assert.NoError(t, err)
  68. req := NewRequestWithBody(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/assets", repoOwner.Name, repo.Name, issue.Index), body).
  69. AddTokenAuth(token)
  70. req.Header.Add("Content-Type", writer.FormDataContentType())
  71. resp := session.MakeRequest(t, req, http.StatusCreated)
  72. apiAttachment := new(api.Attachment)
  73. DecodeJSON(t, resp, &apiAttachment)
  74. unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: apiAttachment.ID, IssueID: issue.ID})
  75. }
  76. func TestAPICreateIssueAttachmentWithUnallowedFile(t *testing.T) {
  77. defer tests.PrepareTestEnv(t)()
  78. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  79. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
  80. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  81. session := loginUser(t, repoOwner.Name)
  82. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  83. filename := "file.bad"
  84. body := &bytes.Buffer{}
  85. // Setup multi-part.
  86. writer := multipart.NewWriter(body)
  87. _, err := writer.CreateFormFile("attachment", filename)
  88. assert.NoError(t, err)
  89. err = writer.Close()
  90. assert.NoError(t, err)
  91. req := NewRequestWithBody(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/assets", repoOwner.Name, repo.Name, issue.Index), body).
  92. AddTokenAuth(token)
  93. req.Header.Add("Content-Type", writer.FormDataContentType())
  94. session.MakeRequest(t, req, http.StatusUnprocessableEntity)
  95. }
  96. func TestAPIEditIssueAttachment(t *testing.T) {
  97. defer tests.PrepareTestEnv(t)()
  98. const newAttachmentName = "hello_world.txt"
  99. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 1})
  100. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: attachment.RepoID})
  101. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: attachment.IssueID})
  102. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  103. session := loginUser(t, repoOwner.Name)
  104. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  105. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/assets/%d",
  106. repoOwner.Name, repo.Name, issue.Index, attachment.ID)
  107. req := NewRequestWithValues(t, "PATCH", urlStr, map[string]string{
  108. "name": newAttachmentName,
  109. }).AddTokenAuth(token)
  110. resp := session.MakeRequest(t, req, http.StatusCreated)
  111. apiAttachment := new(api.Attachment)
  112. DecodeJSON(t, resp, &apiAttachment)
  113. unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: apiAttachment.ID, IssueID: issue.ID, Name: apiAttachment.Name})
  114. }
  115. func TestAPIEditIssueAttachmentWithUnallowedFile(t *testing.T) {
  116. defer tests.PrepareTestEnv(t)()
  117. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 1})
  118. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: attachment.RepoID})
  119. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: attachment.IssueID})
  120. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  121. session := loginUser(t, repoOwner.Name)
  122. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  123. filename := "file.bad"
  124. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/assets/%d", repoOwner.Name, repo.Name, issue.Index, attachment.ID)
  125. req := NewRequestWithValues(t, "PATCH", urlStr, map[string]string{
  126. "name": filename,
  127. }).AddTokenAuth(token)
  128. session.MakeRequest(t, req, http.StatusUnprocessableEntity)
  129. }
  130. func TestAPIDeleteIssueAttachment(t *testing.T) {
  131. defer tests.PrepareTestEnv(t)()
  132. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 1})
  133. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: attachment.RepoID})
  134. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: attachment.IssueID})
  135. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  136. session := loginUser(t, repoOwner.Name)
  137. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  138. req := NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/assets/%d", repoOwner.Name, repo.Name, issue.Index, attachment.ID)).
  139. AddTokenAuth(token)
  140. session.MakeRequest(t, req, http.StatusNoContent)
  141. unittest.AssertNotExistsBean(t, &repo_model.Attachment{ID: attachment.ID, IssueID: issue.ID})
  142. }