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.

webhook_test.go 9.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. // Copyright 2017 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 models
  5. import (
  6. "context"
  7. "testing"
  8. "time"
  9. "code.gitea.io/gitea/models/db"
  10. "code.gitea.io/gitea/modules/json"
  11. api "code.gitea.io/gitea/modules/structs"
  12. "code.gitea.io/gitea/modules/util"
  13. "github.com/stretchr/testify/assert"
  14. )
  15. func TestHookContentType_Name(t *testing.T) {
  16. assert.Equal(t, "json", ContentTypeJSON.Name())
  17. assert.Equal(t, "form", ContentTypeForm.Name())
  18. }
  19. func TestIsValidHookContentType(t *testing.T) {
  20. assert.True(t, IsValidHookContentType("json"))
  21. assert.True(t, IsValidHookContentType("form"))
  22. assert.False(t, IsValidHookContentType("invalid"))
  23. }
  24. func TestWebhook_History(t *testing.T) {
  25. assert.NoError(t, db.PrepareTestDatabase())
  26. webhook := db.AssertExistsAndLoadBean(t, &Webhook{ID: 1}).(*Webhook)
  27. tasks, err := webhook.History(0)
  28. assert.NoError(t, err)
  29. if assert.Len(t, tasks, 1) {
  30. assert.Equal(t, int64(1), tasks[0].ID)
  31. }
  32. webhook = db.AssertExistsAndLoadBean(t, &Webhook{ID: 2}).(*Webhook)
  33. tasks, err = webhook.History(0)
  34. assert.NoError(t, err)
  35. assert.Len(t, tasks, 0)
  36. }
  37. func TestWebhook_UpdateEvent(t *testing.T) {
  38. assert.NoError(t, db.PrepareTestDatabase())
  39. webhook := db.AssertExistsAndLoadBean(t, &Webhook{ID: 1}).(*Webhook)
  40. hookEvent := &HookEvent{
  41. PushOnly: true,
  42. SendEverything: false,
  43. ChooseEvents: false,
  44. HookEvents: HookEvents{
  45. Create: false,
  46. Push: true,
  47. PullRequest: false,
  48. },
  49. }
  50. webhook.HookEvent = hookEvent
  51. assert.NoError(t, webhook.UpdateEvent())
  52. assert.NotEmpty(t, webhook.Events)
  53. actualHookEvent := &HookEvent{}
  54. assert.NoError(t, json.Unmarshal([]byte(webhook.Events), actualHookEvent))
  55. assert.Equal(t, *hookEvent, *actualHookEvent)
  56. }
  57. func TestWebhook_EventsArray(t *testing.T) {
  58. assert.Equal(t, []string{
  59. "create", "delete", "fork", "push",
  60. "issues", "issue_assign", "issue_label", "issue_milestone", "issue_comment",
  61. "pull_request", "pull_request_assign", "pull_request_label", "pull_request_milestone",
  62. "pull_request_comment", "pull_request_review_approved", "pull_request_review_rejected",
  63. "pull_request_review_comment", "pull_request_sync", "repository", "release",
  64. },
  65. (&Webhook{
  66. HookEvent: &HookEvent{SendEverything: true},
  67. }).EventsArray(),
  68. )
  69. assert.Equal(t, []string{"push"},
  70. (&Webhook{
  71. HookEvent: &HookEvent{PushOnly: true},
  72. }).EventsArray(),
  73. )
  74. }
  75. func TestCreateWebhook(t *testing.T) {
  76. hook := &Webhook{
  77. RepoID: 3,
  78. URL: "www.example.com/unit_test",
  79. ContentType: ContentTypeJSON,
  80. Events: `{"push_only":false,"send_everything":false,"choose_events":false,"events":{"create":false,"push":true,"pull_request":true}}`,
  81. }
  82. db.AssertNotExistsBean(t, hook)
  83. assert.NoError(t, CreateWebhook(hook))
  84. db.AssertExistsAndLoadBean(t, hook)
  85. }
  86. func TestGetWebhookByRepoID(t *testing.T) {
  87. assert.NoError(t, db.PrepareTestDatabase())
  88. hook, err := GetWebhookByRepoID(1, 1)
  89. assert.NoError(t, err)
  90. assert.Equal(t, int64(1), hook.ID)
  91. _, err = GetWebhookByRepoID(db.NonexistentID, db.NonexistentID)
  92. assert.Error(t, err)
  93. assert.True(t, IsErrWebhookNotExist(err))
  94. }
  95. func TestGetWebhookByOrgID(t *testing.T) {
  96. assert.NoError(t, db.PrepareTestDatabase())
  97. hook, err := GetWebhookByOrgID(3, 3)
  98. assert.NoError(t, err)
  99. assert.Equal(t, int64(3), hook.ID)
  100. _, err = GetWebhookByOrgID(db.NonexistentID, db.NonexistentID)
  101. assert.Error(t, err)
  102. assert.True(t, IsErrWebhookNotExist(err))
  103. }
  104. func TestGetActiveWebhooksByRepoID(t *testing.T) {
  105. assert.NoError(t, db.PrepareTestDatabase())
  106. hooks, err := ListWebhooksByOpts(&ListWebhookOptions{RepoID: 1, IsActive: util.OptionalBoolTrue})
  107. assert.NoError(t, err)
  108. if assert.Len(t, hooks, 1) {
  109. assert.Equal(t, int64(1), hooks[0].ID)
  110. assert.True(t, hooks[0].IsActive)
  111. }
  112. }
  113. func TestGetWebhooksByRepoID(t *testing.T) {
  114. assert.NoError(t, db.PrepareTestDatabase())
  115. hooks, err := ListWebhooksByOpts(&ListWebhookOptions{RepoID: 1})
  116. assert.NoError(t, err)
  117. if assert.Len(t, hooks, 2) {
  118. assert.Equal(t, int64(1), hooks[0].ID)
  119. assert.Equal(t, int64(2), hooks[1].ID)
  120. }
  121. }
  122. func TestGetActiveWebhooksByOrgID(t *testing.T) {
  123. assert.NoError(t, db.PrepareTestDatabase())
  124. hooks, err := ListWebhooksByOpts(&ListWebhookOptions{OrgID: 3, IsActive: util.OptionalBoolTrue})
  125. assert.NoError(t, err)
  126. if assert.Len(t, hooks, 1) {
  127. assert.Equal(t, int64(3), hooks[0].ID)
  128. assert.True(t, hooks[0].IsActive)
  129. }
  130. }
  131. func TestGetWebhooksByOrgID(t *testing.T) {
  132. assert.NoError(t, db.PrepareTestDatabase())
  133. hooks, err := ListWebhooksByOpts(&ListWebhookOptions{OrgID: 3})
  134. assert.NoError(t, err)
  135. if assert.Len(t, hooks, 1) {
  136. assert.Equal(t, int64(3), hooks[0].ID)
  137. assert.True(t, hooks[0].IsActive)
  138. }
  139. }
  140. func TestUpdateWebhook(t *testing.T) {
  141. assert.NoError(t, db.PrepareTestDatabase())
  142. hook := db.AssertExistsAndLoadBean(t, &Webhook{ID: 2}).(*Webhook)
  143. hook.IsActive = true
  144. hook.ContentType = ContentTypeForm
  145. db.AssertNotExistsBean(t, hook)
  146. assert.NoError(t, UpdateWebhook(hook))
  147. db.AssertExistsAndLoadBean(t, hook)
  148. }
  149. func TestDeleteWebhookByRepoID(t *testing.T) {
  150. assert.NoError(t, db.PrepareTestDatabase())
  151. db.AssertExistsAndLoadBean(t, &Webhook{ID: 2, RepoID: 1})
  152. assert.NoError(t, DeleteWebhookByRepoID(1, 2))
  153. db.AssertNotExistsBean(t, &Webhook{ID: 2, RepoID: 1})
  154. err := DeleteWebhookByRepoID(db.NonexistentID, db.NonexistentID)
  155. assert.Error(t, err)
  156. assert.True(t, IsErrWebhookNotExist(err))
  157. }
  158. func TestDeleteWebhookByOrgID(t *testing.T) {
  159. assert.NoError(t, db.PrepareTestDatabase())
  160. db.AssertExistsAndLoadBean(t, &Webhook{ID: 3, OrgID: 3})
  161. assert.NoError(t, DeleteWebhookByOrgID(3, 3))
  162. db.AssertNotExistsBean(t, &Webhook{ID: 3, OrgID: 3})
  163. err := DeleteWebhookByOrgID(db.NonexistentID, db.NonexistentID)
  164. assert.Error(t, err)
  165. assert.True(t, IsErrWebhookNotExist(err))
  166. }
  167. func TestHookTasks(t *testing.T) {
  168. assert.NoError(t, db.PrepareTestDatabase())
  169. hookTasks, err := HookTasks(1, 1)
  170. assert.NoError(t, err)
  171. if assert.Len(t, hookTasks, 1) {
  172. assert.Equal(t, int64(1), hookTasks[0].ID)
  173. }
  174. hookTasks, err = HookTasks(db.NonexistentID, 1)
  175. assert.NoError(t, err)
  176. assert.Len(t, hookTasks, 0)
  177. }
  178. func TestCreateHookTask(t *testing.T) {
  179. assert.NoError(t, db.PrepareTestDatabase())
  180. hookTask := &HookTask{
  181. RepoID: 3,
  182. HookID: 3,
  183. Payloader: &api.PushPayload{},
  184. }
  185. db.AssertNotExistsBean(t, hookTask)
  186. assert.NoError(t, CreateHookTask(hookTask))
  187. db.AssertExistsAndLoadBean(t, hookTask)
  188. }
  189. func TestUpdateHookTask(t *testing.T) {
  190. assert.NoError(t, db.PrepareTestDatabase())
  191. hook := db.AssertExistsAndLoadBean(t, &HookTask{ID: 1}).(*HookTask)
  192. hook.PayloadContent = "new payload content"
  193. hook.DeliveredString = "new delivered string"
  194. hook.IsDelivered = true
  195. db.AssertNotExistsBean(t, hook)
  196. assert.NoError(t, UpdateHookTask(hook))
  197. db.AssertExistsAndLoadBean(t, hook)
  198. }
  199. func TestCleanupHookTaskTable_PerWebhook_DeletesDelivered(t *testing.T) {
  200. assert.NoError(t, db.PrepareTestDatabase())
  201. hookTask := &HookTask{
  202. RepoID: 3,
  203. HookID: 3,
  204. Payloader: &api.PushPayload{},
  205. IsDelivered: true,
  206. Delivered: time.Now().UnixNano(),
  207. }
  208. db.AssertNotExistsBean(t, hookTask)
  209. assert.NoError(t, CreateHookTask(hookTask))
  210. db.AssertExistsAndLoadBean(t, hookTask)
  211. assert.NoError(t, CleanupHookTaskTable(context.Background(), PerWebhook, 168*time.Hour, 0))
  212. db.AssertNotExistsBean(t, hookTask)
  213. }
  214. func TestCleanupHookTaskTable_PerWebhook_LeavesUndelivered(t *testing.T) {
  215. assert.NoError(t, db.PrepareTestDatabase())
  216. hookTask := &HookTask{
  217. RepoID: 2,
  218. HookID: 4,
  219. Payloader: &api.PushPayload{},
  220. IsDelivered: false,
  221. }
  222. db.AssertNotExistsBean(t, hookTask)
  223. assert.NoError(t, CreateHookTask(hookTask))
  224. db.AssertExistsAndLoadBean(t, hookTask)
  225. assert.NoError(t, CleanupHookTaskTable(context.Background(), PerWebhook, 168*time.Hour, 0))
  226. db.AssertExistsAndLoadBean(t, hookTask)
  227. }
  228. func TestCleanupHookTaskTable_PerWebhook_LeavesMostRecentTask(t *testing.T) {
  229. assert.NoError(t, db.PrepareTestDatabase())
  230. hookTask := &HookTask{
  231. RepoID: 2,
  232. HookID: 4,
  233. Payloader: &api.PushPayload{},
  234. IsDelivered: true,
  235. Delivered: time.Now().UnixNano(),
  236. }
  237. db.AssertNotExistsBean(t, hookTask)
  238. assert.NoError(t, CreateHookTask(hookTask))
  239. db.AssertExistsAndLoadBean(t, hookTask)
  240. assert.NoError(t, CleanupHookTaskTable(context.Background(), PerWebhook, 168*time.Hour, 1))
  241. db.AssertExistsAndLoadBean(t, hookTask)
  242. }
  243. func TestCleanupHookTaskTable_OlderThan_DeletesDelivered(t *testing.T) {
  244. assert.NoError(t, db.PrepareTestDatabase())
  245. hookTask := &HookTask{
  246. RepoID: 3,
  247. HookID: 3,
  248. Payloader: &api.PushPayload{},
  249. IsDelivered: true,
  250. Delivered: time.Now().AddDate(0, 0, -8).UnixNano(),
  251. }
  252. db.AssertNotExistsBean(t, hookTask)
  253. assert.NoError(t, CreateHookTask(hookTask))
  254. db.AssertExistsAndLoadBean(t, hookTask)
  255. assert.NoError(t, CleanupHookTaskTable(context.Background(), OlderThan, 168*time.Hour, 0))
  256. db.AssertNotExistsBean(t, hookTask)
  257. }
  258. func TestCleanupHookTaskTable_OlderThan_LeavesUndelivered(t *testing.T) {
  259. assert.NoError(t, db.PrepareTestDatabase())
  260. hookTask := &HookTask{
  261. RepoID: 2,
  262. HookID: 4,
  263. Payloader: &api.PushPayload{},
  264. IsDelivered: false,
  265. }
  266. db.AssertNotExistsBean(t, hookTask)
  267. assert.NoError(t, CreateHookTask(hookTask))
  268. db.AssertExistsAndLoadBean(t, hookTask)
  269. assert.NoError(t, CleanupHookTaskTable(context.Background(), OlderThan, 168*time.Hour, 0))
  270. db.AssertExistsAndLoadBean(t, hookTask)
  271. }
  272. func TestCleanupHookTaskTable_OlderThan_LeavesTaskEarlierThanAgeToDelete(t *testing.T) {
  273. assert.NoError(t, db.PrepareTestDatabase())
  274. hookTask := &HookTask{
  275. RepoID: 2,
  276. HookID: 4,
  277. Payloader: &api.PushPayload{},
  278. IsDelivered: true,
  279. Delivered: time.Now().AddDate(0, 0, -6).UnixNano(),
  280. }
  281. db.AssertNotExistsBean(t, hookTask)
  282. assert.NoError(t, CreateHookTask(hookTask))
  283. db.AssertExistsAndLoadBean(t, hookTask)
  284. assert.NoError(t, CleanupHookTaskTable(context.Background(), OlderThan, 168*time.Hour, 0))
  285. db.AssertExistsAndLoadBean(t, hookTask)
  286. }