2017-01-25 13:37:35 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2017-01-25 13:37:35 +03:00
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"
2024-03-02 18:42:31 +03:00
"code.gitea.io/gitea/modules/optional"
2023-05-04 02:53:43 +03:00
"code.gitea.io/gitea/modules/timeutil"
2023-01-01 18:23:15 +03:00
webhook_module "code.gitea.io/gitea/modules/webhook"
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 ( ) )
2022-08-16 05:22:25 +03:00
webhook := unittest . AssertExistsAndLoadBean ( t , & Webhook { ID : 1 } )
2023-10-14 11:37:24 +03:00
tasks , err := webhook . History ( db . DefaultContext , 0 )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , err )
2024-03-08 01:18:38 +03:00
if assert . Len ( t , tasks , 3 ) {
assert . Equal ( t , int64 ( 3 ) , tasks [ 0 ] . ID )
assert . Equal ( t , int64 ( 2 ) , tasks [ 1 ] . ID )
assert . Equal ( t , int64 ( 1 ) , tasks [ 2 ] . ID )
2017-08-28 12:17:45 +03:00
}
2017-01-25 13:37:35 +03:00
2022-08-16 05:22:25 +03:00
webhook = unittest . AssertExistsAndLoadBean ( t , & Webhook { ID : 2 } )
2023-10-14 11:37:24 +03:00
tasks , err = webhook . History ( db . DefaultContext , 0 )
2017-01-25 13:37:35 +03:00
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 ( ) )
2022-08-16 05:22:25 +03:00
webhook := unittest . AssertExistsAndLoadBean ( t , & Webhook { ID : 1 } )
2023-01-01 18:23:15 +03:00
hookEvent := & webhook_module . HookEvent {
2017-01-25 13:37:35 +03:00
PushOnly : true ,
SendEverything : false ,
ChooseEvents : false ,
2023-01-01 18:23:15 +03:00
HookEvents : webhook_module . HookEvents {
2017-01-25 13:37:35 +03:00
Create : false ,
Push : true ,
PullRequest : false ,
} ,
}
webhook . HookEvent = hookEvent
assert . NoError ( t , webhook . UpdateEvent ( ) )
assert . NotEmpty ( t , webhook . Events )
2023-01-01 18:23:15 +03:00
actualHookEvent := & webhook_module . HookEvent { }
2017-01-25 13:37:35 +03:00
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" ,
2022-09-04 22:54:23 +03:00
"pull_request_review_comment" , "pull_request_sync" , "wiki" , "repository" , "release" ,
2023-05-25 05:06:27 +03:00
"package" , "pull_request_review_request" ,
2021-03-14 21:52:12 +03:00
} ,
2017-01-25 13:37:35 +03:00
( & Webhook {
2023-01-01 18:23:15 +03:00
HookEvent : & webhook_module . HookEvent { SendEverything : true } ,
2017-01-25 13:37:35 +03:00
} ) . EventsArray ( ) ,
)
assert . Equal ( t , [ ] string { "push" } ,
( & Webhook {
2023-01-01 18:23:15 +03:00
HookEvent : & webhook_module . HookEvent { PushOnly : true } ,
2017-01-25 13:37:35 +03:00
} ) . 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-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , hook )
2021-11-10 08:13:16 +03:00
assert . NoError ( t , CreateWebhook ( db . DefaultContext , hook ) )
2021-11-16 11:53:21 +03:00
unittest . 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 ( ) )
2023-10-14 11:37:24 +03:00
hook , err := GetWebhookByRepoID ( db . DefaultContext , 1 , 1 )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , err )
assert . Equal ( t , int64 ( 1 ) , hook . ID )
2023-10-14 11:37:24 +03:00
_ , err = GetWebhookByRepoID ( db . DefaultContext , unittest . NonexistentID , unittest . NonexistentID )
2017-01-25 13:37:35 +03:00
assert . Error ( t , err )
assert . True ( t , IsErrWebhookNotExist ( err ) )
}
2023-03-10 17:28:32 +03:00
func TestGetWebhookByOwnerID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2023-10-14 11:37:24 +03:00
hook , err := GetWebhookByOwnerID ( db . DefaultContext , 3 , 3 )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , err )
assert . Equal ( t , int64 ( 3 ) , hook . ID )
2023-10-14 11:37:24 +03:00
_ , err = GetWebhookByOwnerID ( db . DefaultContext , unittest . NonexistentID , unittest . 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 ( ) )
2024-03-02 18:42:31 +03:00
hooks , err := db . Find [ Webhook ] ( db . DefaultContext , ListWebhookOptions { RepoID : 1 , IsActive : optional . Some ( true ) } )
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 ( ) )
2023-11-24 06:49:41 +03:00
hooks , err := db . Find [ Webhook ] ( db . DefaultContext , 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
}
2023-03-10 17:28:32 +03:00
func TestGetActiveWebhooksByOwnerID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2024-03-02 18:42:31 +03:00
hooks , err := db . Find [ Webhook ] ( db . DefaultContext , ListWebhookOptions { OwnerID : 3 , IsActive : optional . Some ( true ) } )
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
}
2023-03-10 17:28:32 +03:00
func TestGetWebhooksByOwnerID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2023-11-24 06:49:41 +03:00
hooks , err := db . Find [ Webhook ] ( db . DefaultContext , ListWebhookOptions { OwnerID : 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 ( ) )
2022-08-16 05:22:25 +03:00
hook := unittest . AssertExistsAndLoadBean ( t , & Webhook { ID : 2 } )
2017-01-25 13:37:35 +03:00
hook . IsActive = true
hook . ContentType = ContentTypeForm
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , hook )
2023-10-14 11:37:24 +03:00
assert . NoError ( t , UpdateWebhook ( db . DefaultContext , hook ) )
2021-11-16 11:53:21 +03:00
unittest . 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-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , & Webhook { ID : 2 , RepoID : 1 } )
2023-10-14 11:37:24 +03:00
assert . NoError ( t , DeleteWebhookByRepoID ( db . DefaultContext , 1 , 2 ) )
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , & Webhook { ID : 2 , RepoID : 1 } )
2017-01-25 13:37:35 +03:00
2023-10-14 11:37:24 +03:00
err := DeleteWebhookByRepoID ( db . DefaultContext , unittest . NonexistentID , unittest . NonexistentID )
2017-01-25 13:37:35 +03:00
assert . Error ( t , err )
assert . True ( t , IsErrWebhookNotExist ( err ) )
}
2023-03-10 17:28:32 +03:00
func TestDeleteWebhookByOwnerID ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2023-03-10 17:28:32 +03:00
unittest . AssertExistsAndLoadBean ( t , & Webhook { ID : 3 , OwnerID : 3 } )
2023-10-14 11:37:24 +03:00
assert . NoError ( t , DeleteWebhookByOwnerID ( db . DefaultContext , 3 , 3 ) )
2023-03-10 17:28:32 +03:00
unittest . AssertNotExistsBean ( t , & Webhook { ID : 3 , OwnerID : 3 } )
2017-01-25 13:37:35 +03:00
2023-10-14 11:37:24 +03:00
err := DeleteWebhookByOwnerID ( db . DefaultContext , unittest . NonexistentID , unittest . 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 ( ) )
2023-10-14 11:37:24 +03:00
hookTasks , err := HookTasks ( db . DefaultContext , 1 , 1 )
2017-01-25 13:37:35 +03:00
assert . NoError ( t , err )
2024-03-08 01:18:38 +03:00
if assert . Len ( t , hookTasks , 3 ) {
assert . Equal ( t , int64 ( 3 ) , hookTasks [ 0 ] . ID )
assert . Equal ( t , int64 ( 2 ) , hookTasks [ 1 ] . ID )
assert . Equal ( t , int64 ( 1 ) , hookTasks [ 2 ] . ID )
2017-08-28 12:17:45 +03:00
}
2017-01-25 13:37:35 +03:00
2023-10-14 11:37:24 +03:00
hookTasks , err = HookTasks ( db . DefaultContext , unittest . 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 {
2024-03-08 01:18:38 +03:00
HookID : 3 ,
PayloadVersion : 2 ,
2017-01-25 13:37:35 +03:00
}
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , hookTask )
2022-10-21 19:21:56 +03:00
_ , err := CreateHookTask ( db . DefaultContext , hookTask )
assert . NoError ( t , err )
2021-11-16 11:53:21 +03:00
unittest . 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
2022-08-16 05:22:25 +03:00
hook := unittest . AssertExistsAndLoadBean ( t , & HookTask { ID : 1 } )
2017-01-25 13:37:35 +03:00
hook . PayloadContent = "new payload content"
hook . IsDelivered = true
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , hook )
2023-10-14 11:37:24 +03:00
assert . NoError ( t , UpdateHookTask ( db . DefaultContext , hook ) )
2021-11-16 11:53:21 +03:00
unittest . 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 {
2024-03-08 01:18:38 +03:00
HookID : 3 ,
IsDelivered : true ,
Delivered : timeutil . TimeStampNanoNow ( ) ,
PayloadVersion : 2 ,
2021-01-27 00:02:42 +03:00
}
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , hookTask )
2022-10-21 19:21:56 +03:00
_ , err := CreateHookTask ( db . DefaultContext , hookTask )
assert . NoError ( t , err )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CleanupHookTaskTable ( context . Background ( ) , PerWebhook , 168 * time . Hour , 0 ) )
2021-11-16 11:53:21 +03:00
unittest . 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 {
2024-03-08 01:18:38 +03:00
HookID : 4 ,
IsDelivered : false ,
PayloadVersion : 2 ,
2021-01-27 00:02:42 +03:00
}
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , hookTask )
2022-10-21 19:21:56 +03:00
_ , err := CreateHookTask ( db . DefaultContext , hookTask )
assert . NoError ( t , err )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CleanupHookTaskTable ( context . Background ( ) , PerWebhook , 168 * time . Hour , 0 ) )
2021-11-16 11:53:21 +03:00
unittest . 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 {
2024-03-08 01:18:38 +03:00
HookID : 4 ,
IsDelivered : true ,
Delivered : timeutil . TimeStampNanoNow ( ) ,
PayloadVersion : 2 ,
2021-01-27 00:02:42 +03:00
}
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , hookTask )
2022-10-21 19:21:56 +03:00
_ , err := CreateHookTask ( db . DefaultContext , hookTask )
assert . NoError ( t , err )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CleanupHookTaskTable ( context . Background ( ) , PerWebhook , 168 * time . Hour , 1 ) )
2021-11-16 11:53:21 +03:00
unittest . 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 {
2024-03-08 01:18:38 +03:00
HookID : 3 ,
IsDelivered : true ,
Delivered : timeutil . TimeStampNano ( time . Now ( ) . AddDate ( 0 , 0 , - 8 ) . UnixNano ( ) ) ,
PayloadVersion : 2 ,
2021-01-27 00:02:42 +03:00
}
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , hookTask )
2022-10-21 19:21:56 +03:00
_ , err := CreateHookTask ( db . DefaultContext , hookTask )
assert . NoError ( t , err )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CleanupHookTaskTable ( context . Background ( ) , OlderThan , 168 * time . Hour , 0 ) )
2021-11-16 11:53:21 +03:00
unittest . 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 {
2024-03-08 01:18:38 +03:00
HookID : 4 ,
IsDelivered : false ,
PayloadVersion : 2 ,
2021-01-27 00:02:42 +03:00
}
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , hookTask )
2022-10-21 19:21:56 +03:00
_ , err := CreateHookTask ( db . DefaultContext , hookTask )
assert . NoError ( t , err )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CleanupHookTaskTable ( context . Background ( ) , OlderThan , 168 * time . Hour , 0 ) )
2021-11-16 11:53:21 +03:00
unittest . 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 {
2024-03-08 01:18:38 +03:00
HookID : 4 ,
IsDelivered : true ,
Delivered : timeutil . TimeStampNano ( time . Now ( ) . AddDate ( 0 , 0 , - 6 ) . UnixNano ( ) ) ,
PayloadVersion : 2 ,
2021-01-27 00:02:42 +03:00
}
2021-11-16 11:53:21 +03:00
unittest . AssertNotExistsBean ( t , hookTask )
2022-10-21 19:21:56 +03:00
_ , err := CreateHookTask ( db . DefaultContext , hookTask )
assert . NoError ( t , err )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
assert . NoError ( t , CleanupHookTaskTable ( context . Background ( ) , OlderThan , 168 * time . Hour , 0 ) )
2021-11-16 11:53:21 +03:00
unittest . AssertExistsAndLoadBean ( t , hookTask )
2021-01-27 00:02:42 +03:00
}