90 lines
2.7 KiB
C#
90 lines
2.7 KiB
C#
using System.Net;
|
|
using System.Net.Http.Json;
|
|
using Microsoft.AspNetCore.Mvc.Testing;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
|
using RpgRoller.Contracts;
|
|
using RpgRoller.Services;
|
|
|
|
namespace RpgRoller.Tests;
|
|
|
|
public sealed class UnitTest1 : IClassFixture<WebApplicationFactory<Program>>
|
|
{
|
|
private readonly HttpClient m_Client;
|
|
|
|
public UnitTest1(WebApplicationFactory<Program> factory)
|
|
{
|
|
m_Client = factory.WithWebHostBuilder(builder =>
|
|
builder.ConfigureServices(services =>
|
|
{
|
|
services.RemoveAll<IDiceRoller>();
|
|
services.AddSingleton<IDiceRoller>(new FixedDiceRoller(7));
|
|
})).CreateClient();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetHealth_ReturnsOkPayload()
|
|
{
|
|
var response = await m_Client.GetAsync("/api/health");
|
|
var payload = await response.Content.ReadFromJsonAsync<HealthResponse>();
|
|
|
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
|
Assert.NotNull(payload);
|
|
Assert.Equal("ok", payload.Status);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(1, "Dice must have at least 2 sides.")]
|
|
[InlineData(1001, "Dice must have at most 1000 sides.")]
|
|
public async Task Roll_WithInvalidSides_ReturnsBadRequest(int sides, string expectedError)
|
|
{
|
|
var response = await m_Client.GetAsync($"/api/roll/{sides}");
|
|
var payload = await response.Content.ReadFromJsonAsync<ApiError>();
|
|
|
|
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
|
|
Assert.NotNull(payload);
|
|
Assert.Equal(expectedError, payload.Error);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(2)]
|
|
[InlineData(1000)]
|
|
public async Task Roll_WithValidSides_ReturnsExpectedResult(int sides)
|
|
{
|
|
var response = await m_Client.GetAsync($"/api/roll/{sides}");
|
|
var payload = await response.Content.ReadFromJsonAsync<RollResponse>();
|
|
|
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
|
Assert.NotNull(payload);
|
|
Assert.Equal(sides, payload.Sides);
|
|
Assert.Equal(Math.Min(7, sides), payload.Value);
|
|
}
|
|
|
|
[Fact]
|
|
public void RandomDiceRoller_ProducesValueWithinRange()
|
|
{
|
|
var roller = new RandomDiceRoller();
|
|
|
|
for (var i = 0; i < 200; i += 1)
|
|
{
|
|
var value = roller.Roll(6);
|
|
Assert.InRange(value, 1, 6);
|
|
}
|
|
}
|
|
|
|
private sealed class FixedDiceRoller : IDiceRoller
|
|
{
|
|
private readonly int m_Result;
|
|
|
|
public FixedDiceRoller(int result)
|
|
{
|
|
m_Result = result;
|
|
}
|
|
|
|
public int Roll(int sides)
|
|
{
|
|
return Math.Min(m_Result, sides);
|
|
}
|
|
}
|
|
}
|