From e9d1e3237d3f2232cd68d803b02838b1c64dcf9f Mon Sep 17 00:00:00 2001 From: dmolinari Date: Sun, 19 Apr 2026 17:08:23 -0300 Subject: [PATCH] feat(domain): RubroConProductosActivosException + test (closes #41) Co-authored-by: fix/issue-41-rubro-deactivation-guard --- .../RubroConProductosActivosException.cs | 17 ++++++++++++ .../RubroConProductosActivosExceptionTests.cs | 27 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/api/SIGCM2.Domain/Exceptions/RubroConProductosActivosException.cs create mode 100644 tests/SIGCM2.Application.Tests/Domain/Rubros/RubroConProductosActivosExceptionTests.cs diff --git a/src/api/SIGCM2.Domain/Exceptions/RubroConProductosActivosException.cs b/src/api/SIGCM2.Domain/Exceptions/RubroConProductosActivosException.cs new file mode 100644 index 0000000..e55fb34 --- /dev/null +++ b/src/api/SIGCM2.Domain/Exceptions/RubroConProductosActivosException.cs @@ -0,0 +1,17 @@ +namespace SIGCM2.Domain.Exceptions; + +/// +/// Thrown when attempting to soft-delete a Rubro that still has active Products referencing it via RubroId. → HTTP 409 +/// +public sealed class RubroConProductosActivosException : DomainException +{ + public int RubroId { get; } + public int ProductosActivosCount { get; } + + public RubroConProductosActivosException(int rubroId, int productosActivosCount) + : base($"No se puede desactivar el rubro {rubroId}: tiene {productosActivosCount} producto(s) activo(s) referenciándolo.") + { + RubroId = rubroId; + ProductosActivosCount = productosActivosCount; + } +} diff --git a/tests/SIGCM2.Application.Tests/Domain/Rubros/RubroConProductosActivosExceptionTests.cs b/tests/SIGCM2.Application.Tests/Domain/Rubros/RubroConProductosActivosExceptionTests.cs new file mode 100644 index 0000000..b8c433a --- /dev/null +++ b/tests/SIGCM2.Application.Tests/Domain/Rubros/RubroConProductosActivosExceptionTests.cs @@ -0,0 +1,27 @@ +using FluentAssertions; +using SIGCM2.Domain.Exceptions; + +namespace SIGCM2.Application.Tests.Domain.Rubros; + +public class RubroConProductosActivosExceptionTests +{ + [Fact] + public void Constructor_SetsPropertiesAndMessage() + { + var ex = new RubroConProductosActivosException(rubroId: 7, productosActivosCount: 3); + + ex.RubroId.Should().Be(7); + ex.ProductosActivosCount.Should().Be(3); + ex.Message.Should().Contain("7"); + ex.Message.Should().Contain("3"); + ex.Message.Should().Contain("producto"); + } + + [Fact] + public void Constructor_InheritsFromDomainException() + { + var ex = new RubroConProductosActivosException(1, 2); + + ex.Should().BeAssignableTo(); + } +}