Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Moq;
using Server.Api.Dto.Response;
using Server.Application.Exceptions;
using Server.Application.Port.Output.Cache;
using Server.Application.Port.Output.Persistence;
using Server.Application.Port.Output.StaticData;
using Server.Application.UseCase.Player;
Expand All @@ -15,16 +16,26 @@ public class GetPlayerLevelUseCaseTests
{
private readonly Mock<IDataRepository> _repositoryMock = new();
private readonly Mock<ILevelDefinitionStore> _levelStoreMock = new();
private readonly Mock<ICacheAsideService> _cacheMock = new();

private GetPlayerLevelUseCase CreateUseCase() =>
new(_repositoryMock.Object, _levelStoreMock.Object);
new(_repositoryMock.Object, _levelStoreMock.Object, _cacheMock.Object);

private void SetupCache(PlayerData? returnValue)
{
_cacheMock
.Setup(x => x.GetOrSetAsync(
It.IsAny<string>(),
It.IsAny<Func<CancellationToken, Task<PlayerData?>>>(),
It.IsAny<TimeSpan>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync(returnValue);
}

[Fact]
public async Task ExecuteAsync_Should_Throw_When_Player_Not_Found()
{
_repositoryMock
.Setup(x => x.FindByUserIdAsync(It.IsAny<int>(), It.IsAny<CancellationToken>()))
.ReturnsAsync((PlayerData?)null);
SetupCache(null);

var useCase = CreateUseCase();
var command = new GetPlayerLevelCommand(1);
Expand All @@ -40,9 +51,7 @@ public async Task ExecuteAsync_Should_Throw_When_Level_Not_Found()
{
var gameData = PlayerData.Create(1, "Player");

_repositoryMock
.Setup(x => x.FindByUserIdAsync(1, It.IsAny<CancellationToken>()))
.ReturnsAsync(gameData);
SetupCache(gameData);

_levelStoreMock
.Setup(x => x.GetLevelDefinition(It.IsAny<int>()))
Expand All @@ -61,11 +70,9 @@ public async Task ExecuteAsync_Should_Throw_When_Level_Not_Found()
public async Task ExecuteAsync_Should_Return_Level_Info_When_Success()
{
var gameData = PlayerData.Create(1, "Player");
var levelDefinition = new LevelDefinition(1,100, 50);
var levelDefinition = new LevelDefinition(1, 100, 50);

_repositoryMock
.Setup(x => x.FindByUserIdAsync(1, It.IsAny<CancellationToken>()))
.ReturnsAsync(gameData);
SetupCache(gameData);

_levelStoreMock
.Setup(x => x.GetLevelDefinition(1))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,45 +1,56 @@
using Server.Api.Dto.Response;
using Server.Application.Exceptions;
using Server.Application.Port.Input.Player;
using Server.Application.Port.Output.Cache;
using Server.Application.Port.Output.Persistence;
using Server.Application.Port.Output.StaticData;
using Server.Application.UseCase.Player.Command;
using Server.Application.UseCase.Player.Result;
using Server.Infrastructure.Cache;

namespace Server.Application.UseCase.Player;

public class GetPlayerLevelUseCase : IGetPlayerLevelUseCase
{
private readonly IDataRepository _repository;
private readonly ILevelDefinitionStore _store;
private readonly ICacheAsideService _cache;

public GetPlayerLevelUseCase(
IDataRepository repository,
ILevelDefinitionStore store
ILevelDefinitionStore store,
ICacheAsideService cache
)
{
_repository = repository;
_store = store;
_cache = cache;
}


public async Task<GetPlayerLevelResult> ExecuteAsync(GetPlayerLevelCommand request, CancellationToken ct)
{
var data = await _repository.FindByUserIdAsync(request.UserId, ct)
?? throw new RequestException(
var player = await _cache.GetOrSetAsync(
CacheKey.Profile.ByUserId(request.UserId),
async (token) => await _repository.FindByUserIdAsync(request.UserId, token),
TimeSpan.FromDays(30),
ct
);

if (player == null)
throw new RequestException(
ErrorStatusCode.NotFound,
"PLAYER_NOT_FOUND",
new { UserId = request.UserId });
"PLAYER_NOT_FOUND");

var levelDef = _store.GetLevelDefinition(data.Level)
var levelDef = _store.GetLevelDefinition(player.Level)
?? throw new RequestException(
ErrorStatusCode.NotFound,
"LEVEL_NOT_FOUND",
new { Level = data.Level });
new { Level = player.Level });

return new GetPlayerLevelResult(
data.Level,
data.Exp,
player.Level,
player.Exp,
levelDef.MaxExp
);
}
Expand Down
Loading