含 AI 助手、抖音 OAuth、流量池推送、支付获客、SuperAdmin 设备与场景管理等本地迭代;以本地为准单向推送,未拉取远程。 Co-authored-by: Cursor <cursoragent@cursor.com>
114 lines
4.0 KiB
PHP
114 lines
4.0 KiB
PHP
#!/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 — 需完整框架与 DB,CI 环境可跳过
|
||
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);
|