diff --git a/services/domain/Big.Tests/RegistrationTests.cs b/services/domain/Big.Tests/RegistrationTests.cs index 2221201..48ef524 100644 --- a/services/domain/Big.Tests/RegistrationTests.cs +++ b/services/domain/Big.Tests/RegistrationTests.cs @@ -217,4 +217,72 @@ public class RegistrationTests Assert.Contains("Afgewezen", rejectEx.Message); Assert.Equal(RegistrationStatus.Afgewezen, registration.Status); } + + [Fact] + public void Withdrawing_an_ingediend_registration_sets_it_ingetrokken() + { + var registration = Registration.Submit("123456782"); + + registration.Withdraw(); + + Assert.Equal(RegistrationStatus.Ingetrokken, registration.Status); + } + + [Fact] + public void Withdrawing_an_in_behandeling_registration_sets_it_ingetrokken() + { + // A citizen can still pull a registration back while a behandelaar has it in behandeling. + var registration = Registration.Submit("123456782"); + registration.TakeIntoBehandeling(); + + registration.Withdraw(); + + Assert.Equal(RegistrationStatus.Ingetrokken, registration.Status); + } + + [Fact] + public void Withdrawing_needs_no_zaak() + { + // Withdrawal is the citizen's own action and does not depend on the zaak having been opened. + var registration = Registration.Submit("123456782"); + + registration.Withdraw(); + + Assert.Equal(RegistrationStatus.Ingetrokken, registration.Status); + Assert.Null(registration.ZaakUrl); + } + + [Fact] + public void Re_withdrawing_an_already_ingetrokken_registration_is_idempotent() + { + var registration = Registration.Submit("123456782"); + registration.Withdraw(); + + registration.Withdraw(); + + Assert.Equal(RegistrationStatus.Ingetrokken, registration.Status); + } + + [Fact] + public void Withdrawing_an_approved_registration_is_rejected() + { + var registration = Registration.Submit("123456782"); + registration.AttachZaak(new Uri("http://openzaak/zaken/api/v1/zaken/abc")); + registration.Approve(); + + var ex = Assert.Throws(() => registration.Withdraw()); + Assert.Contains("only an INGEDIEND", ex.Message); + Assert.Equal(RegistrationStatus.Ingeschreven, registration.Status); + } + + [Fact] + public void Withdrawing_a_rejected_registration_is_rejected() + { + var registration = Registration.Submit("123456782"); + registration.Reject(); + + var ex = Assert.Throws(() => registration.Withdraw()); + Assert.Contains("only an INGEDIEND", ex.Message); + Assert.Equal(RegistrationStatus.Afgewezen, registration.Status); + } } diff --git a/services/domain/Big.Tests/WithdrawRegistrationTests.cs b/services/domain/Big.Tests/WithdrawRegistrationTests.cs new file mode 100644 index 0000000..0506db0 --- /dev/null +++ b/services/domain/Big.Tests/WithdrawRegistrationTests.cs @@ -0,0 +1,60 @@ +using Big.Application; +using Big.Domain; + +namespace Big.Tests; + +public class WithdrawRegistrationTests +{ + [Fact] + public async Task Withdrawing_marks_the_registration_ingetrokken_and_persists_it() + { + var store = new FakeRegistrationStore(); + var registration = Registration.Submit("123456782"); + store.Seed(registration); + var handler = new WithdrawRegistration(store); + + await handler.HandleAsync(new WithdrawRegistrationCommand(registration.Id)); + + var saved = await store.GetAsync(registration.Id); + Assert.Equal(RegistrationStatus.Ingetrokken, saved!.Status); + Assert.Equal(1, store.SaveCount); + } + + [Fact] + public async Task Rejects_a_null_command_without_touching_the_store() + { + var store = new FakeRegistrationStore(); + var handler = new WithdrawRegistration(store); + + await Assert.ThrowsAsync(() => handler.HandleAsync(null!)); + Assert.Equal(0, store.SaveCount); + } + + [Fact] + public async Task Withdrawing_an_unknown_registration_throws() + { + var store = new FakeRegistrationStore(); + var handler = new WithdrawRegistration(store); + + var ex = await Assert.ThrowsAsync( + () => handler.HandleAsync(new WithdrawRegistrationCommand(RegistrationId.New()))); + Assert.Contains("No registration", ex.Message); + Assert.Equal(0, store.SaveCount); + } + + [Fact] + public async Task Re_withdrawing_an_already_ingetrokken_registration_is_idempotent() + { + var store = new FakeRegistrationStore(); + var registration = Registration.Submit("123456782"); + store.Seed(registration); + var handler = new WithdrawRegistration(store); + + await handler.HandleAsync(new WithdrawRegistrationCommand(registration.Id)); + await handler.HandleAsync(new WithdrawRegistrationCommand(registration.Id)); + + // The second withdrawal is a no-op: the aggregate is not persisted again. + Assert.Equal(1, store.SaveCount); + Assert.Equal(RegistrationStatus.Ingetrokken, (await store.GetAsync(registration.Id))!.Status); + } +}