mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Move webhook into models/webhook/ (#17579)
This commit is contained in:
		
							
								
								
									
										328
									
								
								models/webhook/webhook_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										328
									
								
								models/webhook/webhook_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,328 @@ | ||||
| // 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. | ||||
|  | ||||
| package webhook | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"code.gitea.io/gitea/models/db" | ||||
| 	"code.gitea.io/gitea/modules/json" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/modules/util" | ||||
|  | ||||
| 	"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) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	webhook := db.AssertExistsAndLoadBean(t, &Webhook{ID: 1}).(*Webhook) | ||||
| 	tasks, err := webhook.History(0) | ||||
| 	assert.NoError(t, err) | ||||
| 	if assert.Len(t, tasks, 1) { | ||||
| 		assert.Equal(t, int64(1), tasks[0].ID) | ||||
| 	} | ||||
|  | ||||
| 	webhook = db.AssertExistsAndLoadBean(t, &Webhook{ID: 2}).(*Webhook) | ||||
| 	tasks, err = webhook.History(0) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Len(t, tasks, 0) | ||||
| } | ||||
|  | ||||
| func TestWebhook_UpdateEvent(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	webhook := db.AssertExistsAndLoadBean(t, &Webhook{ID: 1}).(*Webhook) | ||||
| 	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) { | ||||
| 	assert.Equal(t, []string{ | ||||
| 		"create", "delete", "fork", "push", | ||||
| 		"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", | ||||
| 		"pull_request_review_comment", "pull_request_sync", "repository", "release", | ||||
| 	}, | ||||
| 		(&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}}`, | ||||
| 	} | ||||
| 	db.AssertNotExistsBean(t, hook) | ||||
| 	assert.NoError(t, CreateWebhook(db.DefaultContext, hook)) | ||||
| 	db.AssertExistsAndLoadBean(t, hook) | ||||
| } | ||||
|  | ||||
| func TestGetWebhookByRepoID(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hook, err := GetWebhookByRepoID(1, 1) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, int64(1), hook.ID) | ||||
|  | ||||
| 	_, err = GetWebhookByRepoID(db.NonexistentID, db.NonexistentID) | ||||
| 	assert.Error(t, err) | ||||
| 	assert.True(t, IsErrWebhookNotExist(err)) | ||||
| } | ||||
|  | ||||
| func TestGetWebhookByOrgID(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hook, err := GetWebhookByOrgID(3, 3) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, int64(3), hook.ID) | ||||
|  | ||||
| 	_, err = GetWebhookByOrgID(db.NonexistentID, db.NonexistentID) | ||||
| 	assert.Error(t, err) | ||||
| 	assert.True(t, IsErrWebhookNotExist(err)) | ||||
| } | ||||
|  | ||||
| func TestGetActiveWebhooksByRepoID(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hooks, err := ListWebhooksByOpts(&ListWebhookOptions{RepoID: 1, IsActive: util.OptionalBoolTrue}) | ||||
| 	assert.NoError(t, err) | ||||
| 	if assert.Len(t, hooks, 1) { | ||||
| 		assert.Equal(t, int64(1), hooks[0].ID) | ||||
| 		assert.True(t, hooks[0].IsActive) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestGetWebhooksByRepoID(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hooks, err := ListWebhooksByOpts(&ListWebhookOptions{RepoID: 1}) | ||||
| 	assert.NoError(t, err) | ||||
| 	if assert.Len(t, hooks, 2) { | ||||
| 		assert.Equal(t, int64(1), hooks[0].ID) | ||||
| 		assert.Equal(t, int64(2), hooks[1].ID) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestGetActiveWebhooksByOrgID(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hooks, err := ListWebhooksByOpts(&ListWebhookOptions{OrgID: 3, IsActive: util.OptionalBoolTrue}) | ||||
| 	assert.NoError(t, err) | ||||
| 	if assert.Len(t, hooks, 1) { | ||||
| 		assert.Equal(t, int64(3), hooks[0].ID) | ||||
| 		assert.True(t, hooks[0].IsActive) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestGetWebhooksByOrgID(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hooks, err := ListWebhooksByOpts(&ListWebhookOptions{OrgID: 3}) | ||||
| 	assert.NoError(t, err) | ||||
| 	if assert.Len(t, hooks, 1) { | ||||
| 		assert.Equal(t, int64(3), hooks[0].ID) | ||||
| 		assert.True(t, hooks[0].IsActive) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestUpdateWebhook(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hook := db.AssertExistsAndLoadBean(t, &Webhook{ID: 2}).(*Webhook) | ||||
| 	hook.IsActive = true | ||||
| 	hook.ContentType = ContentTypeForm | ||||
| 	db.AssertNotExistsBean(t, hook) | ||||
| 	assert.NoError(t, UpdateWebhook(hook)) | ||||
| 	db.AssertExistsAndLoadBean(t, hook) | ||||
| } | ||||
|  | ||||
| func TestDeleteWebhookByRepoID(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	db.AssertExistsAndLoadBean(t, &Webhook{ID: 2, RepoID: 1}) | ||||
| 	assert.NoError(t, DeleteWebhookByRepoID(1, 2)) | ||||
| 	db.AssertNotExistsBean(t, &Webhook{ID: 2, RepoID: 1}) | ||||
|  | ||||
| 	err := DeleteWebhookByRepoID(db.NonexistentID, db.NonexistentID) | ||||
| 	assert.Error(t, err) | ||||
| 	assert.True(t, IsErrWebhookNotExist(err)) | ||||
| } | ||||
|  | ||||
| func TestDeleteWebhookByOrgID(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	db.AssertExistsAndLoadBean(t, &Webhook{ID: 3, OrgID: 3}) | ||||
| 	assert.NoError(t, DeleteWebhookByOrgID(3, 3)) | ||||
| 	db.AssertNotExistsBean(t, &Webhook{ID: 3, OrgID: 3}) | ||||
|  | ||||
| 	err := DeleteWebhookByOrgID(db.NonexistentID, db.NonexistentID) | ||||
| 	assert.Error(t, err) | ||||
| 	assert.True(t, IsErrWebhookNotExist(err)) | ||||
| } | ||||
|  | ||||
| func TestHookTasks(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hookTasks, err := HookTasks(1, 1) | ||||
| 	assert.NoError(t, err) | ||||
| 	if assert.Len(t, hookTasks, 1) { | ||||
| 		assert.Equal(t, int64(1), hookTasks[0].ID) | ||||
| 	} | ||||
|  | ||||
| 	hookTasks, err = HookTasks(db.NonexistentID, 1) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Len(t, hookTasks, 0) | ||||
| } | ||||
|  | ||||
| func TestCreateHookTask(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hookTask := &HookTask{ | ||||
| 		RepoID:    3, | ||||
| 		HookID:    3, | ||||
| 		Payloader: &api.PushPayload{}, | ||||
| 	} | ||||
| 	db.AssertNotExistsBean(t, hookTask) | ||||
| 	assert.NoError(t, CreateHookTask(hookTask)) | ||||
| 	db.AssertExistsAndLoadBean(t, hookTask) | ||||
| } | ||||
|  | ||||
| func TestUpdateHookTask(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
|  | ||||
| 	hook := db.AssertExistsAndLoadBean(t, &HookTask{ID: 1}).(*HookTask) | ||||
| 	hook.PayloadContent = "new payload content" | ||||
| 	hook.DeliveredString = "new delivered string" | ||||
| 	hook.IsDelivered = true | ||||
| 	db.AssertNotExistsBean(t, hook) | ||||
| 	assert.NoError(t, UpdateHookTask(hook)) | ||||
| 	db.AssertExistsAndLoadBean(t, hook) | ||||
| } | ||||
|  | ||||
| func TestCleanupHookTaskTable_PerWebhook_DeletesDelivered(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hookTask := &HookTask{ | ||||
| 		RepoID:      3, | ||||
| 		HookID:      3, | ||||
| 		Payloader:   &api.PushPayload{}, | ||||
| 		IsDelivered: true, | ||||
| 		Delivered:   time.Now().UnixNano(), | ||||
| 	} | ||||
| 	db.AssertNotExistsBean(t, hookTask) | ||||
| 	assert.NoError(t, CreateHookTask(hookTask)) | ||||
| 	db.AssertExistsAndLoadBean(t, hookTask) | ||||
|  | ||||
| 	assert.NoError(t, CleanupHookTaskTable(context.Background(), PerWebhook, 168*time.Hour, 0)) | ||||
| 	db.AssertNotExistsBean(t, hookTask) | ||||
| } | ||||
|  | ||||
| func TestCleanupHookTaskTable_PerWebhook_LeavesUndelivered(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hookTask := &HookTask{ | ||||
| 		RepoID:      2, | ||||
| 		HookID:      4, | ||||
| 		Payloader:   &api.PushPayload{}, | ||||
| 		IsDelivered: false, | ||||
| 	} | ||||
| 	db.AssertNotExistsBean(t, hookTask) | ||||
| 	assert.NoError(t, CreateHookTask(hookTask)) | ||||
| 	db.AssertExistsAndLoadBean(t, hookTask) | ||||
|  | ||||
| 	assert.NoError(t, CleanupHookTaskTable(context.Background(), PerWebhook, 168*time.Hour, 0)) | ||||
| 	db.AssertExistsAndLoadBean(t, hookTask) | ||||
| } | ||||
|  | ||||
| func TestCleanupHookTaskTable_PerWebhook_LeavesMostRecentTask(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hookTask := &HookTask{ | ||||
| 		RepoID:      2, | ||||
| 		HookID:      4, | ||||
| 		Payloader:   &api.PushPayload{}, | ||||
| 		IsDelivered: true, | ||||
| 		Delivered:   time.Now().UnixNano(), | ||||
| 	} | ||||
| 	db.AssertNotExistsBean(t, hookTask) | ||||
| 	assert.NoError(t, CreateHookTask(hookTask)) | ||||
| 	db.AssertExistsAndLoadBean(t, hookTask) | ||||
|  | ||||
| 	assert.NoError(t, CleanupHookTaskTable(context.Background(), PerWebhook, 168*time.Hour, 1)) | ||||
| 	db.AssertExistsAndLoadBean(t, hookTask) | ||||
| } | ||||
|  | ||||
| func TestCleanupHookTaskTable_OlderThan_DeletesDelivered(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hookTask := &HookTask{ | ||||
| 		RepoID:      3, | ||||
| 		HookID:      3, | ||||
| 		Payloader:   &api.PushPayload{}, | ||||
| 		IsDelivered: true, | ||||
| 		Delivered:   time.Now().AddDate(0, 0, -8).UnixNano(), | ||||
| 	} | ||||
| 	db.AssertNotExistsBean(t, hookTask) | ||||
| 	assert.NoError(t, CreateHookTask(hookTask)) | ||||
| 	db.AssertExistsAndLoadBean(t, hookTask) | ||||
|  | ||||
| 	assert.NoError(t, CleanupHookTaskTable(context.Background(), OlderThan, 168*time.Hour, 0)) | ||||
| 	db.AssertNotExistsBean(t, hookTask) | ||||
| } | ||||
|  | ||||
| func TestCleanupHookTaskTable_OlderThan_LeavesUndelivered(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hookTask := &HookTask{ | ||||
| 		RepoID:      2, | ||||
| 		HookID:      4, | ||||
| 		Payloader:   &api.PushPayload{}, | ||||
| 		IsDelivered: false, | ||||
| 	} | ||||
| 	db.AssertNotExistsBean(t, hookTask) | ||||
| 	assert.NoError(t, CreateHookTask(hookTask)) | ||||
| 	db.AssertExistsAndLoadBean(t, hookTask) | ||||
|  | ||||
| 	assert.NoError(t, CleanupHookTaskTable(context.Background(), OlderThan, 168*time.Hour, 0)) | ||||
| 	db.AssertExistsAndLoadBean(t, hookTask) | ||||
| } | ||||
|  | ||||
| func TestCleanupHookTaskTable_OlderThan_LeavesTaskEarlierThanAgeToDelete(t *testing.T) { | ||||
| 	assert.NoError(t, db.PrepareTestDatabase()) | ||||
| 	hookTask := &HookTask{ | ||||
| 		RepoID:      2, | ||||
| 		HookID:      4, | ||||
| 		Payloader:   &api.PushPayload{}, | ||||
| 		IsDelivered: true, | ||||
| 		Delivered:   time.Now().AddDate(0, 0, -6).UnixNano(), | ||||
| 	} | ||||
| 	db.AssertNotExistsBean(t, hookTask) | ||||
| 	assert.NoError(t, CreateHookTask(hookTask)) | ||||
| 	db.AssertExistsAndLoadBean(t, hookTask) | ||||
|  | ||||
| 	assert.NoError(t, CleanupHookTaskTable(context.Background(), OlderThan, 168*time.Hour, 0)) | ||||
| 	db.AssertExistsAndLoadBean(t, hookTask) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user