using NSubstitute; using PnvPanel.Application.Auth; using PnvPanel.Application.Auth.Me; using PnvPanel.Application.Common.Interfaces; using PnvPanel.Application.Common.Models; using PnvPanel.Application.Tests.TestSupport; using Xunit; namespace PnvPanel.Application.Tests.Auth; public class GetCurrentUserQueryHandlerTests { private readonly IIdentityService _identityService = Substitute.For(); [Fact] public async Task Handle_Unauthenticated_ReturnsUnauthorized() { var handler = new GetCurrentUserQueryHandler(_identityService, FakeCurrentUser.Anonymous()); var result = await handler.Handle(new GetCurrentUserQuery(), CancellationToken.None); Assert.False(result.IsSuccess); Assert.Equal(AuthErrors.Unauthorized, result.Error); } [Fact] public async Task Handle_ProfileMissing_ReturnsUnauthorized() { var userId = Guid.NewGuid(); _identityService .GetProfileAsync(userId, Arg.Any()) .Returns((CurrentUserProfile?)null); var handler = new GetCurrentUserQueryHandler( _identityService, FakeCurrentUser.Authenticated(userId) ); var result = await handler.Handle(new GetCurrentUserQuery(), CancellationToken.None); Assert.False(result.IsSuccess); Assert.Equal(AuthErrors.Unauthorized, result.Error); } [Fact] public async Task Handle_AuthenticatedWithProfile_ReturnsCurrentUserDto() { var userId = Guid.NewGuid(); var profile = new CurrentUserProfile( userId, "alice", Guid.NewGuid(), "user", true, false, 3, RoleQuota.Unlimited, "sub-token", false, null, false ); _identityService.GetProfileAsync(userId, Arg.Any()).Returns(profile); _identityService .GetTelegramLinkInfoAsync(userId, Arg.Any()) .Returns(new TelegramLinkInfo(true, 42, "alice_tg")); var handler = new GetCurrentUserQueryHandler( _identityService, FakeCurrentUser.Authenticated(userId, "alice") ); var result = await handler.Handle(new GetCurrentUserQuery(), CancellationToken.None); Assert.True(result.IsSuccess); Assert.Equal(userId, result.Value.Id); Assert.Equal("alice", result.Value.UserName); Assert.Equal("user", result.Value.Role); Assert.True(result.Value.IsActivated); Assert.True(result.Value.TelegramLinked); } }