Backend: .NET 10 Clean Architecture + LiteCqrs.Net + EF Core/PostgreSQL + Identity/JWT. Frontend: React 19 + Vite + TanStack Query/Router + Tailwind v4 with a retro CRT theme. Docker/compose deployment mirroring PnvPanel's conventions, scoped down to the current base feature set.
46 lines
1.7 KiB
C#
46 lines
1.7 KiB
C#
using NSubstitute;
|
|
using TeleWave.Application.Admin.Users;
|
|
using TeleWave.Application.Admin.Users.BlockUser;
|
|
using TeleWave.Application.Common.Interfaces;
|
|
using TeleWave.Application.Common.Models;
|
|
using Xunit;
|
|
|
|
namespace TeleWave.Application.Tests.Admin.Users;
|
|
|
|
public class BlockUserCommandHandlerTests
|
|
{
|
|
private readonly IIdentityService _identityService = Substitute.For<IIdentityService>();
|
|
private readonly ICurrentUser _currentUser = Substitute.For<ICurrentUser>();
|
|
|
|
private BlockUserCommandHandler CreateHandler() => new(_identityService, _currentUser);
|
|
|
|
[Fact]
|
|
public async Task Handle_WhenTargetingSelf_ReturnsFailureWithoutCallingIdentityService()
|
|
{
|
|
var userId = Guid.NewGuid();
|
|
_currentUser.UserId.Returns(userId);
|
|
|
|
var result = await CreateHandler().Handle(new BlockUserCommand(userId), CancellationToken.None);
|
|
|
|
Assert.False(result.IsSuccess);
|
|
Assert.Equal(UserErrors.CannotBlockSelf, result.Error);
|
|
await _identityService.DidNotReceive().BlockUserAsync(Arg.Any<Guid>(), Arg.Any<CancellationToken>());
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Handle_WhenTargetingAnotherUser_DelegatesToIdentityService()
|
|
{
|
|
var adminId = Guid.NewGuid();
|
|
var targetId = Guid.NewGuid();
|
|
_currentUser.UserId.Returns(adminId);
|
|
_identityService
|
|
.BlockUserAsync(targetId, Arg.Any<CancellationToken>())
|
|
.Returns(Result.Success());
|
|
|
|
var result = await CreateHandler().Handle(new BlockUserCommand(targetId), CancellationToken.None);
|
|
|
|
Assert.True(result.IsSuccess);
|
|
await _identityService.Received(1).BlockUserAsync(targetId, Arg.Any<CancellationToken>());
|
|
}
|
|
}
|