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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "fmt"
  6. "net/http"
  7. "testing"
  8. activities_model "code.gitea.io/gitea/models/activities"
  9. "code.gitea.io/gitea/models/db"
  10. repo_model "code.gitea.io/gitea/models/repo"
  11. "code.gitea.io/gitea/models/unittest"
  12. user_model "code.gitea.io/gitea/models/user"
  13. api "code.gitea.io/gitea/modules/structs"
  14. "code.gitea.io/gitea/tests"
  15. "github.com/stretchr/testify/assert"
  16. )
  17. func TestAPINotification(t *testing.T) {
  18. defer tests.PrepareTestEnv(t)()
  19. user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  20. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  21. thread5 := unittest.AssertExistsAndLoadBean(t, &activities_model.Notification{ID: 5})
  22. assert.NoError(t, thread5.LoadAttributes(db.DefaultContext))
  23. session := loginUser(t, user2.Name)
  24. token := getTokenForLoggedInUser(t, session)
  25. // -- GET /notifications --
  26. // test filter
  27. since := "2000-01-01T00%3A50%3A01%2B00%3A00" // 946687801
  28. req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/notifications?since=%s&token=%s", since, token))
  29. resp := session.MakeRequest(t, req, http.StatusOK)
  30. var apiNL []api.NotificationThread
  31. DecodeJSON(t, resp, &apiNL)
  32. assert.Len(t, apiNL, 1)
  33. assert.EqualValues(t, 5, apiNL[0].ID)
  34. // test filter
  35. before := "2000-01-01T01%3A06%3A59%2B00%3A00" // 946688819
  36. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/notifications?all=%s&before=%s&token=%s", "true", before, token))
  37. resp = session.MakeRequest(t, req, http.StatusOK)
  38. DecodeJSON(t, resp, &apiNL)
  39. assert.Len(t, apiNL, 3)
  40. assert.EqualValues(t, 4, apiNL[0].ID)
  41. assert.True(t, apiNL[0].Unread)
  42. assert.False(t, apiNL[0].Pinned)
  43. assert.EqualValues(t, 3, apiNL[1].ID)
  44. assert.False(t, apiNL[1].Unread)
  45. assert.True(t, apiNL[1].Pinned)
  46. assert.EqualValues(t, 2, apiNL[2].ID)
  47. assert.False(t, apiNL[2].Unread)
  48. assert.False(t, apiNL[2].Pinned)
  49. // -- GET /repos/{owner}/{repo}/notifications --
  50. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/notifications?status-types=unread&token=%s", user2.Name, repo1.Name, token))
  51. resp = session.MakeRequest(t, req, http.StatusOK)
  52. DecodeJSON(t, resp, &apiNL)
  53. assert.Len(t, apiNL, 1)
  54. assert.EqualValues(t, 4, apiNL[0].ID)
  55. // -- GET /repos/{owner}/{repo}/notifications -- multiple status-types
  56. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/notifications?status-types=unread&status-types=pinned&token=%s", user2.Name, repo1.Name, token))
  57. resp = session.MakeRequest(t, req, http.StatusOK)
  58. DecodeJSON(t, resp, &apiNL)
  59. assert.Len(t, apiNL, 2)
  60. assert.EqualValues(t, 4, apiNL[0].ID)
  61. assert.True(t, apiNL[0].Unread)
  62. assert.False(t, apiNL[0].Pinned)
  63. assert.EqualValues(t, 3, apiNL[1].ID)
  64. assert.False(t, apiNL[1].Unread)
  65. assert.True(t, apiNL[1].Pinned)
  66. // -- GET /notifications/threads/{id} --
  67. // get forbidden
  68. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/notifications/threads/%d?token=%s", 1, token))
  69. session.MakeRequest(t, req, http.StatusForbidden)
  70. // get own
  71. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/notifications/threads/%d?token=%s", thread5.ID, token))
  72. resp = session.MakeRequest(t, req, http.StatusOK)
  73. var apiN api.NotificationThread
  74. DecodeJSON(t, resp, &apiN)
  75. assert.EqualValues(t, 5, apiN.ID)
  76. assert.False(t, apiN.Pinned)
  77. assert.True(t, apiN.Unread)
  78. assert.EqualValues(t, "issue4", apiN.Subject.Title)
  79. assert.EqualValues(t, "Issue", apiN.Subject.Type)
  80. assert.EqualValues(t, thread5.Issue.APIURL(), apiN.Subject.URL)
  81. assert.EqualValues(t, thread5.Repository.HTMLURL(), apiN.Repository.HTMLURL)
  82. new := struct {
  83. New int64 `json:"new"`
  84. }{}
  85. // -- check notifications --
  86. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/notifications/new?token=%s", token))
  87. resp = session.MakeRequest(t, req, http.StatusOK)
  88. DecodeJSON(t, resp, &new)
  89. assert.True(t, new.New > 0)
  90. // -- mark notifications as read --
  91. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/notifications?status-types=unread&token=%s", token))
  92. resp = session.MakeRequest(t, req, http.StatusOK)
  93. DecodeJSON(t, resp, &apiNL)
  94. assert.Len(t, apiNL, 2)
  95. lastReadAt := "2000-01-01T00%3A50%3A01%2B00%3A00" // 946687801 <- only Notification 4 is in this filter ...
  96. req = NewRequest(t, "PUT", fmt.Sprintf("/api/v1/repos/%s/%s/notifications?last_read_at=%s&token=%s", user2.Name, repo1.Name, lastReadAt, token))
  97. session.MakeRequest(t, req, http.StatusResetContent)
  98. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/notifications?status-types=unread&token=%s", token))
  99. resp = session.MakeRequest(t, req, http.StatusOK)
  100. DecodeJSON(t, resp, &apiNL)
  101. assert.Len(t, apiNL, 1)
  102. // -- PATCH /notifications/threads/{id} --
  103. req = NewRequest(t, "PATCH", fmt.Sprintf("/api/v1/notifications/threads/%d?token=%s", thread5.ID, token))
  104. session.MakeRequest(t, req, http.StatusResetContent)
  105. assert.Equal(t, activities_model.NotificationStatusUnread, thread5.Status)
  106. thread5 = unittest.AssertExistsAndLoadBean(t, &activities_model.Notification{ID: 5})
  107. assert.Equal(t, activities_model.NotificationStatusRead, thread5.Status)
  108. // -- check notifications --
  109. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/notifications/new?token=%s", token))
  110. resp = session.MakeRequest(t, req, http.StatusOK)
  111. DecodeJSON(t, resp, &new)
  112. assert.True(t, new.New == 0)
  113. }
  114. func TestAPINotificationPUT(t *testing.T) {
  115. defer tests.PrepareTestEnv(t)()
  116. user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  117. thread5 := unittest.AssertExistsAndLoadBean(t, &activities_model.Notification{ID: 5})
  118. assert.NoError(t, thread5.LoadAttributes(db.DefaultContext))
  119. session := loginUser(t, user2.Name)
  120. token := getTokenForLoggedInUser(t, session)
  121. // Check notifications are as expected
  122. req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/notifications?all=true&token=%s", token))
  123. resp := session.MakeRequest(t, req, http.StatusOK)
  124. var apiNL []api.NotificationThread
  125. DecodeJSON(t, resp, &apiNL)
  126. assert.Len(t, apiNL, 4)
  127. assert.EqualValues(t, 5, apiNL[0].ID)
  128. assert.True(t, apiNL[0].Unread)
  129. assert.False(t, apiNL[0].Pinned)
  130. assert.EqualValues(t, 4, apiNL[1].ID)
  131. assert.True(t, apiNL[1].Unread)
  132. assert.False(t, apiNL[1].Pinned)
  133. assert.EqualValues(t, 3, apiNL[2].ID)
  134. assert.False(t, apiNL[2].Unread)
  135. assert.True(t, apiNL[2].Pinned)
  136. assert.EqualValues(t, 2, apiNL[3].ID)
  137. assert.False(t, apiNL[3].Unread)
  138. assert.False(t, apiNL[3].Pinned)
  139. //
  140. // Notification ID 2 is the only one with status-type read & pinned
  141. // change it to unread.
  142. //
  143. req = NewRequest(t, "PUT", fmt.Sprintf("/api/v1/notifications?status-types=read&status-type=pinned&to-status=unread&token=%s", token))
  144. resp = session.MakeRequest(t, req, http.StatusResetContent)
  145. DecodeJSON(t, resp, &apiNL)
  146. assert.Len(t, apiNL, 1)
  147. assert.EqualValues(t, 2, apiNL[0].ID)
  148. assert.True(t, apiNL[0].Unread)
  149. assert.False(t, apiNL[0].Pinned)
  150. //
  151. // Now nofication ID 2 is the first in the list and is unread.
  152. //
  153. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/notifications?all=true&token=%s", token))
  154. resp = session.MakeRequest(t, req, http.StatusOK)
  155. DecodeJSON(t, resp, &apiNL)
  156. assert.Len(t, apiNL, 4)
  157. assert.EqualValues(t, 2, apiNL[0].ID)
  158. assert.True(t, apiNL[0].Unread)
  159. assert.False(t, apiNL[0].Pinned)
  160. }