Files
anxinyan/server-api/tools/smoke_check.php
2026-05-15 14:01:36 +08:00

155 lines
6.1 KiB
PHP

<?php
declare(strict_types=1);
require dirname(__DIR__) . '/vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));
$dotenv->safeLoad();
$baseUrl = 'http://127.0.0.1:8787';
function requestJson(string $method, string $url, array $payload = [], array $headers = []): array
{
$ch = curl_init();
$defaultHeaders = ['Accept: application/json'];
if ($payload) {
$defaultHeaders[] = 'Content-Type: application/json';
}
foreach ($headers as $header) {
$defaultHeaders[] = $header;
}
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => $defaultHeaders,
]);
if ($payload) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload, JSON_UNESCAPED_UNICODE));
}
$response = curl_exec($ch);
$errno = curl_errno($ch);
$error = curl_error($ch);
$httpCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($errno) {
throw new RuntimeException("HTTP {$method} {$url} failed: {$error}");
}
$decoded = json_decode((string)$response, true);
return [
'status' => $httpCode,
'body' => is_array($decoded) ? $decoded : ['raw' => $response],
];
}
function assertOk(string $label, array $response): void
{
$status = $response['status'];
$body = $response['body'];
$code = $body['code'] ?? null;
if ($status !== 200 || $code !== 0) {
throw new RuntimeException("{$label} failed: http={$status} body=" . json_encode($body, JSON_UNESCAPED_UNICODE));
}
echo "[PASS] {$label}\n";
}
try {
assertOk('app home', requestJson('GET', $baseUrl . '/api/app/home/index'));
assertOk('app help center', requestJson('GET', $baseUrl . '/api/app/help-center'));
$appLogin = requestJson('POST', $baseUrl . '/api/app/auth/login/password', [
'mobile' => '13800000000',
'password' => 'User@123456',
]);
assertOk('app login', $appLogin);
$appToken = $appLogin['body']['data']['token'] ?? '';
if (!$appToken) {
throw new RuntimeException('app login did not return token');
}
$appAuthHeader = ['Authorization: Bearer ' . $appToken];
assertOk('app me', requestJson('GET', $baseUrl . '/api/app/auth/me', [], $appAuthHeader));
$appReports = requestJson('GET', $baseUrl . '/api/app/reports', [], $appAuthHeader);
assertOk('app reports', $appReports);
$appOrders = requestJson('GET', $baseUrl . '/api/app/orders', [], $appAuthHeader);
assertOk('app orders', $appOrders);
assertOk('app messages summary', requestJson('GET', $baseUrl . '/api/app/messages/summary', [], $appAuthHeader));
assertOk('app addresses', requestJson('GET', $baseUrl . '/api/app/addresses', [], $appAuthHeader));
assertOk('app settings', requestJson('GET', $baseUrl . '/api/app/settings', [], $appAuthHeader));
$completedOrder = null;
foreach (($appOrders['body']['data']['list'] ?? []) as $item) {
if (($item['order_status'] ?? '') === 'completed') {
$completedOrder = $item;
break;
}
}
if ($completedOrder) {
$orderDetail = requestJson('GET', $baseUrl . '/api/app/order/detail?id=' . (int)$completedOrder['order_id'], [], $appAuthHeader);
assertOk('app order detail completed', $orderDetail);
}
$reportNo = $appReports['body']['data']['list'][0]['report_no'] ?? '';
if ($reportNo !== '') {
$reportDetail = requestJson('GET', $baseUrl . '/api/app/report/detail?report_no=' . rawurlencode($reportNo));
assertOk('app public report detail', $reportDetail);
$isZhongjianReport = ($reportDetail['body']['data']['report_header']['service_provider'] ?? '') === 'zhongjian';
$verifyQr = $reportDetail['body']['data']['verify_info']['verify_qrcode_url'] ?? '';
if (!$isZhongjianReport && $verifyQr === '') {
throw new RuntimeException('app public report detail missing verify_qrcode_url');
}
if (!$isZhongjianReport) {
assertOk('app public verify', requestJson('GET', $baseUrl . '/api/app/verify?report_no=' . rawurlencode($reportNo)));
}
}
$appLogout = requestJson('POST', $baseUrl . '/api/app/auth/logout', [], $appAuthHeader);
assertOk('app logout', $appLogout);
$login = requestJson('POST', $baseUrl . '/api/admin/auth/login', [
'mobile' => '13800138000',
'password' => 'Anxinyan@2026!',
]);
assertOk('admin login', $login);
$token = $login['body']['data']['token'] ?? '';
if (!$token) {
throw new RuntimeException('admin login did not return token');
}
$authHeader = ['Authorization: Bearer ' . $token];
assertOk('admin me', requestJson('GET', $baseUrl . '/api/admin/auth/me', [], $authHeader));
assertOk('admin dashboard', requestJson('GET', $baseUrl . '/api/admin/dashboard', [], $authHeader));
assertOk('admin users overview', requestJson('GET', $baseUrl . '/api/admin/users/overview', [], $authHeader));
assertOk('admin access overview', requestJson('GET', $baseUrl . '/api/admin/access/overview', [], $authHeader));
assertOk('admin system configs', requestJson('GET', $baseUrl . '/api/admin/system-configs', [], $authHeader));
$adminOrders = requestJson('GET', $baseUrl . '/api/admin/orders', [], $authHeader);
assertOk('admin orders', $adminOrders);
$adminCompletedOrder = null;
foreach (($adminOrders['body']['data']['list'] ?? []) as $item) {
if (($item['order_status'] ?? '') === 'completed') {
$adminCompletedOrder = $item;
break;
}
}
if ($adminCompletedOrder) {
$adminOrderDetail = requestJson('GET', $baseUrl . '/api/admin/order/detail?id=' . (int)$adminCompletedOrder['id'], [], $authHeader);
assertOk('admin order detail completed', $adminOrderDetail);
}
$logout = requestJson('POST', $baseUrl . '/api/admin/auth/logout', [], $authHeader);
assertOk('admin logout', $logout);
echo "SMOKE_OK\n";
} catch (Throwable $e) {
fwrite(STDERR, "SMOKE_FAIL: " . $e->getMessage() . "\n");
exit(1);
}