using NSubstitute; using PnvPanel.Application.Admin.Inbounds; using PnvPanel.Application.Common.Interfaces; using PnvPanel.Application.Tests.TestSupport; using PnvPanel.Domain.Inbounds; using Xunit; namespace PnvPanel.Application.Tests.Admin.Inbounds; public class PublishInboundCommandHandlerTests { private readonly ICurrentUser _currentUser = Substitute.For(); [Fact] public async Task Handle_WhenPublishingExistingInbound_UpdatesPublishState() { using var dbContext = InMemoryDbContextFactory.Create(); var inbound = Inbound.FromRemote(Guid.NewGuid(), "1", VpnProtocol.Vless, "remark", 443); dbContext.Inbounds.Add(inbound); await dbContext.SaveChangesAsync(CancellationToken.None); var roleId = Guid.NewGuid(); var handler = new PublishInboundCommandHandler(dbContext, _currentUser); var command = new PublishInboundCommand(inbound.Id, true, "EU Fast", [roleId], 100); var result = await handler.Handle(command, CancellationToken.None); Assert.True(result.IsSuccess); Assert.True(inbound.IsPublished); Assert.Equal("EU Fast", inbound.DisplayName); Assert.Equal(100, inbound.MaxClients); Assert.Contains(roleId, inbound.AllowedRoleIds); Assert.Equal("EU Fast", result.Value.DisplayName); } [Fact] public async Task Handle_WhenUnpublishing_ClearsPublishedFlag() { using var dbContext = InMemoryDbContextFactory.Create(); var inbound = Inbound.FromRemote(Guid.NewGuid(), "1", VpnProtocol.Vless, "remark", 443); inbound.Publish("EU Fast", [Guid.NewGuid()], 100); dbContext.Inbounds.Add(inbound); await dbContext.SaveChangesAsync(CancellationToken.None); var handler = new PublishInboundCommandHandler(dbContext, _currentUser); var command = new PublishInboundCommand(inbound.Id, false, null, [], null); var result = await handler.Handle(command, CancellationToken.None); Assert.True(result.IsSuccess); Assert.False(inbound.IsPublished); } [Fact] public async Task Handle_WhenInboundNotFound_ReturnsNotFound() { using var dbContext = InMemoryDbContextFactory.Create(); var handler = new PublishInboundCommandHandler(dbContext, _currentUser); var command = new PublishInboundCommand(Guid.NewGuid(), true, "EU Fast", [], null); var result = await handler.Handle(command, CancellationToken.None); Assert.False(result.IsSuccess); Assert.Equal(InboundErrors.NotFound, result.Error); } }