132 lines
3.5 KiB
PHP
132 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature\Server;
|
|
|
|
use App\Models\Server;
|
|
use App\Models\ServerMachine;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Illuminate\Support\Facades\Bus;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Tests\TestCase;
|
|
|
|
class ServerHandshakeTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
config()->set('app.key', 'base64:' . base64_encode(str_repeat('a', 32)));
|
|
Cache::forever('admin_settings', [
|
|
'server_token' => 'server-token',
|
|
'server_ws_enable' => 0,
|
|
]);
|
|
}
|
|
|
|
public function test_v2_handshake_accepts_token_only_without_node(): void
|
|
{
|
|
$response = $this->postJson('/api/v2/server/handshake', [
|
|
'token' => 'server-token',
|
|
]);
|
|
|
|
$response->assertOk()->assertJsonStructure(['websocket' => ['enabled']]);
|
|
}
|
|
|
|
public function test_v2_handshake_rejects_invalid_token(): void
|
|
{
|
|
$response = $this->postJson('/api/v2/server/handshake', [
|
|
'token' => 'wrong-token',
|
|
]);
|
|
|
|
$response->assertStatus(422);
|
|
}
|
|
|
|
public function test_v2_report_works_without_node_type(): void
|
|
{
|
|
Bus::fake();
|
|
|
|
$server = $this->makeServer();
|
|
|
|
$response = $this->postJson('/api/v2/server/report', [
|
|
'token' => 'server-token',
|
|
'node_id' => $server->id,
|
|
]);
|
|
|
|
$response->assertOk()->assertJson(['data' => true]);
|
|
}
|
|
|
|
public function test_v2_report_ignores_node_type_field(): void
|
|
{
|
|
Bus::fake();
|
|
|
|
$server = $this->makeServer();
|
|
|
|
// legacy node clients may still send node_type; V2 must accept it as no-op.
|
|
$response = $this->postJson('/api/v2/server/report', [
|
|
'token' => 'server-token',
|
|
'node_id' => $server->id,
|
|
'node_type' => 'this-would-be-rejected-by-v1',
|
|
]);
|
|
|
|
$response->assertOk()->assertJson(['data' => true]);
|
|
}
|
|
|
|
public function test_v2_report_rejects_unknown_node(): void
|
|
{
|
|
$response = $this->postJson('/api/v2/server/report', [
|
|
'token' => 'server-token',
|
|
'node_id' => 999999,
|
|
]);
|
|
|
|
$response->assertStatus(400);
|
|
$response->assertJson(['message' => 'Server does not exist']);
|
|
}
|
|
|
|
public function test_v2_machine_handshake_with_machine_id_and_no_node(): void
|
|
{
|
|
$machine = ServerMachine::create([
|
|
'name' => 'test-machine',
|
|
'token' => 'machine-token',
|
|
'is_active' => true,
|
|
]);
|
|
|
|
$response = $this->postJson('/api/v2/server/handshake', [
|
|
'machine_id' => $machine->id,
|
|
'token' => 'machine-token',
|
|
]);
|
|
|
|
$response->assertOk();
|
|
}
|
|
|
|
public function test_v2_machine_report_requires_node_id(): void
|
|
{
|
|
$machine = ServerMachine::create([
|
|
'name' => 'test-machine',
|
|
'token' => 'machine-token',
|
|
'is_active' => true,
|
|
]);
|
|
|
|
$response = $this->postJson('/api/v2/server/report', [
|
|
'machine_id' => $machine->id,
|
|
'token' => 'machine-token',
|
|
]);
|
|
|
|
$response->assertStatus(422);
|
|
}
|
|
|
|
private function makeServer(): Server
|
|
{
|
|
return Server::create([
|
|
'name' => 'test-node',
|
|
'type' => Server::TYPE_VMESS,
|
|
'host' => '127.0.0.1',
|
|
'port' => 443,
|
|
'server_port' => 443,
|
|
'rate' => '1',
|
|
'group_id' => [1],
|
|
'enabled' => true,
|
|
]);
|
|
}
|
|
}
|