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); +}