Files
pos-system/services/membership-service-net/tests/MembershipService.FunctionalTests/Controllers/LevelsControllerTests.cs

159 lines
4.8 KiB
C#

using System.Net;
using System.Net.Http.Json;
using FluentAssertions;
using MembershipService.API.Application.Queries;
using Xunit;
namespace MembershipService.FunctionalTests.Controllers;
/// <summary>
/// EN: Functional tests for LevelsController.
/// VI: Functional tests cho LevelsController.
/// </summary>
public class LevelsControllerTests : IClassFixture<CustomWebApplicationFactory>
{
private readonly CustomWebApplicationFactory _factory;
public LevelsControllerTests(CustomWebApplicationFactory factory)
{
_factory = factory;
}
[Fact]
public async Task GetLevels_PublicEndpoint_ShouldReturnOkWithoutAuth()
{
// Arrange
var client = _factory.CreateClient();
// Act
var response = await client.GetAsync("/api/v1/levels");
// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
}
[Fact]
public async Task GetLevels_WithSeededData_ShouldReturnLevelsList()
{
// Arrange
await _factory.SeedLevelDefinitionsAsync();
var client = _factory.CreateClient();
// Act
var response = await client.GetAsync("/api/v1/levels");
var levels = await response.Content.ReadFromJsonAsync<List<LevelDefinitionDto>>();
// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
levels.Should().NotBeNull();
levels!.Should().HaveCountGreaterOrEqualTo(5);
}
[Fact]
public async Task GetLevels_ShouldReturnOrderedByLevelNumber()
{
// Arrange
await _factory.SeedLevelDefinitionsAsync();
var client = _factory.CreateClient();
// Act
var response = await client.GetAsync("/api/v1/levels");
var levels = await response.Content.ReadFromJsonAsync<List<LevelDefinitionDto>>();
// Assert
levels.Should().NotBeNull();
levels!.Should().BeInAscendingOrder(l => l.LevelNumber);
}
[Fact]
public async Task GetLevels_ShouldReturnCorrectLevelData()
{
// Arrange
await _factory.SeedLevelDefinitionsAsync();
var client = _factory.CreateClient();
// Act
var response = await client.GetAsync("/api/v1/levels");
var levels = await response.Content.ReadFromJsonAsync<List<LevelDefinitionDto>>();
// Assert
levels.Should().NotBeNull();
var bronze = levels!.FirstOrDefault(l => l.LevelNumber == 1);
bronze.Should().NotBeNull();
bronze!.Name.Should().Be("Bronze");
bronze.RequiredExp.Should().Be(0);
bronze.BadgeColor.Should().Be("#CD7F32");
var diamond = levels.FirstOrDefault(l => l.LevelNumber == 5);
diamond.Should().NotBeNull();
diamond!.Name.Should().Be("Diamond");
diamond.RequiredExp.Should().Be(1000);
diamond.BadgeColor.Should().Be("#B9F2FF");
}
[Fact]
public async Task GetLevels_IncludeInactiveFalse_ShouldOnlyReturnActive()
{
// Arrange
await _factory.SeedLevelDefinitionsAsync();
var client = _factory.CreateClient();
// Act
var response = await client.GetAsync("/api/v1/levels?includeInactive=false");
var levels = await response.Content.ReadFromJsonAsync<List<LevelDefinitionDto>>();
// Assert
levels.Should().NotBeNull();
levels!.Should().AllSatisfy(l => l.IsActive.Should().BeTrue());
}
[Fact]
public async Task GetLevels_ShouldReturnExpectedExpThresholds()
{
// Arrange
await _factory.SeedLevelDefinitionsAsync();
var client = _factory.CreateClient();
// Act
var response = await client.GetAsync("/api/v1/levels");
var levels = await response.Content.ReadFromJsonAsync<List<LevelDefinitionDto>>();
// Assert
levels.Should().NotBeNull();
var expectedThresholds = new Dictionary<int, int>
{
{ 1, 0 }, // Bronze
{ 2, 100 }, // Silver
{ 3, 300 }, // Gold
{ 4, 600 }, // Platinum
{ 5, 1000 } // Diamond
};
foreach (var expected in expectedThresholds)
{
var level = levels.FirstOrDefault(l => l.LevelNumber == expected.Key);
level.Should().NotBeNull();
level!.RequiredExp.Should().Be(expected.Value);
}
}
[Fact]
public async Task GetLevels_EachLevelShouldHaveUniqueId()
{
// Arrange
await _factory.SeedLevelDefinitionsAsync();
var client = _factory.CreateClient();
// Act
var response = await client.GetAsync("/api/v1/levels");
var levels = await response.Content.ReadFromJsonAsync<List<LevelDefinitionDto>>();
// Assert
levels.Should().NotBeNull();
var ids = levels!.Select(l => l.Id).ToList();
ids.Should().OnlyHaveUniqueItems();
}
}