From 4cc2d9ac8062a3ffd3b7547eda437e05c8d52d68 Mon Sep 17 00:00:00 2001 From: Niek Otten Date: Thu, 16 Jul 2026 14:28:19 +0200 Subject: [PATCH] test(acceptance): a zorgprofessional withdraws their own registration (INGETROKKEN) (refs #12) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner withdraws → INGETROKKEN + process cancelled; a different bsn is reported not-found. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../Features/EenRegistratieIntrekken.feature | 22 +++++++ .../Steps/EenRegistratieIntrekkenSteps.cs | 59 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 tests/acceptance/Features/EenRegistratieIntrekken.feature create mode 100644 tests/acceptance/Steps/EenRegistratieIntrekkenSteps.cs diff --git a/tests/acceptance/Features/EenRegistratieIntrekken.feature b/tests/acceptance/Features/EenRegistratieIntrekken.feature new file mode 100644 index 0000000..4322007 --- /dev/null +++ b/tests/acceptance/Features/EenRegistratieIntrekken.feature @@ -0,0 +1,22 @@ +# language: en +# Drives S-11 (#12). A zorgprofessional withdraws their own submitted registration ("trek aanvraag +# in"): it advances to INGETROKKEN and its running workflow is cancelled (ADR-0014). Only the owner +# may withdraw — another bsn is told not-found. Exercised against in-memory stand-ins for the store +# and the Workflow Client; the live Flowable message correlation is verified by the domain check. +Feature: Een registratie intrekken + Als zorgprofessional wil ik mijn ingediende registratie kunnen intrekken + zodat een aanvraag die ik niet meer wil niet in behandeling blijft. + + Scenario: De zorgprofessional trekt zijn eigen registratie in + Given a submitted registration with a running process + When the zorgprofessional withdraws it + Then the withdrawal succeeds + And the registration has status "INGETROKKEN" + And the running process is cancelled + + Scenario: Een andere zorgprofessional kan de registratie niet intrekken + Given a submitted registration with a running process + When a different zorgprofessional tries to withdraw it + Then the withdrawal is reported not found + And the registration has status "INGEDIEND" + And the running process is not cancelled diff --git a/tests/acceptance/Steps/EenRegistratieIntrekkenSteps.cs b/tests/acceptance/Steps/EenRegistratieIntrekkenSteps.cs new file mode 100644 index 0000000..bbf3149 --- /dev/null +++ b/tests/acceptance/Steps/EenRegistratieIntrekkenSteps.cs @@ -0,0 +1,59 @@ +using Acceptance.Support; +using Big.Application; +using Big.Domain; +using Reqnroll; +using Xunit; + +namespace Acceptance.Steps; + +/// Bindings for EenRegistratieIntrekken.feature (S-11). Submits a registration (which +/// records its process) and then applies the WithdrawRegistration use case against in-memory ports; +/// one instance per scenario. Scoped to this feature so its "the registration has status" step does +/// not clash with the identically phrased steps in the other features. +[Binding] +[Scope(Feature = "Een registratie intrekken")] +public sealed class EenRegistratieIntrekkenSteps +{ + private const string OwnerBsn = "123456782"; + + private readonly InMemoryRegistrationStore _store = new(); + private readonly InMemoryWorkflowClient _workflow = new(); + private RegistrationId _id; + private WithdrawOutcome _outcome; + + [Given("a submitted registration with a running process")] + public async Task GivenASubmittedRegistrationWithARunningProcess() + => _id = await new SubmitRegistration(_store, _workflow).HandleAsync(new SubmitRegistrationCommand(OwnerBsn)); + + [When("the zorgprofessional withdraws it")] + public async Task WhenTheZorgprofessionalWithdrawsIt() + => _outcome = await new WithdrawRegistration(_store, _workflow).HandleAsync( + new WithdrawRegistrationCommand(_id, OwnerBsn)); + + [When("a different zorgprofessional tries to withdraw it")] + public async Task WhenADifferentZorgprofessionalTriesToWithdrawIt() + => _outcome = await new WithdrawRegistration(_store, _workflow).HandleAsync( + new WithdrawRegistrationCommand(_id, "999999990")); + + [Then("the withdrawal succeeds")] + public void ThenTheWithdrawalSucceeds() => Assert.Equal(WithdrawOutcome.Withdrawn, _outcome); + + [Then("the withdrawal is reported not found")] + public void ThenTheWithdrawalIsReportedNotFound() => Assert.Equal(WithdrawOutcome.NotFound, _outcome); + + [Then("the registration has status \"(.*)\"")] + public async Task ThenTheRegistrationHasStatus(string expected) + { + var registration = await _store.GetAsync(_id); + Assert.NotNull(registration); + Assert.Equal(expected, registration.Status.ToString().ToUpperInvariant()); + } + + [Then("the running process is cancelled")] + public void ThenTheRunningProcessIsCancelled() + => Assert.Equal(InMemoryWorkflowClient.StartedProcessInstanceId, _workflow.WithdrawnProcessInstanceId); + + [Then("the running process is not cancelled")] + public void ThenTheRunningProcessIsNotCancelled() + => Assert.Null(_workflow.WithdrawnProcessInstanceId); +}