Files
wordpress-theme-aksrt/tests/admin/wechat-settings-harness.php
T

142 lines
7.7 KiB
PHP

<?php
/** @package Jio */
namespace {
define('ABSPATH', __DIR__ . '/');
final class WP_Error {
public function __construct(private string $code, private string $message, private array $data = []) {}
public function get_error_message(): string { return $this->message; }
public function get_error_data(): array { return $this->data; }
}
final class WP_REST_Response {
public function __construct(public $data = null, public int $status = 200) {}
}
final class WP_REST_Request {
public function __construct(private array $json = []) {}
public function get_json_params(): array { return $this->json; }
}
function __($text, $domain = '') { return $text; }
function sanitize_text_field($value): string { return trim(strip_tags((string) $value)); }
function sanitize_key($value): string { return strtolower(preg_replace('/[^a-z0-9_-]/', '', (string) $value)); }
function is_wp_error($value): bool { return $value instanceof WP_Error; }
function get_option($key, $default = false) { return $GLOBALS['wechat_options'][$key] ?? $default; }
function update_option($key, $value): bool { $GLOBALS['wechat_options'][$key] = $value; return true; }
function get_current_user_id(): int { return 9; }
function get_user_meta($user_id, $key, $single = false) { return $key === 'jio_weixingzh_id' && $user_id === 9 ? ($GLOBALS['wechat_openid'] ?? '') : ''; }
function home_url($path = ''): string { return 'https://example.test' . $path; }
function esc_url_raw($url): string { return (string) $url; }
function current_time($format): string { return '2026-11-10 10:00:00'; }
function wp_json_encode($value): string { return json_encode($value, JSON_UNESCAPED_UNICODE); }
function wp_remote_post($url, $args) { $GLOBALS['wechat_last_post'] = [$url, $args]; return $GLOBALS['wechat_remote_response']; }
function wp_remote_retrieve_body($response): string { return (string) ($response['body'] ?? ''); }
function wp_remote_retrieve_response_code($response): int { return (int) ($response['response']['code'] ?? 0); }
function get_userdata($user_id) { return null; }
function get_users($args) { return []; }
function add_action($hook, $callback, $priority = 10, $accepted_args = 1): void {}
$GLOBALS['wpdb'] = new class {
public string $usermeta = 'wp_usermeta';
public function get_var($query): int { return 1; }
};
$GLOBALS['wechat_options'] = ['jio_wechat_settings' => []];
$GLOBALS['wechat_openid'] = 'OPENID9';
$GLOBALS['wechat_remote_response'] = ['response' => ['code' => 200], 'body' => '{"errcode":0,"errmsg":"ok"}'];
}
namespace Jio\Auth {
final class WeixinGzh {
public static function is_enabled(): bool { return true; }
public static function get_instance(): self { return new self(); }
public function access_token(): string { return 'ACCESS_TOKEN'; }
}
}
namespace Jio\Settings {
class Settings {
public static function get_wechat_settings(): array { return Integration::get_wechat_settings(); }
public static function update_wechat_settings(array $config): void { Integration::update_wechat_settings($config); }
public static function get_weixingzh_settings(): array { return ['gzh_type' => 'service', 'appid' => 'wxAPP', 'appsecret' => 'secret']; }
}
}
namespace {
$root = dirname(__DIR__, 2);
foreach ([
'src/Admin/ControllerBase.php',
'src/Admin/UserControllerReportOperations.php',
'src/Admin/UserControllerAuthPhoneOperations.php',
'src/Admin/UserControllerRestrictionOperations.php',
'src/Admin/UserControllerFollowOperations.php',
'src/Admin/UserControllerProfileMediaOperations.php',
'src/Admin/UserController.php',
'src/Settings/WechatTemplates.php',
'src/Settings/Integration.php',
'src/Payment/WeChatNotifyEvents.php',
'src/Payment/WeChatNotify.php',
] as $file) {
require_once $root . '/' . $file;
}
$check = static function (bool $condition, string $name): void {
if (!$condition) {
fwrite(STDERR, "FAILED: {$name}\n");
exit(1);
}
};
$controller = \Jio\Admin\UserController::get_instance();
$sender = \Jio\Payment\WeChatNotify::get_instance();
$status = $controller->get_wechat_status(new WP_REST_Request())->data['data'];
$check(count($status['types']) === 14, 'available types');
$check($status['bound_users'] === 1 && $status['current_user_bound'], 'real binding key');
$check($status['oauth_ready'], 'oauth status');
$config = ['enabled' => true, 'templates' => [
'comment_to_parent' => ['enabled' => true, 'id' => 'TPL_REPLY', 'keys' => ['name' => 'thing1', 'time' => 'time2', 'content' => '']],
]];
$saved = $controller->update_wechat_settings(new WP_REST_Request($config));
$check($saved->status === 200, 'save accepted');
$stored = get_option('jio_wechat_settings');
$check($stored['templates']['comment_to_parent']['id'] === 'TPL_REPLY', 'template persisted');
$check(count($stored['templates']) === 14, 'all types normalized');
$check(!isset($stored['app_id']) && !isset($stored['app_secret']) && !isset($stored['template_id']), 'obsolete settings removed');
$check($controller->get_wechat_status(new WP_REST_Request())->data['data']['config'] === $stored, 'round trip');
$invalid = $controller->update_wechat_settings(new WP_REST_Request(['enabled' => true, 'templates' => [
'comment_to_parent' => ['enabled' => true, 'id' => 'TPL', 'keys' => ['name' => 'bad key']],
]]));
$check($invalid->status === 400 && get_option('jio_wechat_settings') === $stored, 'invalid mapping rejected without write');
$invalid = $controller->update_wechat_settings(new WP_REST_Request(['enabled' => true, 'templates' => ['unknown' => ['enabled' => true, 'id' => 'X']]]));
$check($invalid->status === 400, 'unknown type rejected');
$invalid = $controller->update_wechat_settings(new WP_REST_Request(['enabled' => true, 'templates' => [
'comment_to_parent' => ['enabled' => true, 'id' => 'TPL', 'keys' => ['name' => 'keyword3']],
]]));
$check($invalid->status === 400 && get_option('jio_wechat_settings') === $stored, 'fallback mapping collision rejected');
$draft = $controller->update_wechat_settings(new WP_REST_Request(['enabled' => true, 'templates' => [
'comment_to_parent' => ['enabled' => true, 'id' => '', 'keys' => []],
]]));
$check($draft->status === 200, 'incomplete template can be saved as draft');
$blocked = $controller->test_wechat_template(new WP_REST_Request(['type' => 'comment_to_parent']));
$check($blocked->status === 400, 'incomplete template cannot be tested');
$controller->update_wechat_settings(new WP_REST_Request($config));
$sent = $sender->send_event(9, 'comment_to_parent', ['name' => str_repeat('中', 25), 'time' => '2026-11-10', 'content' => '测试回复'], 'https://example.test/comment/1');
$body = json_decode($GLOBALS['wechat_last_post'][1]['body'], true);
$check($sent, 'send succeeds');
$check($body['touser'] === 'OPENID9' && $body['template_id'] === 'TPL_REPLY', 'recipient and template');
$check($body['url'] === 'https://example.test/comment/1', 'deep link');
$check($body['data']['thing1']['value'] === str_repeat('中', 16) . '...', 'thing truncation');
$check($body['data']['time2']['value'] === '2026-11-10' && $body['data']['keyword3']['value'] === '测试回复', 'mapping and fallback');
$tested = $controller->test_wechat_template(new WP_REST_Request(['type' => 'comment_to_parent']));
$check($tested->status === 200, 'test endpoint sends');
$GLOBALS['wechat_remote_response'] = ['response' => ['code' => 200], 'body' => '{"errcode":40013,"errmsg":"invalid appid"}'];
$tested = $controller->test_wechat_template(new WP_REST_Request(['type' => 'comment_to_parent']));
$check($tested->status === 502 && str_contains($tested->data['message'], '40013'), 'api failure exposed');
$GLOBALS['wechat_openid'] = '';
$tested = $controller->test_wechat_template(new WP_REST_Request(['type' => 'comment_to_parent']));
$check($tested->status === 400, 'unbound user rejected');
echo "WeChat settings harness passed\n";
}