using System.Net; using System.Net.Http.Json; using System.Text.Json; using Microsoft.AspNetCore.Mvc.Testing; namespace UnitTest; public class ApiTests(WebApplicationFactory factory) : IClassFixture> { private readonly HttpClient _client = factory.CreateClient(); [Fact] public async Task Lists_generators() { var json = await _client.GetFromJsonAsync("/api/v1/generators"); Assert.Contains(json.EnumerateArray(), g => g.GetProperty("id").GetString() == "nif"); } [Fact] public async Task Generates_batch_with_options() { var json = await _client.GetFromJsonAsync("/api/v1/generators/nif/generate?count=25&tipo=5&seed=1"); var items = json.GetProperty("items").EnumerateArray().ToList(); Assert.Equal(25, items.Count); Assert.All(items, i => Assert.StartsWith("5", i.GetProperty("value").GetString())); } [Theory] [InlineData("/api/v1/generators/nif/generate?count=0")] [InlineData("/api/v1/generators/nif/generate?count=5000")] [InlineData("/api/v1/generators/nif/generate?tipo=xpto")] [InlineData("/api/v1/generators/nif/generate?desconhecida=1")] public async Task Bad_requests(string url) { var response = await _client.GetAsync(url); Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); } [Fact] public async Task Unknown_generator_is_404() { var response = await _client.GetAsync("/api/v1/generators/xpto/generate"); Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } [Fact] public async Task Validates_value() { var json = await _client.GetFromJsonAsync("/api/v1/generators/nif/validate?value=123456789"); Assert.True(json.GetProperty("isValid").GetBoolean()); } [Fact] public async Task Detects_value() { var json = await _client.GetFromJsonAsync("/api/v1/validate?value=" + Uri.EscapeDataString("PT50 0002 0123 1234 5678 9015 4")); Assert.Equal("iban", json.GetProperty("matches")[0].GetProperty("generatorId").GetString()); } [Fact] public async Task OpenApi_and_health_are_exposed() { Assert.Equal(HttpStatusCode.OK, (await _client.GetAsync("/openapi/v1.json")).StatusCode); Assert.Equal(HttpStatusCode.OK, (await _client.GetAsync("/health")).StatusCode); } }