Files
cunkebao_v3/Server/tests/plan_lead_webhook_smoke.php
Manus AI 03ae8c07b6 feat: 同步本地全量开发到 GitHub(前端/后端/超管/开发文档规则)
含 AI 助手、抖音 OAuth、流量池推送、支付获客、SuperAdmin 设备与场景管理等本地迭代;以本地为准单向推送,未拉取远程。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-26 22:12:40 +08:00

114 lines
4.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env php
<?php
/**
* 场景获客 Webhook 推送 — 本地 smoke test不依赖数据库
* 用法php Server/tests/plan_lead_webhook_smoke.php
*/
define('APP_PATH', dirname(__DIR__) . '/application/');
require dirname(__DIR__) . '/thinkphp/base.php';
// 仅加载服务类所需的最小环境
spl_autoload_register(function ($class) {
$map = [
'app\\cunkebao\\service\\PlanLeadWebhookService' => dirname(__DIR__) . '/application/cunkebao/service/PlanLeadWebhookService.php',
'app\\cunkebao\\service\\WebhookUrlValidator' => dirname(__DIR__) . '/application/cunkebao/service/WebhookUrlValidator.php',
];
if (isset($map[$class]) && is_file($map[$class])) {
require $map[$class];
}
});
use app\cunkebao\service\PlanLeadWebhookService;
use app\cunkebao\service\WebhookUrlValidator;
$passed = 0;
$failed = 0;
function assert_true(bool $cond, string $label): void
{
global $passed, $failed;
if ($cond) {
echo "[PASS] {$label}\n";
$passed++;
} else {
echo "[FAIL] {$label}\n";
$failed++;
}
}
// 1. validateConfig
assert_true(
PlanLeadWebhookService::validateConfig(['leadPushWebhookEnabled' => false]) === null,
'未启用时不校验'
);
assert_true(
PlanLeadWebhookService::validateConfig(['leadPushWebhookEnabled' => true, 'leadPushWebhook' => '']) !== null,
'启用但无 URL 应报错'
);
assert_true(
PlanLeadWebhookService::validateConfig(['leadPushWebhookEnabled' => true, 'leadPushWebhook' => 'ftp://x']) !== null,
'非 http(s) URL 应报错'
);
assert_true(
PlanLeadWebhookService::validateConfig(['leadPushWebhookEnabled' => true, 'leadPushWebhook' => 'https://example.com/hook']) === null,
'合法 https URL 通过'
);
assert_true(
PlanLeadWebhookService::validateConfig(['leadPushWebhookEnabled' => true, 'leadPushWebhook' => 'http://169.254.169.254/latest/meta-data/']) !== null,
'metadata IP 应拒绝'
);
assert_true(
WebhookUrlValidator::validate('http://127.0.0.1/hook') !== null,
'127.0.0.1 应拒绝'
);
// 2. parseWebhookConfig
$config = PlanLeadWebhookService::parseWebhookConfig([
'sceneConf' => json_encode([
'leadPushWebhookEnabled' => true,
'leadPushWebhook' => 'https://hook.test/ckb',
'leadPushWebhookSecret' => 'secret123',
]),
]);
assert_true($config['enabled'] === true, 'parse enabled');
assert_true($config['url'] === 'https://hook.test/ckb', 'parse url');
assert_true($config['secret'] === 'secret123', 'parse secret');
// 3. buildTestPayload不依赖 DB
$testPayload = PlanLeadWebhookService::buildTestPayload(['id' => 5, 'name' => '全局', 'sceneId' => 1, 'planType' => 0]);
assert_true($testPayload['event'] === 'lead.test', 'test event');
assert_true($testPayload['lead']['phone'] === '13800138000', 'test lead.phone');
assert_true(isset($testPayload['behaviors'][0]['behaviorName']), 'test behaviors');
// 4. buildPayload — 需完整框架与 DBCI 环境可跳过
if (class_exists(\app\common\model\TrafficPoolCompany::class)) {
$payload = PlanLeadWebhookService::buildPayload(
['id' => 1, 'name' => '测试计划', 'sceneId' => 1, 'planType' => 0, 'companyId' => 1],
[
'id' => 99,
'phone' => '13800138000',
'name' => '张三',
'source' => '测试',
'remark' => '',
'tags' => json_encode(['高意向']),
'siteTags' => json_encode(['新客']),
'status' => 0,
'channelId' => 0,
'fail_reason' => '',
'createTime' => time(),
'addTime' => 0,
'passTime' => 0,
'updateTime' => time(),
],
PlanLeadWebhookService::EVENT_CREATED
);
assert_true($payload['event'] === 'lead.created', 'event 字段');
assert_true(in_array('高意向', $payload['lead']['tags'], true), 'lead.tags 解码');
} else {
echo "[SKIP] buildPayload需 ThinkPHP 完整引导)\n";
}
echo "\n--- 结果: {$passed} 通过, {$failed} 失败 ---\n";
exit($failed > 0 ? 1 : 0);