test(acceptance): beoordeling scenario — goedkeuren via ACL, afwijzen (refs #13)

BDD scenarios (Gherkin/Reqnroll) driving S-12's decide flow: a behandelaar takes an
INGEDIEND registration into behandeling and decides it goedkeuren (→ INGESCHREVEN,
zaak status via the ACL) or afwijzen (→ AFGEWEZEN, no ACL). Feature-scoped bindings
avoid clashing with the identically-phrased status step in RegistratieIndienen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-14 17:24:46 +02:00
parent d700659957
commit ddebfd371a
2 changed files with 82 additions and 0 deletions

View File

@@ -0,0 +1,24 @@
# language: en
# Drives S-12 (#13). A behandelaar picks up a submitted registration for beoordeling and decides it:
# goedkeuren enters it in the register (INGESCHREVEN, the zaak's final status set via the ACL, §8.1),
# afwijzen turns it down (AFGEWEZEN). This scenario exercises the use cases against in-memory
# stand-ins for the ACL and the store; real Flowable user-task claim/complete arrives in a later
# sub-slice and is verified live.
Feature: Een registratie beoordelen
Als behandelaar wil ik een ingediende registratie beoordelen
zodat deze wordt ingeschreven of afgewezen.
Scenario: Goedkeuren schrijft de registratie in via de ACL
Given a submitted registration with an opened zaak
When the behandelaar takes it into behandeling
Then the registration has status "INBEHANDELING"
When the behandelaar decides "goedkeuren"
Then the registration has status "INGESCHREVEN"
And the zaak's final status is set via the ACL
Scenario: Afwijzen wijst de registratie af zonder de ACL
Given a submitted registration with an opened zaak
When the behandelaar takes it into behandeling
And the behandelaar decides "afwijzen"
Then the registration has status "AFGEWEZEN"
And the ACL is not asked to set the zaak status

View File

@@ -0,0 +1,58 @@
using Acceptance.Support;
using Big.Application;
using Big.Domain;
using Reqnroll;
using Xunit;
namespace Acceptance.Steps;
/// <summary>Bindings for <c>EenRegistratieBeoordelen.feature</c> (S-12). Drives the TakeIntoBehandeling
/// transition and the BeoordeelRegistratie 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 (but differently-asserting) step in <see cref="RegistratieIndienenSteps"/>.</summary>
[Binding]
[Scope(Feature = "Een registratie beoordelen")]
public sealed class EenRegistratieBeoordelenSteps
{
private readonly InMemoryAclClient _acl = new();
private readonly InMemoryRegistrationStore _store = new();
private RegistrationId _id;
[Given("a submitted registration with an opened zaak")]
public async Task GivenASubmittedRegistrationWithAnOpenedZaak()
{
var registration = Registration.Submit("123456782");
registration.AttachZaak(InMemoryAclClient.OpenedZaakUrl);
await _store.SaveAsync(registration);
_id = registration.Id;
}
[When("the behandelaar takes it into behandeling")]
public async Task WhenTheBehandelaarTakesItIntoBehandeling()
{
var registration = await _store.GetAsync(_id);
registration!.TakeIntoBehandeling();
await _store.SaveAsync(registration);
}
[When("the behandelaar decides \"(.*)\"")]
public async Task WhenTheBehandelaarDecides(string besluit)
=> await new BeoordeelRegistratie(_store, _acl).HandleAsync(
new BeoordeelRegistratieCommand(_id, Enum.Parse<BeoordelingsBesluit>(besluit, ignoreCase: true)));
[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 zaak's final status is set via the ACL")]
public void ThenTheZaakFinalStatusIsSetViaTheAcl()
=> Assert.Equal(InMemoryAclClient.OpenedZaakUrl, _acl.ApprovedZaakUrl);
[Then("the ACL is not asked to set the zaak status")]
public void ThenTheAclIsNotAskedToSetTheZaakStatus()
=> Assert.Null(_acl.ApprovedZaakUrl);
}