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, ]); } }