feat(domain): entidad PuntoDeVenta + SecuenciaComprobante + TipoComprobante + excepciones

This commit is contained in:
2026-04-17 12:21:45 -03:00
parent bef8977c5c
commit 43877bd4a1
8 changed files with 371 additions and 0 deletions

View File

@@ -0,0 +1,139 @@
using SIGCM2.Domain.Entities;
using SIGCM2.Domain.Enums;
namespace SIGCM2.Application.Tests.Domain;
public class PuntoDeVentaTests
{
private static PuntoDeVenta MakePdv(
int id = 1,
int medioId = 5,
short numeroAFIP = 1,
string nombre = "PdV Central",
string? descripcion = null,
bool activo = true)
=> new(id, medioId, numeroAFIP, nombre, descripcion, activo, DateTime.UtcNow, null);
// ── ForCreation ───────────────────────────────────────────────────────────
[Fact]
public void ForCreation_SetsCorrectValues()
{
var pdv = PuntoDeVenta.ForCreation(medioId: 5, numeroAFIP: 3, nombre: "PdV Sur", descripcion: null);
Assert.Equal(0, pdv.Id);
Assert.Equal(5, pdv.MedioId);
Assert.Equal(3, pdv.NumeroAFIP);
Assert.Equal("PdV Sur", pdv.Nombre);
Assert.Null(pdv.Descripcion);
Assert.True(pdv.Activo);
}
[Fact]
public void ForCreation_WithDescripcion_SetsDescripcion()
{
var pdv = PuntoDeVenta.ForCreation(5, 1, "PdV Norte", "Descripcion larga");
Assert.Equal("Descripcion larga", pdv.Descripcion);
}
// ── WithUpdatedProfile ────────────────────────────────────────────────────
[Fact]
public void WithUpdatedProfile_ReturnsNewInstanceWithUpdatedFields()
{
var original = MakePdv(id: 10, nombre: "Original");
var updated = original.WithUpdatedProfile(nombre: "Actualizado", numeroAFIP: 7, descripcion: "Desc");
Assert.NotSame(original, updated);
Assert.Equal("Actualizado", updated.Nombre);
Assert.Equal(7, updated.NumeroAFIP);
Assert.Equal("Desc", updated.Descripcion);
}
[Fact]
public void WithUpdatedProfile_ImmutableFields_Preserved()
{
var original = MakePdv(id: 10, medioId: 5);
var updated = original.WithUpdatedProfile("Nuevo", 2, null);
Assert.Equal(10, updated.Id);
Assert.Equal(5, updated.MedioId);
Assert.Equal(original.Activo, updated.Activo);
Assert.Equal(original.FechaCreacion, updated.FechaCreacion);
}
[Fact]
public void WithUpdatedProfile_SetsFechaModificacion()
{
var original = MakePdv();
var updated = original.WithUpdatedProfile("Nuevo", 2, null);
Assert.NotNull(updated.FechaModificacion);
}
// ── WithActivo ────────────────────────────────────────────────────────────
[Fact]
public void WithActivo_False_ReturnsDomainObjectWithActivoFalse()
{
var pdv = MakePdv(activo: true);
var deactivated = pdv.WithActivo(false);
Assert.False(deactivated.Activo);
Assert.NotSame(pdv, deactivated);
}
[Fact]
public void WithActivo_True_ReturnsDomainObjectWithActivoTrue()
{
var pdv = MakePdv(activo: false);
var reactivated = pdv.WithActivo(true);
Assert.True(reactivated.Activo);
}
[Fact]
public void WithActivo_ImmutableFields_Preserved()
{
var pdv = MakePdv(id: 99, medioId: 3);
var toggled = pdv.WithActivo(false);
Assert.Equal(99, toggled.Id);
Assert.Equal(3, toggled.MedioId);
Assert.Equal(pdv.NumeroAFIP, toggled.NumeroAFIP);
Assert.Equal(pdv.Nombre, toggled.Nombre);
}
// ── Constructor sets all properties ───────────────────────────────────────
[Fact]
public void Constructor_SetsAllProperties()
{
var now = DateTime.UtcNow;
var pdv = new PuntoDeVenta(
id: 7,
medioId: 3,
numeroAFIP: 4,
nombre: "PdV Test",
descripcion: "Desc Test",
activo: true,
fechaCreacion: now,
fechaModificacion: null);
Assert.Equal(7, pdv.Id);
Assert.Equal(3, pdv.MedioId);
Assert.Equal(4, pdv.NumeroAFIP);
Assert.Equal("PdV Test", pdv.Nombre);
Assert.Equal("Desc Test", pdv.Descripcion);
Assert.True(pdv.Activo);
Assert.Equal(now, pdv.FechaCreacion);
Assert.Null(pdv.FechaModificacion);
}
}

View File

@@ -0,0 +1,57 @@
using SIGCM2.Domain.Entities;
using SIGCM2.Domain.Enums;
namespace SIGCM2.Application.Tests.Domain;
public class SecuenciaComprobanteTests
{
private static SecuenciaComprobante Make(
int puntoDeVentaId = 1,
TipoComprobante tipo = TipoComprobante.FacturaA,
int ultimoNumero = 0)
=> new(puntoDeVentaId, tipo, ultimoNumero, DateTime.UtcNow, null);
[Fact]
public void Constructor_SetsAllProperties()
{
var now = DateTime.UtcNow;
var seq = new SecuenciaComprobante(
puntoDeVentaId: 3,
tipoComprobante: TipoComprobante.FacturaB,
ultimoNumero: 42,
fechaCreacion: now,
fechaModificacion: null);
Assert.Equal(3, seq.PuntoDeVentaId);
Assert.Equal(TipoComprobante.FacturaB, seq.TipoComprobante);
Assert.Equal(42, seq.UltimoNumero);
Assert.Equal(now, seq.FechaCreacion);
Assert.Null(seq.FechaModificacion);
}
[Fact]
public void ProximoNumero_WhenUltimoNumeroZero_ReturnsOne()
{
var seq = Make(ultimoNumero: 0);
Assert.Equal(1, seq.ProximoNumero);
}
[Fact]
public void ProximoNumero_WhenUltimoNumeroN_ReturnsNPlusOne()
{
var seq = Make(ultimoNumero: 7);
Assert.Equal(8, seq.ProximoNumero);
}
[Fact]
public void AllTipoComprobanteValues_CanBeUsedInConstructor()
{
foreach (TipoComprobante tipo in Enum.GetValues<TipoComprobante>())
{
var seq = Make(tipo: tipo);
Assert.Equal(tipo, seq.TipoComprobante);
}
}
}