Files
Xboard/tests/Unit/ServerAutoOnlineServiceTest.php
T
yinjianm 1739f7a2f9 feat(api): 新增节点流量悬浮详情与即时自动上线同步
为 server/manage/getNodes 返回节点级今日、本月与累计流量统计,
并在节点管理页名称悬浮层展示上行、下行和合计流量。

同时为自动上线补齐单节点同步入口,在管理端保存、
批量更新以及 REST/WS 心跳后立即同步 show 状态,
避免复制节点后开启自动上线仍需等待定时任务。

另优化管理端前端 Docker 发布流程,默认仅构建 amd64,
并收敛 BuildKit 缓存导出以缩短发布时间
2026-04-28 16:51:35 +08:00

158 lines
4.8 KiB
PHP

<?php
namespace Tests\Unit;
use App\Models\Server;
use App\Models\ServerGfwCheck;
use App\Services\ServerAutoOnlineService;
use App\Services\ServerService;
use App\Utils\CacheKey;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Cache;
use Tests\TestCase;
class ServerAutoOnlineServiceTest extends TestCase
{
use RefreshDatabase;
public function test_sync_updates_only_nodes_with_auto_online_enabled(): void
{
$managedOffline = $this->makeServer([
'name' => 'managed-offline',
'show' => true,
'auto_online' => true,
]);
$managedOnline = $this->makeServer([
'name' => 'managed-online',
'show' => false,
'auto_online' => true,
]);
$manualOffline = $this->makeServer([
'name' => 'manual-offline',
'show' => true,
'auto_online' => false,
]);
$this->markNodeOnline($managedOnline);
$result = app(ServerAutoOnlineService::class)->sync();
$this->assertSame(2, $result['total']);
$this->assertSame(2, $result['updated']);
$this->assertSame(1, $result['shown']);
$this->assertSame(1, $result['hidden']);
$this->assertFalse($managedOffline->fresh()->show);
$this->assertTrue($managedOnline->fresh()->show);
$this->assertTrue($manualOffline->fresh()->show);
}
public function test_sync_keeps_gfw_blocked_auto_online_node_hidden(): void
{
$managedOnline = $this->makeServer([
'name' => 'managed-gfw-blocked',
'show' => true,
'auto_online' => true,
'gfw_check_enabled' => true,
]);
$this->markNodeOnline($managedOnline);
ServerGfwCheck::create([
'server_id' => $managedOnline->id,
'status' => ServerGfwCheck::STATUS_BLOCKED,
'checked_at' => time(),
]);
$result = app(ServerAutoOnlineService::class)->sync();
$this->assertSame(1, $result['total']);
$this->assertSame(1, $result['updated']);
$this->assertSame(0, $result['shown']);
$this->assertSame(1, $result['hidden']);
$this->assertFalse($managedOnline->fresh()->show);
$this->assertTrue($managedOnline->fresh()->gfw_auto_hidden);
}
public function test_sync_ignores_blocked_status_when_gfw_check_is_disabled(): void
{
$managedOnline = $this->makeServer([
'name' => 'managed-gfw-disabled',
'show' => false,
'auto_online' => true,
'gfw_check_enabled' => false,
]);
$this->markNodeOnline($managedOnline);
ServerGfwCheck::create([
'server_id' => $managedOnline->id,
'status' => ServerGfwCheck::STATUS_BLOCKED,
'checked_at' => time(),
]);
$result = app(ServerAutoOnlineService::class)->sync();
$this->assertSame(1, $result['total']);
$this->assertSame(1, $result['updated']);
$this->assertSame(1, $result['shown']);
$this->assertTrue($managedOnline->fresh()->show);
}
public function test_sync_server_updates_single_auto_online_node(): void
{
$managedOnline = $this->makeServer([
'name' => 'single-managed-online',
'show' => false,
'auto_online' => true,
]);
$this->markNodeOnline($managedOnline);
$result = app(ServerAutoOnlineService::class)->syncServer($managedOnline);
$this->assertSame(1, $result['total']);
$this->assertSame(1, $result['updated']);
$this->assertSame(1, $result['shown']);
$this->assertTrue($managedOnline->fresh()->show);
}
public function test_touch_node_syncs_auto_online_node_immediately(): void
{
$managedOnline = $this->makeServer([
'name' => 'heartbeat-managed-online',
'show' => false,
'auto_online' => true,
]);
ServerService::touchNode($managedOnline);
$this->assertTrue($managedOnline->fresh()->show);
}
private function makeServer(array $attributes = []): Server
{
return Server::create(array_merge([
'name' => 'test-node',
'type' => Server::TYPE_VMESS,
'host' => '127.0.0.1',
'port' => 443,
'server_port' => 443,
'rate' => '1',
'group_ids' => [1],
'show' => false,
'auto_online' => false,
'gfw_check_enabled' => true,
'gfw_auto_hidden' => false,
'enabled' => true,
], $attributes));
}
private function markNodeOnline(Server $server): void
{
Cache::put(
CacheKey::get('SERVER_' . strtoupper($server->type) . '_LAST_CHECK_AT', $server->id),
time(),
3600
);
}
}