using PnvPanel.Application.Common.Interfaces; using PnvPanel.Application.Common.Models; using PnvPanel.Domain.Inbounds; using PnvPanel.Domain.Nodes; namespace PnvPanel.IntegrationTests.TestSupport; /// /// Заглушка 3x-ui для интеграционных тестов — реальной панели нет. Возвращает успех для проб/CRUD /// клиентов, отдаёт один синтетический inbound на ноду для сценариев с SyncNode. /// public sealed class FakeXuiPanelGateway : IXuiPanelGateway { public Result ValidateBaseAddress(Uri baseAddress) => Result.Success(); public Task ProbeAsync(Node node, CancellationToken cancellationToken) => Task.FromResult(new NodeProbeResult(true, null)); public Task>> ListInboundsAsync( Node node, CancellationToken cancellationToken ) { IReadOnlyList inbounds = [ new RemoteInboundInfo("1", VpnProtocol.Vless, "Test inbound", 443), ]; return Task.FromResult(Result.Success(inbounds)); } public void InvalidateClient(Guid nodeId) { } public Task> AddClientAsync( Node node, string inboundRemoteId, VpnProtocol protocol, string clientEmail, string clientName, int limitIp, DateTimeOffset? expiresAt, CancellationToken cancellationToken ) => Task.FromResult(Result.Success(Guid.NewGuid().ToString())); public Task RemoveClientAsync( Node node, string inboundRemoteId, string clientExternalId, VpnProtocol protocol, CancellationToken cancellationToken ) => Task.FromResult(Result.Success()); public Task UpdateClientAsync( Node node, string inboundRemoteId, string clientExternalId, VpnProtocol protocol, string? name, bool? enable, DateTimeOffset? expiresAt, CancellationToken cancellationToken ) => Task.FromResult(Result.Success()); public Task> BuildConnectionStringAsync( Node node, Inbound inbound, string clientExternalId, string clientName, string publicHost, CancellationToken cancellationToken ) => Task.FromResult(Result.Success("vless://fake-connection-string")); public Task>> GetClientTrafficAsync( Node node, string inboundRemoteId, CancellationToken cancellationToken ) { IReadOnlyDictionary traffic = new Dictionary(); return Task.FromResult(Result.Success(traffic)); } }