155 lines
6.1 KiB
PHP
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);
|
|
}
|