refactor(middleware): split V2 server middleware to drop node_type
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
<?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,
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user