2017-01-25 13:37:35 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2021-11-10 08:13:16 +03:00
package webhook
2017-01-25 13:37:35 +03:00
import (
2021-01-27 00:02:42 +03:00
"context"
2017-01-25 13:37:35 +03:00
"testing"
2021-01-27 00:02:42 +03:00
"time"
2017-01-25 13:37:35 +03:00
2021-09-19 14:49:59 +03:00
"code.gitea.io/gitea/models/db"
2021-11-12 17:36:47 +03:00
"code.gitea.io/gitea/models/unittest"
2021-07-24 19:03:58 +03:00
"code.gitea.io/gitea/modules/json"
2019-05-11 13:21:34 +03:00
api "code.gitea.io/gitea/modules/structs"
2021-08-12 15:43:08 +03:00
"code.gitea.io/gitea/modules/util"
2017-01-25 13:37:35 +03:00
"github.com/stretchr/testify/assert"
)
func TestHookContentType_Name ( t * testing . T ) {
assert . Equal ( t , "json" , ContentTypeJSON . Name ( ) )
assert . Equal ( t , "form" , ContentTypeForm . Name ( ) )
}
func TestIsValidHookContentType ( t * testing . T ) {
assert . True ( t , IsValidHookContentType ( "json" ) )
assert . True ( t , IsValidHookContentType ( "form" ) )
assert . False ( t , IsValidHookContentType ( "invalid" ) )
}
func TestWebhook_History ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-09-19 14:49:59 +03:00
webhook := db . AssertExistsAndLoadBean ( t , & Webhook { ID : 1 } ) . ( * Webhook )
2017-01-25 13:37:35 +03:00
tasks , err := webhook . History ( 0 )
assert . NoError ( t , err )
2017-08-28 12:17:45 +03:00
if assert . Len ( t , tasks , 1 ) {
assert . Equal ( t , int64 ( 1 ) , tasks [ 0 ] . ID )
}
2017-01-25 13:37:35 +03:00
2021-09-19 14:49:59 +03:00
webhook = db . AssertExistsAndLoadBean ( t , & Webhook { ID : 2 } ) . ( * Webhook )
2017-01-25 13:37:35 +03:00
tasks , err = webhook . History ( 0 )
assert . NoError ( t , err )
assert . Len ( t , tasks , 0 )
}
func TestWebhook_UpdateEvent ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-09-19 14:49:59 +03:00
webhook := db . AssertExistsAndLoadBean ( t , & Webhook { ID : 1 } ) . ( * Webhook )
2017-01-25 13:37:35 +03:00
hookEvent := & HookEvent {
PushOnly : true ,
SendEverything : false ,
ChooseEvents : false ,
HookEvents : HookEvents {
Create : false ,
Push : true ,
PullRequest : false ,
} ,
}
webhook . HookEvent = hookEvent
assert . NoError ( t , webhook . UpdateEvent ( ) )
assert . NotEmpty ( t , webhook . Events )
actualHookEvent := & HookEvent { }
assert . NoError ( t , json . Unmarshal ( [ ] byte ( webhook . Events ) , actualHookEvent ) )
assert . Equal ( t , * hookEvent , * actualHookEvent )
}
func TestWebhook_EventsArray ( t * testing . T ) {
2021-03-14 21:52:12 +03:00
assert . Equal ( t , [ ] string {
"create" , "delete" , "fork" , "push" ,
2020-03-06 08:10:48 +03:00
"issues" , "issue_assign" , "issue_label" , "issue_milestone" , "issue_comment" ,
"pull_request" , "pull_request_assign" , "pull_request_label" , "pull_request_milestone" ,
"pull_request_comment" , "pull_request_review_approved" , "pull_request_review_rejected" ,
2021-03-14 21:52:12 +03:00
"pull_request_review_comment" , "pull_request_sync" , "repository" , "release" ,
} ,
2017-01-25 13:37:35 +03:00
( & Webhook {
HookEvent : & HookEvent { SendEverything : true } ,
} ) . EventsArray ( ) ,
)
assert . Equal ( t , [ ] string { "push" } ,
( & Webhook {
HookEvent : & HookEvent { PushOnly : true } ,
} ) . EventsArray ( ) ,
)
}
func TestCreateWebhook ( t * testing . T ) {
hook := & Webhook {
RepoID : 3 ,
URL : "www.example.com/unit_test" ,
ContentType : ContentTypeJSON ,
Events : ` { "push_only":false,"send_everything":false,"choose_events":false,"events": { "create":false,"push":true,"pull_request":true}} ` ,
}
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , hook )
2021-11-10 08:13:16 +03:00
assert . NoError ( t , CreateWebhook ( db . DefaultContext , hook ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hook )
2017-01-25 13:37:35 +03:00
}
func TestGetWebhookByRepoID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-01-25 13:37:35 +03:00
hook , err := GetWebhookByRepoID ( 1 , 1 )
assert . NoError ( t , err )
assert . Equal ( t , int64 ( 1 ) , hook . ID )
2021-09-19 14:49:59 +03:00
_ , err = GetWebhookByRepoID ( db . NonexistentID , db . NonexistentID )
2017-01-25 13:37:35 +03:00
assert . Error ( t , err )
assert . True ( t , IsErrWebhookNotExist ( err ) )
}
func TestGetWebhookByOrgID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-01-25 13:37:35 +03:00
hook , err := GetWebhookByOrgID ( 3 , 3 )
assert . NoError ( t , err )
assert . Equal ( t , int64 ( 3 ) , hook . ID )
2021-09-19 14:49:59 +03:00
_ , err = GetWebhookByOrgID ( db . NonexistentID , db . NonexistentID )
2017-01-25 13:37:35 +03:00
assert . Error ( t , err )
assert . True ( t , IsErrWebhookNotExist ( err ) )
}
func TestGetActiveWebhooksByRepoID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-08-12 15:43:08 +03:00
hooks , err := ListWebhooksByOpts ( & ListWebhookOptions { RepoID : 1 , IsActive : util . OptionalBoolTrue } )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , err )
2017-08-28 12:17:45 +03:00
if assert . Len ( t , hooks , 1 ) {
assert . Equal ( t , int64 ( 1 ) , hooks [ 0 ] . ID )
assert . True ( t , hooks [ 0 ] . IsActive )
}
2017-01-25 13:37:35 +03:00
}
func TestGetWebhooksByRepoID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-08-12 15:43:08 +03:00
hooks , err := ListWebhooksByOpts ( & ListWebhookOptions { RepoID : 1 } )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , err )
2017-08-28 12:17:45 +03:00
if assert . Len ( t , hooks , 2 ) {
assert . Equal ( t , int64 ( 1 ) , hooks [ 0 ] . ID )
assert . Equal ( t , int64 ( 2 ) , hooks [ 1 ] . ID )
}
2017-01-25 13:37:35 +03:00
}
func TestGetActiveWebhooksByOrgID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-08-12 15:43:08 +03:00
hooks , err := ListWebhooksByOpts ( & ListWebhookOptions { OrgID : 3 , IsActive : util . OptionalBoolTrue } )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , err )
2017-08-28 12:17:45 +03:00
if assert . Len ( t , hooks , 1 ) {
assert . Equal ( t , int64 ( 3 ) , hooks [ 0 ] . ID )
assert . True ( t , hooks [ 0 ] . IsActive )
}
2017-01-25 13:37:35 +03:00
}
func TestGetWebhooksByOrgID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-08-12 15:43:08 +03:00
hooks , err := ListWebhooksByOpts ( & ListWebhookOptions { OrgID : 3 } )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , err )
2017-08-28 12:17:45 +03:00
if assert . Len ( t , hooks , 1 ) {
assert . Equal ( t , int64 ( 3 ) , hooks [ 0 ] . ID )
assert . True ( t , hooks [ 0 ] . IsActive )
}
2017-01-25 13:37:35 +03:00
}
func TestUpdateWebhook ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-09-19 14:49:59 +03:00
hook := db . AssertExistsAndLoadBean ( t , & Webhook { ID : 2 } ) . ( * Webhook )
2017-01-25 13:37:35 +03:00
hook . IsActive = true
hook . ContentType = ContentTypeForm
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , hook )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , UpdateWebhook ( hook ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hook )
2017-01-25 13:37:35 +03:00
}
func TestDeleteWebhookByRepoID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , & Webhook { ID : 2 , RepoID : 1 } )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , DeleteWebhookByRepoID ( 1 , 2 ) )
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , & Webhook { ID : 2 , RepoID : 1 } )
2017-01-25 13:37:35 +03:00
2021-09-19 14:49:59 +03:00
err := DeleteWebhookByRepoID ( db . NonexistentID , db . NonexistentID )
2017-01-25 13:37:35 +03:00
assert . Error ( t , err )
assert . True ( t , IsErrWebhookNotExist ( err ) )
}
func TestDeleteWebhookByOrgID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , & Webhook { ID : 3 , OrgID : 3 } )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , DeleteWebhookByOrgID ( 3 , 3 ) )
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , & Webhook { ID : 3 , OrgID : 3 } )
2017-01-25 13:37:35 +03:00
2021-09-19 14:49:59 +03:00
err := DeleteWebhookByOrgID ( db . NonexistentID , db . NonexistentID )
2017-01-25 13:37:35 +03:00
assert . Error ( t , err )
assert . True ( t , IsErrWebhookNotExist ( err ) )
}
func TestHookTasks ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-01-25 13:37:35 +03:00
hookTasks , err := HookTasks ( 1 , 1 )
assert . NoError ( t , err )
2017-08-28 12:17:45 +03:00
if assert . Len ( t , hookTasks , 1 ) {
assert . Equal ( t , int64 ( 1 ) , hookTasks [ 0 ] . ID )
}
2017-01-25 13:37:35 +03:00
2021-09-19 14:49:59 +03:00
hookTasks , err = HookTasks ( db . NonexistentID , 1 )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , err )
assert . Len ( t , hookTasks , 0 )
}
func TestCreateHookTask ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-01-25 13:37:35 +03:00
hookTask := & HookTask {
RepoID : 3 ,
HookID : 3 ,
Payloader : & api . PushPayload { } ,
}
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , hookTask )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , CreateHookTask ( hookTask ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hookTask )
2017-01-25 13:37:35 +03:00
}
func TestUpdateHookTask ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2017-01-25 13:37:35 +03:00
2021-09-19 14:49:59 +03:00
hook := db . AssertExistsAndLoadBean ( t , & HookTask { ID : 1 } ) . ( * HookTask )
2017-01-25 13:37:35 +03:00
hook . PayloadContent = "new payload content"
hook . DeliveredString = "new delivered string"
hook . IsDelivered = true
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , hook )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , UpdateHookTask ( hook ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hook )
2017-01-25 13:37:35 +03:00
}
2021-01-27 00:02:42 +03:00
func TestCleanupHookTaskTable_PerWebhook_DeletesDelivered ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-01-27 00:02:42 +03:00
hookTask := & HookTask {
RepoID : 3 ,
HookID : 3 ,
Payloader : & api . PushPayload { } ,
IsDelivered : true ,
Delivered : time . Now ( ) . UnixNano ( ) ,
}
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CreateHookTask ( hookTask ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CleanupHookTaskTable ( context . Background ( ) , PerWebhook , 168 * time . Hour , 0 ) )
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
}
func TestCleanupHookTaskTable_PerWebhook_LeavesUndelivered ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-01-27 00:02:42 +03:00
hookTask := & HookTask {
RepoID : 2 ,
HookID : 4 ,
Payloader : & api . PushPayload { } ,
IsDelivered : false ,
}
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CreateHookTask ( hookTask ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CleanupHookTaskTable ( context . Background ( ) , PerWebhook , 168 * time . Hour , 0 ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
}
func TestCleanupHookTaskTable_PerWebhook_LeavesMostRecentTask ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-01-27 00:02:42 +03:00
hookTask := & HookTask {
RepoID : 2 ,
HookID : 4 ,
Payloader : & api . PushPayload { } ,
IsDelivered : true ,
Delivered : time . Now ( ) . UnixNano ( ) ,
}
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CreateHookTask ( hookTask ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CleanupHookTaskTable ( context . Background ( ) , PerWebhook , 168 * time . Hour , 1 ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
}
func TestCleanupHookTaskTable_OlderThan_DeletesDelivered ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-01-27 00:02:42 +03:00
hookTask := & HookTask {
RepoID : 3 ,
HookID : 3 ,
Payloader : & api . PushPayload { } ,
IsDelivered : true ,
Delivered : time . Now ( ) . AddDate ( 0 , 0 , - 8 ) . UnixNano ( ) ,
}
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CreateHookTask ( hookTask ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CleanupHookTaskTable ( context . Background ( ) , OlderThan , 168 * time . Hour , 0 ) )
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
}
func TestCleanupHookTaskTable_OlderThan_LeavesUndelivered ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-01-27 00:02:42 +03:00
hookTask := & HookTask {
RepoID : 2 ,
HookID : 4 ,
Payloader : & api . PushPayload { } ,
IsDelivered : false ,
}
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CreateHookTask ( hookTask ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CleanupHookTaskTable ( context . Background ( ) , OlderThan , 168 * time . Hour , 0 ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
}
func TestCleanupHookTaskTable_OlderThan_LeavesTaskEarlierThanAgeToDelete ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-01-27 00:02:42 +03:00
hookTask := & HookTask {
RepoID : 2 ,
HookID : 4 ,
Payloader : & api . PushPayload { } ,
IsDelivered : true ,
Delivered : time . Now ( ) . AddDate ( 0 , 0 , - 6 ) . UnixNano ( ) ,
}
2021-09-19 14:49:59 +03:00
db . AssertNotExistsBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CreateHookTask ( hookTask ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CleanupHookTaskTable ( context . Background ( ) , OlderThan , 168 * time . Hour , 0 ) )
2021-09-19 14:49:59 +03:00
db . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
}