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.

privateactivity_test.go 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. // Copyright 2020 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 integrations
  5. import (
  6. "fmt"
  7. "net/http"
  8. "testing"
  9. "code.gitea.io/gitea/models"
  10. "code.gitea.io/gitea/models/unittest"
  11. user_model "code.gitea.io/gitea/models/user"
  12. api "code.gitea.io/gitea/modules/structs"
  13. "github.com/stretchr/testify/assert"
  14. )
  15. const privateActivityTestAdmin = "user1"
  16. const privateActivityTestUser = "user2"
  17. // user3 is an organization so it is not usable here
  18. const privateActivityTestOtherUser = "user4"
  19. // activity helpers
  20. func testPrivateActivityDoSomethingForActionEntries(t *testing.T) {
  21. repoBefore := unittest.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
  22. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repoBefore.OwnerID}).(*user_model.User)
  23. session := loginUser(t, privateActivityTestUser)
  24. token := getTokenForLoggedInUser(t, session)
  25. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues?state=all&token=%s", owner.Name, repoBefore.Name, token)
  26. req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateIssueOption{
  27. Body: "test",
  28. Title: "test",
  29. })
  30. session.MakeRequest(t, req, http.StatusCreated)
  31. }
  32. // private activity helpers
  33. func testPrivateActivityHelperEnablePrivateActivity(t *testing.T) {
  34. session := loginUser(t, privateActivityTestUser)
  35. req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{
  36. "_csrf": GetCSRF(t, session, "/user/settings"),
  37. "name": privateActivityTestUser,
  38. "email": privateActivityTestUser + "@example.com",
  39. "language": "en-US",
  40. "keep_activity_private": "1",
  41. })
  42. session.MakeRequest(t, req, http.StatusFound)
  43. }
  44. func testPrivateActivityHelperHasVisibleActivitiesInHTMLDoc(htmlDoc *HTMLDoc) bool {
  45. return htmlDoc.doc.Find(".feeds").Find(".news").Length() > 0
  46. }
  47. func testPrivateActivityHelperHasVisibleActivitiesFromSession(t *testing.T, session *TestSession) bool {
  48. req := NewRequestf(t, "GET", "/%s?tab=activity", privateActivityTestUser)
  49. resp := session.MakeRequest(t, req, http.StatusOK)
  50. htmlDoc := NewHTMLParser(t, resp.Body)
  51. return testPrivateActivityHelperHasVisibleActivitiesInHTMLDoc(htmlDoc)
  52. }
  53. func testPrivateActivityHelperHasVisibleActivitiesFromPublic(t *testing.T) bool {
  54. req := NewRequestf(t, "GET", "/%s?tab=activity", privateActivityTestUser)
  55. resp := MakeRequest(t, req, http.StatusOK)
  56. htmlDoc := NewHTMLParser(t, resp.Body)
  57. return testPrivateActivityHelperHasVisibleActivitiesInHTMLDoc(htmlDoc)
  58. }
  59. // heatmap UI helpers
  60. func testPrivateActivityHelperHasVisibleHeatmapInHTMLDoc(htmlDoc *HTMLDoc) bool {
  61. return htmlDoc.doc.Find("#user-heatmap").Length() > 0
  62. }
  63. func testPrivateActivityHelperHasVisibleProfileHeatmapFromSession(t *testing.T, session *TestSession) bool {
  64. req := NewRequestf(t, "GET", "/%s?tab=activity", privateActivityTestUser)
  65. resp := session.MakeRequest(t, req, http.StatusOK)
  66. htmlDoc := NewHTMLParser(t, resp.Body)
  67. return testPrivateActivityHelperHasVisibleHeatmapInHTMLDoc(htmlDoc)
  68. }
  69. func testPrivateActivityHelperHasVisibleDashboardHeatmapFromSession(t *testing.T, session *TestSession) bool {
  70. req := NewRequest(t, "GET", "/")
  71. resp := session.MakeRequest(t, req, http.StatusOK)
  72. htmlDoc := NewHTMLParser(t, resp.Body)
  73. return testPrivateActivityHelperHasVisibleHeatmapInHTMLDoc(htmlDoc)
  74. }
  75. func testPrivateActivityHelperHasVisibleHeatmapFromPublic(t *testing.T) bool {
  76. req := NewRequestf(t, "GET", "/%s?tab=activity", privateActivityTestUser)
  77. resp := MakeRequest(t, req, http.StatusOK)
  78. htmlDoc := NewHTMLParser(t, resp.Body)
  79. return testPrivateActivityHelperHasVisibleHeatmapInHTMLDoc(htmlDoc)
  80. }
  81. // heatmap API helpers
  82. func testPrivateActivityHelperHasHeatmapContentFromPublic(t *testing.T) bool {
  83. req := NewRequestf(t, "GET", "/api/v1/users/%s/heatmap", privateActivityTestUser)
  84. resp := MakeRequest(t, req, http.StatusOK)
  85. var items []*models.UserHeatmapData
  86. DecodeJSON(t, resp, &items)
  87. return len(items) != 0
  88. }
  89. func testPrivateActivityHelperHasHeatmapContentFromSession(t *testing.T, session *TestSession) bool {
  90. token := getTokenForLoggedInUser(t, session)
  91. req := NewRequestf(t, "GET", "/api/v1/users/%s/heatmap?token=%s", privateActivityTestUser, token)
  92. resp := session.MakeRequest(t, req, http.StatusOK)
  93. var items []*models.UserHeatmapData
  94. DecodeJSON(t, resp, &items)
  95. return len(items) != 0
  96. }
  97. // check activity visibility if the visibility is enabled
  98. func TestPrivateActivityNoVisibleForPublic(t *testing.T) {
  99. defer prepareTestEnv(t)()
  100. testPrivateActivityDoSomethingForActionEntries(t)
  101. visible := testPrivateActivityHelperHasVisibleActivitiesFromPublic(t)
  102. assert.True(t, visible, "user should have visible activities")
  103. }
  104. func TestPrivateActivityNoVisibleForUserItself(t *testing.T) {
  105. defer prepareTestEnv(t)()
  106. testPrivateActivityDoSomethingForActionEntries(t)
  107. session := loginUser(t, privateActivityTestUser)
  108. visible := testPrivateActivityHelperHasVisibleActivitiesFromSession(t, session)
  109. assert.True(t, visible, "user should have visible activities")
  110. }
  111. func TestPrivateActivityNoVisibleForOtherUser(t *testing.T) {
  112. defer prepareTestEnv(t)()
  113. testPrivateActivityDoSomethingForActionEntries(t)
  114. session := loginUser(t, privateActivityTestOtherUser)
  115. visible := testPrivateActivityHelperHasVisibleActivitiesFromSession(t, session)
  116. assert.True(t, visible, "user should have visible activities")
  117. }
  118. func TestPrivateActivityNoVisibleForAdmin(t *testing.T) {
  119. defer prepareTestEnv(t)()
  120. testPrivateActivityDoSomethingForActionEntries(t)
  121. session := loginUser(t, privateActivityTestAdmin)
  122. visible := testPrivateActivityHelperHasVisibleActivitiesFromSession(t, session)
  123. assert.True(t, visible, "user should have visible activities")
  124. }
  125. // check activity visibility if the visibility is disabled
  126. func TestPrivateActivityYesInvisibleForPublic(t *testing.T) {
  127. defer prepareTestEnv(t)()
  128. testPrivateActivityDoSomethingForActionEntries(t)
  129. testPrivateActivityHelperEnablePrivateActivity(t)
  130. visible := testPrivateActivityHelperHasVisibleActivitiesFromPublic(t)
  131. assert.False(t, visible, "user should have no visible activities")
  132. }
  133. func TestPrivateActivityYesVisibleForUserItself(t *testing.T) {
  134. defer prepareTestEnv(t)()
  135. testPrivateActivityDoSomethingForActionEntries(t)
  136. testPrivateActivityHelperEnablePrivateActivity(t)
  137. session := loginUser(t, privateActivityTestUser)
  138. visible := testPrivateActivityHelperHasVisibleActivitiesFromSession(t, session)
  139. assert.True(t, visible, "user should have visible activities")
  140. }
  141. func TestPrivateActivityYesInvisibleForOtherUser(t *testing.T) {
  142. defer prepareTestEnv(t)()
  143. testPrivateActivityDoSomethingForActionEntries(t)
  144. testPrivateActivityHelperEnablePrivateActivity(t)
  145. session := loginUser(t, privateActivityTestOtherUser)
  146. visible := testPrivateActivityHelperHasVisibleActivitiesFromSession(t, session)
  147. assert.False(t, visible, "user should have no visible activities")
  148. }
  149. func TestPrivateActivityYesVisibleForAdmin(t *testing.T) {
  150. defer prepareTestEnv(t)()
  151. testPrivateActivityDoSomethingForActionEntries(t)
  152. testPrivateActivityHelperEnablePrivateActivity(t)
  153. session := loginUser(t, privateActivityTestAdmin)
  154. visible := testPrivateActivityHelperHasVisibleActivitiesFromSession(t, session)
  155. assert.True(t, visible, "user should have visible activities")
  156. }
  157. // check heatmap visibility if the visibility is enabled
  158. func TestPrivateActivityNoHeatmapVisibleForPublic(t *testing.T) {
  159. defer prepareTestEnv(t)()
  160. testPrivateActivityDoSomethingForActionEntries(t)
  161. visible := testPrivateActivityHelperHasVisibleHeatmapFromPublic(t)
  162. assert.True(t, visible, "user should have visible heatmap")
  163. }
  164. func TestPrivateActivityNoHeatmapVisibleForUserItselfAtProfile(t *testing.T) {
  165. defer prepareTestEnv(t)()
  166. testPrivateActivityDoSomethingForActionEntries(t)
  167. session := loginUser(t, privateActivityTestUser)
  168. visible := testPrivateActivityHelperHasVisibleProfileHeatmapFromSession(t, session)
  169. assert.True(t, visible, "user should have visible heatmap")
  170. }
  171. func TestPrivateActivityNoHeatmapVisibleForUserItselfAtDashboard(t *testing.T) {
  172. defer prepareTestEnv(t)()
  173. testPrivateActivityDoSomethingForActionEntries(t)
  174. session := loginUser(t, privateActivityTestUser)
  175. visible := testPrivateActivityHelperHasVisibleDashboardHeatmapFromSession(t, session)
  176. assert.True(t, visible, "user should have visible heatmap")
  177. }
  178. func TestPrivateActivityNoHeatmapVisibleForOtherUser(t *testing.T) {
  179. defer prepareTestEnv(t)()
  180. testPrivateActivityDoSomethingForActionEntries(t)
  181. session := loginUser(t, privateActivityTestOtherUser)
  182. visible := testPrivateActivityHelperHasVisibleProfileHeatmapFromSession(t, session)
  183. assert.True(t, visible, "user should have visible heatmap")
  184. }
  185. func TestPrivateActivityNoHeatmapVisibleForAdmin(t *testing.T) {
  186. defer prepareTestEnv(t)()
  187. testPrivateActivityDoSomethingForActionEntries(t)
  188. session := loginUser(t, privateActivityTestAdmin)
  189. visible := testPrivateActivityHelperHasVisibleProfileHeatmapFromSession(t, session)
  190. assert.True(t, visible, "user should have visible heatmap")
  191. }
  192. // check heatmap visibility if the visibility is disabled
  193. func TestPrivateActivityYesHeatmapInvisibleForPublic(t *testing.T) {
  194. defer prepareTestEnv(t)()
  195. testPrivateActivityDoSomethingForActionEntries(t)
  196. testPrivateActivityHelperEnablePrivateActivity(t)
  197. visible := testPrivateActivityHelperHasVisibleHeatmapFromPublic(t)
  198. assert.False(t, visible, "user should have no visible heatmap")
  199. }
  200. func TestPrivateActivityYesHeatmapVisibleForUserItselfAtProfile(t *testing.T) {
  201. defer prepareTestEnv(t)()
  202. testPrivateActivityDoSomethingForActionEntries(t)
  203. testPrivateActivityHelperEnablePrivateActivity(t)
  204. session := loginUser(t, privateActivityTestUser)
  205. visible := testPrivateActivityHelperHasVisibleProfileHeatmapFromSession(t, session)
  206. assert.True(t, visible, "user should have visible heatmap")
  207. }
  208. func TestPrivateActivityYesHeatmapVisibleForUserItselfAtDashboard(t *testing.T) {
  209. defer prepareTestEnv(t)()
  210. testPrivateActivityDoSomethingForActionEntries(t)
  211. testPrivateActivityHelperEnablePrivateActivity(t)
  212. session := loginUser(t, privateActivityTestUser)
  213. visible := testPrivateActivityHelperHasVisibleDashboardHeatmapFromSession(t, session)
  214. assert.True(t, visible, "user should have visible heatmap")
  215. }
  216. func TestPrivateActivityYesHeatmapInvisibleForOtherUser(t *testing.T) {
  217. defer prepareTestEnv(t)()
  218. testPrivateActivityDoSomethingForActionEntries(t)
  219. testPrivateActivityHelperEnablePrivateActivity(t)
  220. session := loginUser(t, privateActivityTestOtherUser)
  221. visible := testPrivateActivityHelperHasVisibleProfileHeatmapFromSession(t, session)
  222. assert.False(t, visible, "user should have no visible heatmap")
  223. }
  224. func TestPrivateActivityYesHeatmapVisibleForAdmin(t *testing.T) {
  225. defer prepareTestEnv(t)()
  226. testPrivateActivityDoSomethingForActionEntries(t)
  227. testPrivateActivityHelperEnablePrivateActivity(t)
  228. session := loginUser(t, privateActivityTestAdmin)
  229. visible := testPrivateActivityHelperHasVisibleProfileHeatmapFromSession(t, session)
  230. assert.True(t, visible, "user should have visible heatmap")
  231. }
  232. // check heatmap api provides content if the visibility is enabled
  233. func TestPrivateActivityNoHeatmapHasContentForPublic(t *testing.T) {
  234. defer prepareTestEnv(t)()
  235. testPrivateActivityDoSomethingForActionEntries(t)
  236. hasContent := testPrivateActivityHelperHasHeatmapContentFromPublic(t)
  237. assert.True(t, hasContent, "user should have heatmap content")
  238. }
  239. func TestPrivateActivityNoHeatmapHasContentForUserItself(t *testing.T) {
  240. defer prepareTestEnv(t)()
  241. testPrivateActivityDoSomethingForActionEntries(t)
  242. session := loginUser(t, privateActivityTestUser)
  243. hasContent := testPrivateActivityHelperHasHeatmapContentFromSession(t, session)
  244. assert.True(t, hasContent, "user should have heatmap content")
  245. }
  246. func TestPrivateActivityNoHeatmapHasContentForOtherUser(t *testing.T) {
  247. defer prepareTestEnv(t)()
  248. testPrivateActivityDoSomethingForActionEntries(t)
  249. session := loginUser(t, privateActivityTestOtherUser)
  250. hasContent := testPrivateActivityHelperHasHeatmapContentFromSession(t, session)
  251. assert.True(t, hasContent, "user should have heatmap content")
  252. }
  253. func TestPrivateActivityNoHeatmapHasContentForAdmin(t *testing.T) {
  254. defer prepareTestEnv(t)()
  255. testPrivateActivityDoSomethingForActionEntries(t)
  256. session := loginUser(t, privateActivityTestAdmin)
  257. hasContent := testPrivateActivityHelperHasHeatmapContentFromSession(t, session)
  258. assert.True(t, hasContent, "user should have heatmap content")
  259. }
  260. // check heatmap api provides no content if the visibility is disabled
  261. // this should be equal to the hidden heatmap at the UI
  262. func TestPrivateActivityYesHeatmapHasNoContentForPublic(t *testing.T) {
  263. defer prepareTestEnv(t)()
  264. testPrivateActivityDoSomethingForActionEntries(t)
  265. testPrivateActivityHelperEnablePrivateActivity(t)
  266. hasContent := testPrivateActivityHelperHasHeatmapContentFromPublic(t)
  267. assert.False(t, hasContent, "user should have no heatmap content")
  268. }
  269. func TestPrivateActivityYesHeatmapHasNoContentForUserItself(t *testing.T) {
  270. defer prepareTestEnv(t)()
  271. testPrivateActivityDoSomethingForActionEntries(t)
  272. testPrivateActivityHelperEnablePrivateActivity(t)
  273. session := loginUser(t, privateActivityTestUser)
  274. hasContent := testPrivateActivityHelperHasHeatmapContentFromSession(t, session)
  275. assert.True(t, hasContent, "user should see their own heatmap content")
  276. }
  277. func TestPrivateActivityYesHeatmapHasNoContentForOtherUser(t *testing.T) {
  278. defer prepareTestEnv(t)()
  279. testPrivateActivityDoSomethingForActionEntries(t)
  280. testPrivateActivityHelperEnablePrivateActivity(t)
  281. session := loginUser(t, privateActivityTestOtherUser)
  282. hasContent := testPrivateActivityHelperHasHeatmapContentFromSession(t, session)
  283. assert.False(t, hasContent, "other user should not see heatmap content")
  284. }
  285. func TestPrivateActivityYesHeatmapHasNoContentForAdmin(t *testing.T) {
  286. defer prepareTestEnv(t)()
  287. testPrivateActivityDoSomethingForActionEntries(t)
  288. testPrivateActivityHelperEnablePrivateActivity(t)
  289. session := loginUser(t, privateActivityTestAdmin)
  290. hasContent := testPrivateActivityHelperHasHeatmapContentFromSession(t, session)
  291. assert.True(t, hasContent, "heatmap should show content for admin")
  292. }