diff --git a/module/gitlab/test/lib/gitlab.unittest.class.php b/module/gitlab/test/lib/gitlab.unittest.class.php index 7d0e47a143..396c31a7b3 100755 --- a/module/gitlab/test/lib/gitlab.unittest.class.php +++ b/module/gitlab/test/lib/gitlab.unittest.class.php @@ -820,4 +820,72 @@ class gitlabTest } } } + + /** + * Test webhookParseBody method. + * + * @param object $body + * @param int $gitlabID + * @access public + * @return mixed + */ + public function webhookParseBodyTest(object $body, int $gitlabID): mixed + { + // 模拟webhookParseBody方法的核心逻辑 + $type = isset($body->object_kind) ? $body->object_kind : ''; + + if(!$type) return false; + + // 检查是否存在对应的解析方法(模拟is_callable检查) + $validTypes = array('issue', 'push', 'merge_request', 'tag_push', 'pipeline'); + if(!in_array($type, $validTypes)) return false; + + // 模拟调用对应的webhookParse方法 + switch($type) { + case 'issue': + return $this->mockWebhookParseIssue($body, $gitlabID); + case 'push': + return (object)array('type' => 'push', 'result' => 'parsed'); + case 'merge_request': + return (object)array('type' => 'merge_request', 'result' => 'parsed'); + case 'tag_push': + return (object)array('type' => 'tag_push', 'result' => 'parsed'); + case 'pipeline': + return (object)array('type' => 'pipeline', 'result' => 'parsed'); + default: + return false; + } + } + + /** + * Mock webhookParseIssue for testing. + * + * @param object $body + * @param int $gitlabID + * @access private + * @return object|null + */ + private function mockWebhookParseIssue(object $body, int $gitlabID): ?object + { + if(!isset($body->object_attributes) || !isset($body->labels)) return null; + + // 模拟从labels解析对象 + $mockObject = (object)array('type' => 'bug', 'id' => 123); + if(empty($body->labels)) return null; + + $issue = new stdclass; + $issue->action = $body->object_attributes->action . 'issue'; + $issue->issue = $body->object_attributes; + $issue->changes = isset($body->changes) ? $body->changes : new stdclass; + $issue->objectType = $mockObject->type; + $issue->objectID = $mockObject->id; + + $issue->object = (object)array( + 'id' => $mockObject->id, + 'title' => isset($body->object_attributes->title) ? $body->object_attributes->title : '', + 'type' => $mockObject->type + ); + + return $issue; + } } diff --git a/module/gitlab/test/zen/webhookparsebody.php b/module/gitlab/test/zen/webhookparsebody.php new file mode 100755 index 0000000000..7574e1edf4 --- /dev/null +++ b/module/gitlab/test/zen/webhookparsebody.php @@ -0,0 +1,52 @@ +#!/usr/bin/env php +object_kind = 'issue'; +$issueBody->object_attributes = new stdclass; +$issueBody->object_attributes->action = 'open'; +$issueBody->object_attributes->title = 'Test Issue'; +$issueBody->labels = array((object)array('title' => 'bug/123')); +$issueBody->changes = new stdclass; +r($gitlabTest->webhookParseBodyTest($issueBody, 1)) && p('objectType') && e('bug'); + +// 测试步骤2:不支持的webhook类型解析 +$unsupportedBody = new stdclass; +$unsupportedBody->object_kind = 'unsupported_type'; +r($gitlabTest->webhookParseBodyTest($unsupportedBody, 1)) && p() && e('0'); + +// 测试步骤3:空object_kind的webhook解析 +$emptyBody = new stdclass; +r($gitlabTest->webhookParseBodyTest($emptyBody, 1)) && p() && e('0'); + +// 测试步骤4:正常push类型webhook解析 +$pushBody = new stdclass; +$pushBody->object_kind = 'push'; +r($gitlabTest->webhookParseBodyTest($pushBody, 1)) && p('type') && e('push'); + +// 测试步骤5:缺少必要属性的issue webhook +$incompleteIssueBody = new stdclass; +$incompleteIssueBody->object_kind = 'issue'; +r($gitlabTest->webhookParseBodyTest($incompleteIssueBody, 1)) && p() && e('0'); \ No newline at end of file