- GeradoresService: cada tipo passa a ser um IGenerator (NIF, NIPC, NISS, CC, passaporte, IBAN, NIB, cartões, referência MB, pessoa, telefone, código postal, email, matrícula, EAN, UUID) registado em GeneratorRegistry; remove DAL/EF - GeradoresWS: minimal APIs em /api/v1 com OpenAPI + Scalar e health check - UnitTest: testes de ida e volta, valores conhecidos, detecção e API - geradoresfe: UI construída a partir dos metadados da API, validador livre, exportação CSV/JSON/TXT, nginx com API_UPSTREAM configurável - Docker, docker-compose e Jenkinsfile actualizados Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
169 lines
5.6 KiB
C#
169 lines
5.6 KiB
C#
using GeradoresService;
|
|
|
|
namespace UnitTest;
|
|
|
|
/// <summary>Valores conhecidos (exemplos oficiais / números de teste públicos).</summary>
|
|
public class KnownValuesTests
|
|
{
|
|
private static readonly GeneratorRegistry Registry = new();
|
|
|
|
private static void AssertValid(string id, string value) =>
|
|
Assert.True(Registry.Find(id)!.Validate(value).IsValid, $"{id}: '{value}' devia ser válido.");
|
|
|
|
private static void AssertInvalid(string id, string value) =>
|
|
Assert.False(Registry.Find(id)!.Validate(value).IsValid, $"{id}: '{value}' devia ser inválido.");
|
|
|
|
[Theory]
|
|
[InlineData("123456789")]
|
|
[InlineData("PT 123 456 789")]
|
|
[InlineData("100000010")] // resto 0 → dígito 0 (falhava na versão antiga)
|
|
[InlineData("500000000")] // resto 1 → dígito 0
|
|
[InlineData("451234561")] // prefixo 45
|
|
public void Nif_valid(string nif) => AssertValid("nif", nif);
|
|
|
|
[Theory]
|
|
[InlineData("123456780")]
|
|
[InlineData("100000011")]
|
|
[InlineData("12345678")]
|
|
[InlineData("412345678")] // prefixo 4 só é válido como 45
|
|
[InlineData("abcdefghi")]
|
|
public void Nif_invalid(string nif) => AssertInvalid("nif", nif);
|
|
|
|
[Fact]
|
|
public void Nipc_rejects_individual_nif()
|
|
{
|
|
AssertValid("nipc", "500000000");
|
|
AssertInvalid("nipc", "123456789");
|
|
}
|
|
|
|
[Fact]
|
|
public void Nif_reports_expected_check_digit()
|
|
{
|
|
var result = Registry.Find("nif")!.Validate("123456780");
|
|
Assert.True(result.FormatMatch);
|
|
Assert.Contains("esperado 9", result.Message);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("12345678902")]
|
|
[InlineData("20000000001")]
|
|
public void Niss_valid(string niss) => AssertValid("niss", niss);
|
|
|
|
[Theory]
|
|
[InlineData("12345678903")]
|
|
[InlineData("32345678902")]
|
|
[InlineData("1234567890")]
|
|
public void Niss_invalid(string niss) => AssertInvalid("niss", niss);
|
|
|
|
[Theory]
|
|
[InlineData("00000000 0 ZZ4")] // exemplo da especificação da AMA
|
|
[InlineData("000000000zz4")]
|
|
public void Cc_valid(string cc) => AssertValid("cc", cc);
|
|
|
|
[Theory]
|
|
[InlineData("00000000 0 ZZ5")]
|
|
[InlineData("00000000 0 ZZ")]
|
|
public void Cc_invalid(string cc) => AssertInvalid("cc", cc);
|
|
|
|
[Theory]
|
|
[InlineData("PT50000201231234567890154")] // exemplo do Banco de Portugal
|
|
[InlineData("PT50 0002 0123 1234 5678 9015 4")]
|
|
[InlineData("GB82 WEST 1234 5698 7654 32")]
|
|
[InlineData("DE89370400440532013000")]
|
|
public void Iban_valid(string iban) => AssertValid("iban", iban);
|
|
|
|
[Theory]
|
|
[InlineData("PT50000201231234567890155")]
|
|
[InlineData("PT51000201231234567890154")]
|
|
[InlineData("PT5000020123123456789015")]
|
|
[InlineData("GB82WEST12345698765433")]
|
|
public void Iban_invalid(string iban) => AssertInvalid("iban", iban);
|
|
|
|
[Fact]
|
|
public void Nib_valid() => AssertValid("nib", "0002 0123 12345678901 54");
|
|
|
|
[Theory]
|
|
[InlineData("4111 1111 1111 1111")]
|
|
[InlineData("5555555555554444")]
|
|
[InlineData("2223003122003222")]
|
|
[InlineData("378282246310005")]
|
|
public void Card_valid(string card) => AssertValid("cartao-credito", card);
|
|
|
|
[Theory]
|
|
[InlineData("4111111111111112")]
|
|
[InlineData("411111")]
|
|
public void Card_invalid(string card) => AssertInvalid("cartao-credito", card);
|
|
|
|
[Theory]
|
|
[InlineData("4006381333931")]
|
|
[InlineData("96385074")]
|
|
public void Ean_valid(string ean) => AssertValid("ean", ean);
|
|
|
|
[Fact]
|
|
public void Ean_invalid() => AssertInvalid("ean", "4006381333932");
|
|
|
|
[Theory]
|
|
[InlineData("AA-00-AA")]
|
|
[InlineData("00 AB 00")]
|
|
[InlineData("12-34-XZ")]
|
|
[InlineData("ab0012")]
|
|
public void Matricula_valid(string m) => AssertValid("matricula", m);
|
|
|
|
[Theory]
|
|
[InlineData("AK-00-AA")]
|
|
[InlineData("A1-00-AA")]
|
|
[InlineData("AA-00-AA-00")]
|
|
public void Matricula_invalid(string m) => AssertInvalid("matricula", m);
|
|
|
|
[Theory]
|
|
[InlineData("+351 912 345 678")]
|
|
[InlineData("00351213456789")]
|
|
[InlineData("800 123 456")]
|
|
public void Telefone_valid(string t) => AssertValid("telefone", t);
|
|
|
|
[Theory]
|
|
[InlineData("942 345 678")]
|
|
[InlineData("91234567")]
|
|
public void Telefone_invalid(string t) => AssertInvalid("telefone", t);
|
|
|
|
[Theory]
|
|
[InlineData("1000-001")]
|
|
[InlineData("4000 123")]
|
|
public void CodigoPostal_valid(string cp) => AssertValid("codigo-postal", cp);
|
|
|
|
[Theory]
|
|
[InlineData("0100-001")]
|
|
[InlineData("1000-01")]
|
|
public void CodigoPostal_invalid(string cp) => AssertInvalid("codigo-postal", cp);
|
|
|
|
[Theory]
|
|
[InlineData("joao.silva@example.com")]
|
|
public void Email_valid(string e) => AssertValid("email", e);
|
|
|
|
[Theory]
|
|
[InlineData("joao.silva")]
|
|
[InlineData("joao@silva")]
|
|
[InlineData("jo ao@example.com")]
|
|
public void Email_invalid(string e) => AssertInvalid("email", e);
|
|
|
|
[Fact]
|
|
public void Multibanco_roundtrip_detects_tampering()
|
|
{
|
|
var mb = Registry.Find("multibanco")!;
|
|
var value = mb.Generate(new GeradoresService.Core.GeneratorContext(new Random(1), new Dictionary<string, string?>())).Value;
|
|
Assert.True(mb.Validate(value).IsValid);
|
|
|
|
var parts = value.Split(' ');
|
|
var amount = decimal.Parse(parts[^1], System.Globalization.CultureInfo.InvariantCulture) + 1;
|
|
var tampered = string.Join(' ', parts[..^1]) + " " + amount.ToString("0.00", System.Globalization.CultureInfo.InvariantCulture);
|
|
Assert.False(mb.Validate(tampered).IsValid);
|
|
}
|
|
|
|
[Fact]
|
|
public void Uuid_versions()
|
|
{
|
|
Assert.Contains("versão 4", Registry.Find("uuid")!.Validate("f47ac10b-58cc-4372-a567-0e02b2c3d479").Message);
|
|
AssertInvalid("uuid", "not-a-uuid");
|
|
}
|
|
}
|