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_issue_attachment_test.go 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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 TestAPIEditIssueAttachment(t *testing.T) {
  77. defer tests.PrepareTestEnv(t)()
  78. const newAttachmentName = "newAttachmentName"
  79. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 1})
  80. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: attachment.RepoID})
  81. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: attachment.IssueID})
  82. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  83. session := loginUser(t, repoOwner.Name)
  84. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  85. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/assets/%d",
  86. repoOwner.Name, repo.Name, issue.Index, attachment.ID)
  87. req := NewRequestWithValues(t, "PATCH", urlStr, map[string]string{
  88. "name": newAttachmentName,
  89. }).AddTokenAuth(token)
  90. resp := session.MakeRequest(t, req, http.StatusCreated)
  91. apiAttachment := new(api.Attachment)
  92. DecodeJSON(t, resp, &apiAttachment)
  93. unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: apiAttachment.ID, IssueID: issue.ID, Name: apiAttachment.Name})
  94. }
  95. func TestAPIDeleteIssueAttachment(t *testing.T) {
  96. defer tests.PrepareTestEnv(t)()
  97. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 1})
  98. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: attachment.RepoID})
  99. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: attachment.IssueID})
  100. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  101. session := loginUser(t, repoOwner.Name)
  102. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  103. req := NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/assets/%d", repoOwner.Name, repo.Name, issue.Index, attachment.ID)).
  104. AddTokenAuth(token)
  105. session.MakeRequest(t, req, http.StatusNoContent)
  106. unittest.AssertNotExistsBean(t, &repo_model.Attachment{ID: attachment.ID, IssueID: issue.ID})
  107. }