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
6 changes: 0 additions & 6 deletions ArenaService.Shared/Dtos/CompletedArenaLeaderboardResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,6 @@

namespace ArenaService.Shared.Dtos;

public class CompletedArenaLeaderboardResponse
{
public SimpleSeasonResponse CurrentSeason { get; set; } = new();
public List<CompletedSeasonLeaderboardResponse> CompletedSeasons { get; set; } = new();
}

public class CompletedSeasonLeaderboardResponse
{
public SimpleSeasonResponse Season { get; set; } = new();
Expand Down
73 changes: 24 additions & 49 deletions ArenaService.Tests/Controllers/LeaderboardControllerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,29 +39,20 @@ public async Task GetCompletedArenaLeaderboard_WithValidBlockIndex_ReturnsOkResu
{
// Arrange
var blockIndex = 1000000L;
var currentSeason = new Season
var season = new Season
{
Id = 2,
SeasonGroupId = 2,
StartBlock = 800000,
EndBlock = 1200000,
Id = 1,
SeasonGroupId = 1,
StartBlock = 400000,
EndBlock = 800000,
ArenaType = ArenaType.SEASON,
};
var currentRound = new Round
var round = new Round
{
Id = 1,
RoundIndex = 1,
StartBlock = 800000,
EndBlock = 1200000,
};

var completedSeason = new Season
{
Id = 1,
SeasonGroupId = 1,
StartBlock = 400000,
EndBlock = 800000,
ArenaType = ArenaType.SEASON,
};

var user = new User
Expand All @@ -86,32 +77,23 @@ public async Task GetCompletedArenaLeaderboard_WithValidBlockIndex_ReturnsOkResu

_mockSeasonService
.Setup(x => x.GetSeasonAndRoundByBlock(blockIndex))
.ReturnsAsync((currentSeason, currentRound));

_mockSeasonService
.Setup(x => x.GetCompletedSeasonsBeforeBlock(blockIndex))
.ReturnsAsync(new List<Season> { completedSeason });
.ReturnsAsync((season, round));

_mockLeaderboardRepo
.Setup(x => x.GetLeaderboardAsync(completedSeason.Id))
.Setup(x => x.GetLeaderboardAsync(season.Id))
.ReturnsAsync(leaderboardData);

// Act
var result = await _controller.GetCompletedArenaLeaderboard(blockIndex);

// Assert
var okResult = Assert.IsType<OkObjectResult>(result.Result);
var response = Assert.IsType<CompletedArenaLeaderboardResponse>(okResult.Value);

Assert.NotNull(response.CurrentSeason);
Assert.Equal(currentSeason.Id, response.CurrentSeason.Id);
Assert.Single(response.CompletedSeasons);

var completedSeasonResponse = response.CompletedSeasons[0];
Assert.Equal(completedSeason.Id, completedSeasonResponse.Season.Id);
Assert.Single(completedSeasonResponse.Leaderboard);

var leaderboardEntry = completedSeasonResponse.Leaderboard[0];
var response = Assert.IsType<CompletedSeasonLeaderboardResponse>(okResult.Value);

Assert.Equal(season.Id, response.Season.Id);
Assert.Single(response.Leaderboard);

var leaderboardEntry = response.Leaderboard[0];
Assert.Equal(1, leaderboardEntry.Rank);
Assert.Equal(100, leaderboardEntry.Score);
Assert.Equal("0x1234567890123456789012345678901234567890", leaderboardEntry.AvatarAddress);
Expand All @@ -123,44 +105,36 @@ public async Task GetCompletedArenaLeaderboard_WithValidBlockIndex_ReturnsOkResu
}

[Fact]
public async Task GetCompletedArenaLeaderboard_WithNoCompletedSeasons_ReturnsEmptyList()
public async Task GetCompletedArenaLeaderboard_WithOngoingSeason_ReturnsBadRequest()
{
// Arrange
var blockIndex = 1000000L;
var currentSeason = new Season
var blockIndex = 600000L;
var season = new Season
{
Id = 1,
SeasonGroupId = 1,
StartBlock = 400000,
EndBlock = 1200000,
EndBlock = 800000,
ArenaType = ArenaType.SEASON,
};
var currentRound = new Round
var round = new Round
{
Id = 1,
RoundIndex = 1,
StartBlock = 400000,
EndBlock = 1200000,
EndBlock = 800000,
};

_mockSeasonService
.Setup(x => x.GetSeasonAndRoundByBlock(blockIndex))
.ReturnsAsync((currentSeason, currentRound));

_mockSeasonService
.Setup(x => x.GetCompletedSeasonsBeforeBlock(blockIndex))
.ReturnsAsync(new List<Season>());
.ReturnsAsync((season, round));

// Act
var result = await _controller.GetCompletedArenaLeaderboard(blockIndex);

// Assert
var okResult = Assert.IsType<OkObjectResult>(result.Result);
var response = Assert.IsType<CompletedArenaLeaderboardResponse>(okResult.Value);

Assert.NotNull(response.CurrentSeason);
Assert.Equal(currentSeason.Id, response.CurrentSeason.Id);
Assert.Empty(response.CompletedSeasons);
var badRequestResult = Assert.IsType<BadRequestObjectResult>(result.Result);
Assert.Equal("The requested block index corresponds to an ongoing season.", badRequestResult.Value);
}

[Fact]
Expand All @@ -179,5 +153,6 @@ public async Task GetCompletedArenaLeaderboard_WithException_ReturnsBadRequest()

// Assert
var badRequestResult = Assert.IsType<BadRequestObjectResult>(result.Result);
Assert.Equal(errorMessage, badRequestResult.Value);
}
}
67 changes: 15 additions & 52 deletions ArenaService/Controllers/LeaderboardController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,51 +42,25 @@ public async Task<ActionResult<int>> GetRankingCount(int seasonId, int roundInde
[SwaggerResponse(
StatusCodes.Status200OK,
"Completed Arena Leaderboard Response",
typeof(CompletedArenaLeaderboardResponse)
typeof(CompletedSeasonLeaderboardResponse)
)]
public async Task<ActionResult<CompletedArenaLeaderboardResponse>> GetCompletedArenaLeaderboard(
public async Task<ActionResult<CompletedSeasonLeaderboardResponse>> GetCompletedArenaLeaderboard(
long blockIndex
)
{
(Season Season, Round Round) currentSeasonInfo;
try
{
currentSeasonInfo = await _seasonService.GetSeasonAndRoundByBlock(blockIndex);
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}

var currentSeason = currentSeasonInfo.Season;

var completedSeasons = await _seasonService.GetCompletedSeasonsBeforeBlock(blockIndex);
var seasonInfo = await _seasonService.GetSeasonAndRoundByBlock(blockIndex);
var season = seasonInfo.Season;

if (!completedSeasons.Any())
{
return Ok(
new CompletedArenaLeaderboardResponse
{
CurrentSeason = new SimpleSeasonResponse
{
Id = currentSeason.Id,
SeasonGroupId = currentSeason.SeasonGroupId,
StartBlock = currentSeason.StartBlock,
EndBlock = currentSeason.EndBlock,
ArenaType = currentSeason.ArenaType,
},
CompletedSeasons = new List<CompletedSeasonLeaderboardResponse>(),
}
);
}

var completedSeasonLeaderboards = new List<CompletedSeasonLeaderboardResponse>();
if (season.EndBlock >= blockIndex)
{
return BadRequest("The requested block index corresponds to an ongoing season.");
}

foreach (var season in completedSeasons)
{
var leaderboardData = await _leaderboardRepo.GetLeaderboardAsync(season.Id);

var leaderboardResponse = new CompletedSeasonLeaderboardResponse
var response = new CompletedSeasonLeaderboardResponse
{
Season = new SimpleSeasonResponse
{
Expand All @@ -111,22 +85,11 @@ long blockIndex
.ToList(),
};

completedSeasonLeaderboards.Add(leaderboardResponse);
return Ok(response);
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}

return Ok(
new CompletedArenaLeaderboardResponse
{
CurrentSeason = new SimpleSeasonResponse
{
Id = currentSeason.Id,
SeasonGroupId = currentSeason.SeasonGroupId,
StartBlock = currentSeason.StartBlock,
EndBlock = currentSeason.EndBlock,
ArenaType = currentSeason.ArenaType,
},
CompletedSeasons = completedSeasonLeaderboards,
}
);
}
}
Loading