using NSubstitute; using PnvPanel.Application.Common.Interfaces; using PnvPanel.Application.Telegram; using PnvPanel.Application.Telegram.Bot; using PnvPanel.Application.Tests.TestSupport; using PnvPanel.Domain.Telegram; using Xunit; namespace PnvPanel.Application.Tests.Telegram.Bot; public class ApproveTelegramLoginCommandHandlerTests { private readonly IIdentityService _identityService = Substitute.For(); [Fact] public async Task Handle_WhenPendingRequestAndLinkedUser_ApprovesRequest() { using var dbContext = InMemoryDbContextFactory.Create(); var userId = Guid.NewGuid(); const long telegramUserId = 123456L; var request = TelegramLoginRequest.Create(TimeSpan.FromMinutes(5), null); dbContext.TelegramLoginRequests.Add(request); await dbContext.SaveChangesAsync(CancellationToken.None); _identityService.FindUserIdByTelegramUserIdAsync(telegramUserId, Arg.Any()).Returns(userId); var handler = new ApproveTelegramLoginCommandHandler(dbContext, _identityService); var result = await handler.Handle(new ApproveTelegramLoginCommand(request.Id, telegramUserId), CancellationToken.None); Assert.True(result.IsSuccess); Assert.Equal(TelegramLoginStatus.Approved, request.Status); Assert.Equal(userId, request.UserId); } [Fact] public async Task Handle_WhenTelegramUserNotLinked_ReturnsNotLinked() { using var dbContext = InMemoryDbContextFactory.Create(); const long telegramUserId = 123456L; _identityService.FindUserIdByTelegramUserIdAsync(telegramUserId, Arg.Any()) .Returns((Guid?)null); var handler = new ApproveTelegramLoginCommandHandler(dbContext, _identityService); var result = await handler.Handle(new ApproveTelegramLoginCommand(Guid.NewGuid(), telegramUserId), CancellationToken.None); Assert.False(result.IsSuccess); Assert.Equal(TelegramErrors.NotLinked, result.Error); } [Fact] public async Task Handle_WhenLoginRequestNotFound_ReturnsNotFound() { using var dbContext = InMemoryDbContextFactory.Create(); var userId = Guid.NewGuid(); const long telegramUserId = 123456L; _identityService.FindUserIdByTelegramUserIdAsync(telegramUserId, Arg.Any()).Returns(userId); var handler = new ApproveTelegramLoginCommandHandler(dbContext, _identityService); var result = await handler.Handle(new ApproveTelegramLoginCommand(Guid.NewGuid(), telegramUserId), CancellationToken.None); Assert.False(result.IsSuccess); Assert.Equal(TelegramErrors.LoginRequestNotFound, result.Error); } [Fact] public async Task Handle_WhenRequestAlreadyDecided_ReturnsConflict() { using var dbContext = InMemoryDbContextFactory.Create(); var userId = Guid.NewGuid(); const long telegramUserId = 123456L; var request = TelegramLoginRequest.Create(TimeSpan.FromMinutes(5), null); request.Reject(); dbContext.TelegramLoginRequests.Add(request); await dbContext.SaveChangesAsync(CancellationToken.None); _identityService.FindUserIdByTelegramUserIdAsync(telegramUserId, Arg.Any()).Returns(userId); var handler = new ApproveTelegramLoginCommandHandler(dbContext, _identityService); var result = await handler.Handle(new ApproveTelegramLoginCommand(request.Id, telegramUserId), CancellationToken.None); Assert.False(result.IsSuccess); Assert.Equal("Telegram.LoginRequestInvalid", result.Error.Code); } [Fact] public async Task Handle_WhenRequestExpired_ReturnsConflict() { using var dbContext = InMemoryDbContextFactory.Create(); var userId = Guid.NewGuid(); const long telegramUserId = 123456L; var request = TelegramLoginRequest.Create(TimeSpan.FromMinutes(-5), null); dbContext.TelegramLoginRequests.Add(request); await dbContext.SaveChangesAsync(CancellationToken.None); _identityService.FindUserIdByTelegramUserIdAsync(telegramUserId, Arg.Any()).Returns(userId); var handler = new ApproveTelegramLoginCommandHandler(dbContext, _identityService); var result = await handler.Handle(new ApproveTelegramLoginCommand(request.Id, telegramUserId), CancellationToken.None); Assert.False(result.IsSuccess); Assert.Equal("Telegram.LoginRequestInvalid", result.Error.Code); } }