mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Fix mismatch between hook events and github event types (#24048)
Some workflow trigger events can have multiple activity types, such as `issues` and `pull_request`, and user can specify which types can trigger the workflow. See GitHub documentation: https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows Now some hook events cannot match the workflow trigger events correctly because we don't check the activity types. For example, `pull_request_label` is an individual hook event. But there isn't a `pull_request_label` workflow trigger event, we can only use `pull_request` event's `label` activity type. If we don't check the activity types, the workflows without the `label` activity type may be triggered by the `pull_request_label` event by mistake. We need to improve the match logic. - [x] [`issues` ](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#issues) - [x] [`issue_comment`](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#issue_comment) - [x] [`pull_request`](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request) - [x] [`pull_request_review`](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_review) - [x] [`pull_request_review_comment`](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_review_comment) - [x] [`release`](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#release) - [x] [`registry_package`](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#registry_package)
This commit is contained in:
		| @@ -115,40 +115,60 @@ func detectMatched(commit *git.Commit, triggedEvent webhook_module.HookEventType | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	switch triggedEvent { | 	switch triggedEvent { | ||||||
| 	case webhook_module.HookEventCreate, | 	case // events with no activity types | ||||||
|  | 		webhook_module.HookEventCreate, | ||||||
| 		webhook_module.HookEventDelete, | 		webhook_module.HookEventDelete, | ||||||
| 		webhook_module.HookEventFork, | 		webhook_module.HookEventFork, | ||||||
| 		webhook_module.HookEventIssueAssign, | 		// FIXME: `wiki` event should match `gollum` event | ||||||
| 		webhook_module.HookEventIssueLabel, | 		// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#gollum | ||||||
| 		webhook_module.HookEventIssueMilestone, | 		webhook_module.HookEventWiki: | ||||||
| 		webhook_module.HookEventPullRequestAssign, |  | ||||||
| 		webhook_module.HookEventPullRequestLabel, |  | ||||||
| 		webhook_module.HookEventPullRequestMilestone, |  | ||||||
| 		webhook_module.HookEventPullRequestComment, |  | ||||||
| 		webhook_module.HookEventPullRequestReviewApproved, |  | ||||||
| 		webhook_module.HookEventPullRequestReviewRejected, |  | ||||||
| 		webhook_module.HookEventPullRequestReviewComment, |  | ||||||
| 		webhook_module.HookEventWiki, |  | ||||||
| 		webhook_module.HookEventRepository, |  | ||||||
| 		webhook_module.HookEventRelease, |  | ||||||
| 		webhook_module.HookEventPackage: |  | ||||||
| 		if len(evt.Acts()) != 0 { | 		if len(evt.Acts()) != 0 { | ||||||
| 			log.Warn("Ignore unsupported %s event arguments %v", triggedEvent, evt.Acts()) | 			log.Warn("Ignore unsupported %s event arguments %v", triggedEvent, evt.Acts()) | ||||||
| 		} | 		} | ||||||
| 		// no special filter parameters for these events, just return true if name matched | 		// no special filter parameters for these events, just return true if name matched | ||||||
| 		return true | 		return true | ||||||
|  |  | ||||||
| 	case webhook_module.HookEventPush: | 	case // push | ||||||
|  | 		webhook_module.HookEventPush: | ||||||
| 		return matchPushEvent(commit, payload.(*api.PushPayload), evt) | 		return matchPushEvent(commit, payload.(*api.PushPayload), evt) | ||||||
|  |  | ||||||
| 	case webhook_module.HookEventIssues: | 	case // issues | ||||||
|  | 		webhook_module.HookEventIssues, | ||||||
|  | 		webhook_module.HookEventIssueAssign, | ||||||
|  | 		webhook_module.HookEventIssueLabel, | ||||||
|  | 		webhook_module.HookEventIssueMilestone: | ||||||
| 		return matchIssuesEvent(commit, payload.(*api.IssuePayload), evt) | 		return matchIssuesEvent(commit, payload.(*api.IssuePayload), evt) | ||||||
|  |  | ||||||
| 	case webhook_module.HookEventPullRequest, webhook_module.HookEventPullRequestSync: | 	case // issue_comment | ||||||
|  | 		webhook_module.HookEventIssueComment, | ||||||
|  | 		// `pull_request_comment` is same as `issue_comment` | ||||||
|  | 		// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_comment-use-issue_comment | ||||||
|  | 		webhook_module.HookEventPullRequestComment: | ||||||
|  | 		return matchIssueCommentEvent(commit, payload.(*api.IssueCommentPayload), evt) | ||||||
|  |  | ||||||
|  | 	case // pull_request | ||||||
|  | 		webhook_module.HookEventPullRequest, | ||||||
|  | 		webhook_module.HookEventPullRequestSync, | ||||||
|  | 		webhook_module.HookEventPullRequestAssign, | ||||||
|  | 		webhook_module.HookEventPullRequestLabel: | ||||||
| 		return matchPullRequestEvent(commit, payload.(*api.PullRequestPayload), evt) | 		return matchPullRequestEvent(commit, payload.(*api.PullRequestPayload), evt) | ||||||
|  |  | ||||||
| 	case webhook_module.HookEventIssueComment: | 	case // pull_request_review | ||||||
| 		return matchIssueCommentEvent(commit, payload.(*api.IssueCommentPayload), evt) | 		webhook_module.HookEventPullRequestReviewApproved, | ||||||
|  | 		webhook_module.HookEventPullRequestReviewRejected: | ||||||
|  | 		return matchPullRequestReviewEvent(commit, payload.(*api.PullRequestPayload), evt) | ||||||
|  |  | ||||||
|  | 	case // pull_request_review_comment | ||||||
|  | 		webhook_module.HookEventPullRequestReviewComment: | ||||||
|  | 		return matchPullRequestReviewCommentEvent(commit, payload.(*api.PullRequestPayload), evt) | ||||||
|  |  | ||||||
|  | 	case // release | ||||||
|  | 		webhook_module.HookEventRelease: | ||||||
|  | 		return matchReleaseEvent(commit, payload.(*api.ReleasePayload), evt) | ||||||
|  |  | ||||||
|  | 	case // registry_package | ||||||
|  | 		webhook_module.HookEventPackage: | ||||||
|  | 		return matchPackageEvent(commit, payload.(*api.PackagePayload), evt) | ||||||
|  |  | ||||||
| 	default: | 	default: | ||||||
| 		log.Warn("unsupported event %q", triggedEvent) | 		log.Warn("unsupported event %q", triggedEvent) | ||||||
| @@ -265,8 +285,24 @@ func matchIssuesEvent(commit *git.Commit, issuePayload *api.IssuePayload, evt *j | |||||||
| 	for cond, vals := range evt.Acts() { | 	for cond, vals := range evt.Acts() { | ||||||
| 		switch cond { | 		switch cond { | ||||||
| 		case "types": | 		case "types": | ||||||
|  | 			// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#issues | ||||||
|  | 			// Actions with the same name: | ||||||
|  | 			// opened, edited, closed, reopened, assigned, unassigned, milestoned, demilestoned | ||||||
|  | 			// Actions need to be converted: | ||||||
|  | 			// label_updated -> labeled | ||||||
|  | 			// label_cleared -> unlabeled | ||||||
|  | 			// Unsupported activity types: | ||||||
|  | 			// deleted, transferred, pinned, unpinned, locked, unlocked | ||||||
|  |  | ||||||
|  | 			action := issuePayload.Action | ||||||
|  | 			switch action { | ||||||
|  | 			case api.HookIssueLabelUpdated: | ||||||
|  | 				action = "labeled" | ||||||
|  | 			case api.HookIssueLabelCleared: | ||||||
|  | 				action = "unlabeled" | ||||||
|  | 			} | ||||||
| 			for _, val := range vals { | 			for _, val := range vals { | ||||||
| 				if glob.MustCompile(val, '/').Match(string(issuePayload.Action)) { | 				if glob.MustCompile(val, '/').Match(string(action)) { | ||||||
| 					matchTimes++ | 					matchTimes++ | ||||||
| 					break | 					break | ||||||
| 				} | 				} | ||||||
| @@ -281,8 +317,9 @@ func matchIssuesEvent(commit *git.Commit, issuePayload *api.IssuePayload, evt *j | |||||||
| func matchPullRequestEvent(commit *git.Commit, prPayload *api.PullRequestPayload, evt *jobparser.Event) bool { | func matchPullRequestEvent(commit *git.Commit, prPayload *api.PullRequestPayload, evt *jobparser.Event) bool { | ||||||
| 	// with no special filter parameters | 	// with no special filter parameters | ||||||
| 	if len(evt.Acts()) == 0 { | 	if len(evt.Acts()) == 0 { | ||||||
| 		// defaultly, only pull request opened and synchronized will trigger workflow | 		// defaultly, only pull request `opened`, `reopened` and `synchronized` will trigger workflow | ||||||
| 		return prPayload.Action == api.HookIssueSynchronized || prPayload.Action == api.HookIssueOpened | 		// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request | ||||||
|  | 		return prPayload.Action == api.HookIssueSynchronized || prPayload.Action == api.HookIssueOpened || prPayload.Action == api.HookIssueReOpened | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	matchTimes := 0 | 	matchTimes := 0 | ||||||
| @@ -290,9 +327,24 @@ func matchPullRequestEvent(commit *git.Commit, prPayload *api.PullRequestPayload | |||||||
| 	for cond, vals := range evt.Acts() { | 	for cond, vals := range evt.Acts() { | ||||||
| 		switch cond { | 		switch cond { | ||||||
| 		case "types": | 		case "types": | ||||||
|  | 			// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request | ||||||
|  | 			// Actions with the same name: | ||||||
|  | 			// opened, edited, closed, reopened, assigned, unassigned | ||||||
|  | 			// Actions need to be converted: | ||||||
|  | 			// synchronized -> synchronize | ||||||
|  | 			// label_updated -> labeled | ||||||
|  | 			// label_cleared -> unlabeled | ||||||
|  | 			// Unsupported activity types: | ||||||
|  | 			// converted_to_draft, ready_for_review, locked, unlocked, review_requested, review_request_removed, auto_merge_enabled, auto_merge_disabled | ||||||
|  |  | ||||||
| 			action := prPayload.Action | 			action := prPayload.Action | ||||||
| 			if prPayload.Action == api.HookIssueSynchronized { | 			switch action { | ||||||
|  | 			case api.HookIssueSynchronized: | ||||||
| 				action = "synchronize" | 				action = "synchronize" | ||||||
|  | 			case api.HookIssueLabelUpdated: | ||||||
|  | 				action = "labeled" | ||||||
|  | 			case api.HookIssueLabelCleared: | ||||||
|  | 				action = "unlabeled" | ||||||
| 			} | 			} | ||||||
| 			log.Trace("matching pull_request %s with %v", action, vals) | 			log.Trace("matching pull_request %s with %v", action, vals) | ||||||
| 			for _, val := range vals { | 			for _, val := range vals { | ||||||
| @@ -363,6 +415,14 @@ func matchIssueCommentEvent(commit *git.Commit, issueCommentPayload *api.IssueCo | |||||||
| 	for cond, vals := range evt.Acts() { | 	for cond, vals := range evt.Acts() { | ||||||
| 		switch cond { | 		switch cond { | ||||||
| 		case "types": | 		case "types": | ||||||
|  | 			// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#issue_comment | ||||||
|  | 			// Actions with the same name: | ||||||
|  | 			// created, edited, deleted | ||||||
|  | 			// Actions need to be converted: | ||||||
|  | 			// NONE | ||||||
|  | 			// Unsupported activity types: | ||||||
|  | 			// NONE | ||||||
|  |  | ||||||
| 			for _, val := range vals { | 			for _, val := range vals { | ||||||
| 				if glob.MustCompile(val, '/').Match(string(issueCommentPayload.Action)) { | 				if glob.MustCompile(val, '/').Match(string(issueCommentPayload.Action)) { | ||||||
| 					matchTimes++ | 					matchTimes++ | ||||||
| @@ -370,7 +430,179 @@ func matchIssueCommentEvent(commit *git.Commit, issueCommentPayload *api.IssueCo | |||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		default: | 		default: | ||||||
| 			log.Warn("issue comment unsupported condition %q", cond) | 			log.Warn("issue comment event unsupported condition %q", cond) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return matchTimes == len(evt.Acts()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func matchPullRequestReviewEvent(commit *git.Commit, prPayload *api.PullRequestPayload, evt *jobparser.Event) bool { | ||||||
|  | 	// with no special filter parameters | ||||||
|  | 	if len(evt.Acts()) == 0 { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	matchTimes := 0 | ||||||
|  | 	// all acts conditions should be satisfied | ||||||
|  | 	for cond, vals := range evt.Acts() { | ||||||
|  | 		switch cond { | ||||||
|  | 		case "types": | ||||||
|  | 			// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_review | ||||||
|  | 			// Activity types with the same name: | ||||||
|  | 			// NONE | ||||||
|  | 			// Activity types need to be converted: | ||||||
|  | 			// reviewed -> submitted | ||||||
|  | 			// reviewed -> edited | ||||||
|  | 			// Unsupported activity types: | ||||||
|  | 			// dismissed | ||||||
|  |  | ||||||
|  | 			actions := make([]string, 0) | ||||||
|  | 			if prPayload.Action == api.HookIssueReviewed { | ||||||
|  | 				// the `reviewed` HookIssueAction can match the two activity types: `submitted` and `edited` | ||||||
|  | 				// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_review | ||||||
|  | 				actions = append(actions, "submitted", "edited") | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			matched := false | ||||||
|  | 			for _, val := range vals { | ||||||
|  | 				for _, action := range actions { | ||||||
|  | 					if glob.MustCompile(val, '/').Match(action) { | ||||||
|  | 						matched = true | ||||||
|  | 						break | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				if matched { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			if matched { | ||||||
|  | 				matchTimes++ | ||||||
|  | 			} | ||||||
|  | 		default: | ||||||
|  | 			log.Warn("pull request review event unsupported condition %q", cond) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return matchTimes == len(evt.Acts()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func matchPullRequestReviewCommentEvent(commit *git.Commit, prPayload *api.PullRequestPayload, evt *jobparser.Event) bool { | ||||||
|  | 	// with no special filter parameters | ||||||
|  | 	if len(evt.Acts()) == 0 { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	matchTimes := 0 | ||||||
|  | 	// all acts conditions should be satisfied | ||||||
|  | 	for cond, vals := range evt.Acts() { | ||||||
|  | 		switch cond { | ||||||
|  | 		case "types": | ||||||
|  | 			// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_review_comment | ||||||
|  | 			// Activity types with the same name: | ||||||
|  | 			// NONE | ||||||
|  | 			// Activity types need to be converted: | ||||||
|  | 			// reviewed -> created | ||||||
|  | 			// reviewed -> edited | ||||||
|  | 			// Unsupported activity types: | ||||||
|  | 			// deleted | ||||||
|  |  | ||||||
|  | 			actions := make([]string, 0) | ||||||
|  | 			if prPayload.Action == api.HookIssueReviewed { | ||||||
|  | 				// the `reviewed` HookIssueAction can match the two activity types: `created` and `edited` | ||||||
|  | 				// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_review_comment | ||||||
|  | 				actions = append(actions, "created", "edited") | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			matched := false | ||||||
|  | 			for _, val := range vals { | ||||||
|  | 				for _, action := range actions { | ||||||
|  | 					if glob.MustCompile(val, '/').Match(action) { | ||||||
|  | 						matched = true | ||||||
|  | 						break | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				if matched { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			if matched { | ||||||
|  | 				matchTimes++ | ||||||
|  | 			} | ||||||
|  | 		default: | ||||||
|  | 			log.Warn("pull request review comment event unsupported condition %q", cond) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return matchTimes == len(evt.Acts()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func matchReleaseEvent(commit *git.Commit, payload *api.ReleasePayload, evt *jobparser.Event) bool { | ||||||
|  | 	// with no special filter parameters | ||||||
|  | 	if len(evt.Acts()) == 0 { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	matchTimes := 0 | ||||||
|  | 	// all acts conditions should be satisfied | ||||||
|  | 	for cond, vals := range evt.Acts() { | ||||||
|  | 		switch cond { | ||||||
|  | 		case "types": | ||||||
|  | 			// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#release | ||||||
|  | 			// Activity types with the same name: | ||||||
|  | 			// published | ||||||
|  | 			// Activity types need to be converted: | ||||||
|  | 			// updated -> edited | ||||||
|  | 			// Unsupported activity types: | ||||||
|  | 			// unpublished, created, deleted, prereleased, released | ||||||
|  |  | ||||||
|  | 			action := payload.Action | ||||||
|  | 			switch action { | ||||||
|  | 			case api.HookReleaseUpdated: | ||||||
|  | 				action = "edited" | ||||||
|  | 			} | ||||||
|  | 			for _, val := range vals { | ||||||
|  | 				if glob.MustCompile(val, '/').Match(string(action)) { | ||||||
|  | 					matchTimes++ | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		default: | ||||||
|  | 			log.Warn("release event unsupported condition %q", cond) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return matchTimes == len(evt.Acts()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func matchPackageEvent(commit *git.Commit, payload *api.PackagePayload, evt *jobparser.Event) bool { | ||||||
|  | 	// with no special filter parameters | ||||||
|  | 	if len(evt.Acts()) == 0 { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	matchTimes := 0 | ||||||
|  | 	// all acts conditions should be satisfied | ||||||
|  | 	for cond, vals := range evt.Acts() { | ||||||
|  | 		switch cond { | ||||||
|  | 		case "types": | ||||||
|  | 			// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#registry_package | ||||||
|  | 			// Activity types with the same name: | ||||||
|  | 			// NONE | ||||||
|  | 			// Activity types need to be converted: | ||||||
|  | 			// created -> published | ||||||
|  | 			// Unsupported activity types: | ||||||
|  | 			// updated | ||||||
|  |  | ||||||
|  | 			action := payload.Action | ||||||
|  | 			switch action { | ||||||
|  | 			case api.HookPackageCreated: | ||||||
|  | 				action = "published" | ||||||
|  | 			} | ||||||
|  | 			for _, val := range vals { | ||||||
|  | 				if glob.MustCompile(val, '/').Match(string(action)) { | ||||||
|  | 					matchTimes++ | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		default: | ||||||
|  | 			log.Warn("package event unsupported condition %q", cond) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return matchTimes == len(evt.Acts()) | 	return matchTimes == len(evt.Acts()) | ||||||
|   | |||||||
							
								
								
									
										105
									
								
								modules/actions/workflows_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								modules/actions/workflows_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | |||||||
|  | // Copyright 2023 The Gitea Authors. All rights reserved. | ||||||
|  | // SPDX-License-Identifier: MIT | ||||||
|  |  | ||||||
|  | package actions | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  |  | ||||||
|  | 	"code.gitea.io/gitea/modules/git" | ||||||
|  | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
|  | 	"github.com/stretchr/testify/assert" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func TestDetectMatched(t *testing.T) { | ||||||
|  | 	testCases := []struct { | ||||||
|  | 		desc         string | ||||||
|  | 		commit       *git.Commit | ||||||
|  | 		triggedEvent webhook_module.HookEventType | ||||||
|  | 		payload      api.Payloader | ||||||
|  | 		yamlOn       string | ||||||
|  | 		expected     bool | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			desc:         "HookEventCreate(create) matches githubEventCreate(create)", | ||||||
|  | 			triggedEvent: webhook_module.HookEventCreate, | ||||||
|  | 			payload:      nil, | ||||||
|  | 			yamlOn:       "on: create", | ||||||
|  | 			expected:     true, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			desc:         "HookEventIssues(issues) `opened` action matches githubEventIssues(issues)", | ||||||
|  | 			triggedEvent: webhook_module.HookEventIssues, | ||||||
|  | 			payload:      &api.IssuePayload{Action: api.HookIssueOpened}, | ||||||
|  | 			yamlOn:       "on: issues", | ||||||
|  | 			expected:     true, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			desc:         "HookEventIssues(issues) `milestoned` action matches githubEventIssues(issues)", | ||||||
|  | 			triggedEvent: webhook_module.HookEventIssues, | ||||||
|  | 			payload:      &api.IssuePayload{Action: api.HookIssueMilestoned}, | ||||||
|  | 			yamlOn:       "on: issues", | ||||||
|  | 			expected:     true, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			desc:         "HookEventPullRequestSync(pull_request_sync) matches githubEventPullRequest(pull_request)", | ||||||
|  | 			triggedEvent: webhook_module.HookEventPullRequestSync, | ||||||
|  | 			payload:      &api.PullRequestPayload{Action: api.HookIssueSynchronized}, | ||||||
|  | 			yamlOn:       "on: pull_request", | ||||||
|  | 			expected:     true, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			desc:         "HookEventPullRequest(pull_request) `label_updated` action doesn't match githubEventPullRequest(pull_request) with no activity type", | ||||||
|  | 			triggedEvent: webhook_module.HookEventPullRequest, | ||||||
|  | 			payload:      &api.PullRequestPayload{Action: api.HookIssueLabelUpdated}, | ||||||
|  | 			yamlOn:       "on: pull_request", | ||||||
|  | 			expected:     false, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			desc:         "HookEventPullRequest(pull_request) `label_updated` action matches githubEventPullRequest(pull_request) with `label` activity type", | ||||||
|  | 			triggedEvent: webhook_module.HookEventPullRequest, | ||||||
|  | 			payload:      &api.PullRequestPayload{Action: api.HookIssueLabelUpdated}, | ||||||
|  | 			yamlOn:       "on:\n  pull_request:\n    types: [labeled]", | ||||||
|  | 			expected:     true, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			desc:         "HookEventPullRequestReviewComment(pull_request_review_comment) matches githubEventPullRequestReviewComment(pull_request_review_comment)", | ||||||
|  | 			triggedEvent: webhook_module.HookEventPullRequestReviewComment, | ||||||
|  | 			payload:      &api.PullRequestPayload{Action: api.HookIssueReviewed}, | ||||||
|  | 			yamlOn:       "on:\n  pull_request_review_comment:\n    types: [created]", | ||||||
|  | 			expected:     true, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			desc:         "HookEventPullRequestReviewRejected(pull_request_review_rejected) doesn't match githubEventPullRequestReview(pull_request_review) with `dismissed` activity type (we don't support `dismissed` at present)", | ||||||
|  | 			triggedEvent: webhook_module.HookEventPullRequestReviewRejected, | ||||||
|  | 			payload:      &api.PullRequestPayload{Action: api.HookIssueReviewed}, | ||||||
|  | 			yamlOn:       "on:\n  pull_request_review:\n    types: [dismissed]", | ||||||
|  | 			expected:     false, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			desc:         "HookEventRelease(release) `published` action matches githubEventRelease(release) with `published` activity type", | ||||||
|  | 			triggedEvent: webhook_module.HookEventRelease, | ||||||
|  | 			payload:      &api.ReleasePayload{Action: api.HookReleasePublished}, | ||||||
|  | 			yamlOn:       "on:\n  release:\n    types: [published]", | ||||||
|  | 			expected:     true, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			desc:         "HookEventPackage(package) `created` action doesn't match githubEventRegistryPackage(registry_package) with `updated` activity type", | ||||||
|  | 			triggedEvent: webhook_module.HookEventPackage, | ||||||
|  | 			payload:      &api.PackagePayload{Action: api.HookPackageCreated}, | ||||||
|  | 			yamlOn:       "on:\n  registry_package:\n    types: [updated]", | ||||||
|  | 			expected:     false, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for _, tc := range testCases { | ||||||
|  | 		t.Run(tc.desc, func(t *testing.T) { | ||||||
|  | 			evts, err := GetEventsFromContent([]byte(tc.yamlOn)) | ||||||
|  | 			assert.NoError(t, err) | ||||||
|  | 			assert.Len(t, evts, 1) | ||||||
|  | 			assert.Equal(t, tc.expected, detectMatched(tc.commit, tc.triggedEvent, tc.payload, evts[0])) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user