All checks were successful
## What & why Final sub-slice of **S-11 · Withdrawal (Flow 3)** — the user-facing "trek aanvraag in" action, which **closes #12**. - **self-service portal**: the submit confirmation gains a **"Trek aanvraag in"** button. It withdraws the just-submitted registration via `postSelfServiceRegistrationsIdWithdraw(reference)`; success shows an *ingetrokken* confirmation, a failure is surfaced (`role="alert"`) and the action stays available — same confirm-and-surface pattern as submit. - **acceptance**: `Een registratie intrekken` — owner withdraws → INGETROKKEN + workflow cancelled; a different bsn is reported not-found. - **e2e**: `withdrawal.spec.ts` — DigiD submit → trek aanvraag in → the portal confirms ingetrokken. - **docs**: demo-script + frontend-decisions. Together with S-11a (#88), S-11b (#89), S-11c-1 (#90), this completes the flow: citizen withdraws → domain INGETROKKEN → BPMN message event cancels the process → the case leaves the behandelaar's werkbak. Closes #12 ## Definition of Done - [x] Linked Gitea issue (#12). - [x] Failing tests committed before the implementation. - [x] Implementation makes the tests pass. - [x] Conventional Commits referencing the issue (`refs #12`). - [ ] CI green — all Gitea Actions jobs. - [x] `docker compose up` unaffected. - [x] Docs updated (demo-script + frontend-decisions). - [x] ADR — ADR-0014 (from S-11b) covers the cancellation decision; nothing new here. ## Notes for reviewers - Full local gate run before pushing: `dotnet format --verify-no-changes` clean; `make unit` green (Acceptance **11** incl. the 2 new withdrawal scenarios, Big 95, BFF 30, Acl 27, EventSubscriber 19); self-service lint/test/build green (9 tests, incl. the 2 new withdraw tests). - `withdrawal.spec.ts` waits on the *ingetrokken* confirmation (which only renders after the withdraw POST returns), so it can't cancel the request early (the 499 lesson from #87). Live-validated by verify-stack. Reviewed-on: #93
60 lines
2.6 KiB
C#
60 lines
2.6 KiB
C#
using Acceptance.Support;
|
|
using Big.Application;
|
|
using Big.Domain;
|
|
using Reqnroll;
|
|
using Xunit;
|
|
|
|
namespace Acceptance.Steps;
|
|
|
|
/// <summary>Bindings for <c>EenRegistratieIntrekken.feature</c> (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.</summary>
|
|
[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);
|
|
}
|