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_comment_attachment_test.go 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // Copyright 2021 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 integration
  5. import (
  6. "bytes"
  7. "fmt"
  8. "io"
  9. "mime/multipart"
  10. "net/http"
  11. "testing"
  12. auth_model "code.gitea.io/gitea/models/auth"
  13. "code.gitea.io/gitea/models/db"
  14. issues_model "code.gitea.io/gitea/models/issues"
  15. repo_model "code.gitea.io/gitea/models/repo"
  16. "code.gitea.io/gitea/models/unittest"
  17. user_model "code.gitea.io/gitea/models/user"
  18. api "code.gitea.io/gitea/modules/structs"
  19. "code.gitea.io/gitea/services/convert"
  20. "code.gitea.io/gitea/tests"
  21. "github.com/stretchr/testify/assert"
  22. )
  23. func TestAPIGetCommentAttachment(t *testing.T) {
  24. defer tests.PrepareTestEnv(t)()
  25. comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 2})
  26. assert.NoError(t, comment.LoadIssue(db.DefaultContext))
  27. assert.NoError(t, comment.LoadAttachments(db.DefaultContext))
  28. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: comment.Attachments[0].ID})
  29. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: comment.Issue.RepoID})
  30. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  31. t.Run("UnrelatedCommentID", func(t *testing.T) {
  32. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
  33. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  34. token := getUserToken(t, repoOwner.Name, auth_model.AccessTokenScopeWriteIssue)
  35. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d/assets/%d?token=%s", repoOwner.Name, repo.Name, comment.ID, attachment.ID, token)
  36. MakeRequest(t, req, http.StatusNotFound)
  37. })
  38. session := loginUser(t, repoOwner.Name)
  39. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadIssue)
  40. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d/assets/%d?token=%s", repoOwner.Name, repo.Name, comment.ID, attachment.ID, token)
  41. session.MakeRequest(t, req, http.StatusOK)
  42. req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d/assets/%d?token=%s", repoOwner.Name, repo.Name, comment.ID, attachment.ID, token)
  43. resp := session.MakeRequest(t, req, http.StatusOK)
  44. var apiAttachment api.Attachment
  45. DecodeJSON(t, resp, &apiAttachment)
  46. expect := convert.ToAPIAttachment(repo, attachment)
  47. assert.Equal(t, expect.ID, apiAttachment.ID)
  48. assert.Equal(t, expect.Name, apiAttachment.Name)
  49. assert.Equal(t, expect.UUID, apiAttachment.UUID)
  50. assert.Equal(t, expect.Created.Unix(), apiAttachment.Created.Unix())
  51. assert.Equal(t, expect.DownloadURL, apiAttachment.DownloadURL)
  52. }
  53. func TestAPIListCommentAttachments(t *testing.T) {
  54. defer tests.PrepareTestEnv(t)()
  55. comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 2})
  56. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: comment.IssueID})
  57. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issue.RepoID})
  58. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  59. session := loginUser(t, repoOwner.Name)
  60. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadIssue)
  61. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d/assets?token=%s",
  62. repoOwner.Name, repo.Name, comment.ID, token)
  63. resp := session.MakeRequest(t, req, http.StatusOK)
  64. var apiAttachments []*api.Attachment
  65. DecodeJSON(t, resp, &apiAttachments)
  66. expectedCount := unittest.GetCount(t, &repo_model.Attachment{CommentID: comment.ID})
  67. assert.Len(t, apiAttachments, expectedCount)
  68. unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: apiAttachments[0].ID, CommentID: comment.ID})
  69. }
  70. func TestAPICreateCommentAttachment(t *testing.T) {
  71. defer tests.PrepareTestEnv(t)()
  72. comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 2})
  73. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: comment.IssueID})
  74. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issue.RepoID})
  75. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  76. session := loginUser(t, repoOwner.Name)
  77. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  78. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/comments/%d/assets?token=%s",
  79. repoOwner.Name, repo.Name, comment.ID, token)
  80. filename := "image.png"
  81. buff := generateImg()
  82. body := &bytes.Buffer{}
  83. // Setup multi-part
  84. writer := multipart.NewWriter(body)
  85. part, err := writer.CreateFormFile("attachment", filename)
  86. assert.NoError(t, err)
  87. _, err = io.Copy(part, &buff)
  88. assert.NoError(t, err)
  89. err = writer.Close()
  90. assert.NoError(t, err)
  91. req := NewRequestWithBody(t, "POST", urlStr, body)
  92. req.Header.Add("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 TestAPIEditCommentAttachment(t *testing.T) {
  99. defer tests.PrepareTestEnv(t)()
  100. const newAttachmentName = "newAttachmentName"
  101. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 6})
  102. comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: attachment.CommentID})
  103. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: comment.IssueID})
  104. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issue.RepoID})
  105. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  106. session := loginUser(t, repoOwner.Name)
  107. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  108. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/comments/%d/assets/%d?token=%s",
  109. repoOwner.Name, repo.Name, comment.ID, attachment.ID, token)
  110. req := NewRequestWithValues(t, "PATCH", urlStr, map[string]string{
  111. "name": newAttachmentName,
  112. })
  113. resp := session.MakeRequest(t, req, http.StatusCreated)
  114. apiAttachment := new(api.Attachment)
  115. DecodeJSON(t, resp, &apiAttachment)
  116. unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: apiAttachment.ID, CommentID: comment.ID, Name: apiAttachment.Name})
  117. }
  118. func TestAPIDeleteCommentAttachment(t *testing.T) {
  119. defer tests.PrepareTestEnv(t)()
  120. attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 6})
  121. comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: attachment.CommentID})
  122. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: comment.IssueID})
  123. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: issue.RepoID})
  124. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  125. session := loginUser(t, repoOwner.Name)
  126. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
  127. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/comments/%d/assets/%d?token=%s",
  128. repoOwner.Name, repo.Name, comment.ID, attachment.ID, token)
  129. req := NewRequestf(t, "DELETE", urlStr)
  130. session.MakeRequest(t, req, http.StatusNoContent)
  131. unittest.AssertNotExistsBean(t, &repo_model.Attachment{ID: attachment.ID, CommentID: comment.ID})
  132. }