Files
pos-system/services/mining-service-net/tests/MiningService.UnitTests/Application/Commands/ClaimMiningRewardCommandHandlerTests.cs

71 lines
2.4 KiB
C#

using FluentAssertions;
using MiningService.API.Application.Commands;
using MiningService.Domain.AggregatesModel.MinerAggregate;
using MiningService.Domain.Exceptions;
using MiningService.Domain.SeedWork;
using NSubstitute;
using Xunit;
namespace MiningService.UnitTests.Application.Commands;
/// <summary>
/// EN: Unit tests for ClaimMiningRewardCommandHandler.
/// VI: Unit tests cho ClaimMiningRewardCommandHandler.
/// </summary>
public class ClaimMiningRewardCommandHandlerTests
{
private readonly IMinerRepository _minerRepository;
private readonly IUnitOfWork _unitOfWork;
private readonly ClaimMiningRewardCommandHandler _handler;
public ClaimMiningRewardCommandHandlerTests()
{
_unitOfWork = Substitute.For<IUnitOfWork>();
_unitOfWork.SaveEntitiesAsync(Arg.Any<CancellationToken>()).Returns(true);
_minerRepository = Substitute.For<IMinerRepository>();
_minerRepository.UnitOfWork.Returns(_unitOfWork);
_handler = new ClaimMiningRewardCommandHandler(_minerRepository);
}
[Fact(Skip = "Session requires 24h wait - cannot test immediate claim without time manipulation")]
public async Task Handle_ReadySession_ReturnsReward()
{
// Session needs 24 hours to be ready for claim.
// This would require time manipulation techniques to test properly.
await Task.CompletedTask;
}
[Fact]
public async Task Handle_MinerNotFound_ThrowsNotFoundException()
{
// Arrange
var userId = Guid.NewGuid();
var command = new ClaimMiningRewardCommand(userId);
_minerRepository.GetByUserIdAsync(userId, Arg.Any<CancellationToken>())
.Returns((Miner?)null);
// Act & Assert
await Assert.ThrowsAsync<MinerNotFoundException>(() =>
_handler.Handle(command, CancellationToken.None));
}
[Fact]
public async Task Handle_NoActiveSession_ThrowsDomainException()
{
// Arrange
var userId = Guid.NewGuid();
var miner = Miner.Create(userId); // No session started
var command = new ClaimMiningRewardCommand(userId);
_minerRepository.GetByUserIdAsync(userId, Arg.Any<CancellationToken>())
.Returns(miner);
// Act & Assert
await Assert.ThrowsAsync<MiningDomainException>(() =>
_handler.Handle(command, CancellationToken.None));
}
}