Ports and failing tests for the ACL half of S-19b-2, ahead of the implementation. Once the projection is sourced from Objecten (ADR-0028's stated direction), a submitted registration has to exist in the register the moment the zaak is opened — otherwise re-sourcing silently drops every INGEDIEND row, since today only approval writes a record. So `OpenZaakAsync` gains a second write, and approval upserts that same record to INGESCHREVEN. The subscriber gets only an object URL on an `objecten` notification (the payload carries no record data) and may not read Objecten itself (§8.1), so `IRegisterRecordGateway` gains a read and `AclService` exposes it. Red: - AclService does not yet write on open → the record assertion fails on an empty list. - ObjectenGateway.GetAsync is a shell throwing NotImplementedException; its tests pin the contract: fetch the object URL directly (no objecttype resolution, no search), the CRS header a geo API requires, static Token auth, and a 404 read as "nothing to project" rather than an error (§8.6).
73 lines
3.4 KiB
C#
73 lines
3.4 KiB
C#
using Acl.Application;
|
|
|
|
namespace Acceptance.Support;
|
|
|
|
/// <summary>An in-memory stand-in for the OpenZaak Zaken API. It captures the
|
|
/// fully default-filled <see cref="ZaakRequest"/> the ACL builds and returns a
|
|
/// fixed zaak URL, so the acceptance scenario can verify the use case without a
|
|
/// running OpenZaak (real-OpenZaak verification is a separate slice).</summary>
|
|
public sealed class InMemoryZaakGateway : IZaakGateway
|
|
{
|
|
public static readonly Uri CreatedZaakUrl = new("http://openzaak/zaken/api/v1/zaken/created-123");
|
|
|
|
public ZaakRequest? Captured { get; private set; }
|
|
public (Uri Zaak, Uri Zaaktype, DateOnly Datum)? Approved { get; private set; }
|
|
public (Uri Zaak, Uri Zaaktype, DateOnly Datum)? Cancelled { get; private set; }
|
|
|
|
// The URLs the catalogus resolves the configured identificatie/omschrijving to (S-27); settable so
|
|
// a scenario can pin the zaaktype the ACL should default-fill.
|
|
public Uri ResolvedZaaktypeUrl { get; set; } = new("http://openzaak/catalogi/api/v1/zaaktypen/big");
|
|
public Uri ResolvedInformatieobjecttypeUrl { get; set; } = new("http://openzaak/catalogi/api/v1/informatieobjecttypen/dip");
|
|
|
|
public Task<Uri> OpenZaakAsync(ZaakRequest request, CancellationToken ct = default)
|
|
{
|
|
Captured = request;
|
|
return Task.FromResult(CreatedZaakUrl);
|
|
}
|
|
|
|
public Task SetZaakToEindstatusAsync(Uri zaakUrl, Uri zaaktypeUrl, DateOnly datumStatusGezet, CancellationToken ct = default)
|
|
{
|
|
Approved = (zaakUrl, zaaktypeUrl, datumStatusGezet);
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
public Task SetZaakToCancellationStatusAsync(Uri zaakUrl, Uri zaaktypeUrl, DateOnly datumStatusGezet, CancellationToken ct = default)
|
|
{
|
|
Cancelled = (zaakUrl, zaaktypeUrl, datumStatusGezet);
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
public Task<string> GetZaakIdentificatieAsync(Uri zaakUrl, CancellationToken ct = default)
|
|
=> Task.FromResult("ACC-REF-1");
|
|
|
|
public Task<Uri> StoreDocumentAsync(DocumentRequest request, CancellationToken ct = default)
|
|
=> Task.FromResult(new Uri("http://openzaak/documenten/api/v1/enkelvoudiginformatieobjecten/acc-doc"));
|
|
|
|
public Task<Uri> ResolveZaaktypeUrlAsync(string identificatie, CancellationToken ct = default)
|
|
=> Task.FromResult(ResolvedZaaktypeUrl);
|
|
|
|
public Task<Uri> ResolveInformatieobjecttypeUrlAsync(string omschrijving, CancellationToken ct = default)
|
|
=> Task.FromResult(ResolvedInformatieobjecttypeUrl);
|
|
|
|
public Task<IReadOnlyList<ZaaktypeSummary>> ListZaaktypenAsync(CancellationToken ct = default)
|
|
=> Task.FromResult<IReadOnlyList<ZaaktypeSummary>>(
|
|
[new ZaaktypeSummary("BIG-REGISTRATIE", "BIG-registratie", ResolvedZaaktypeUrl)]);
|
|
}
|
|
|
|
/// <summary>An in-memory stand-in for the Objecten API (S-19a): records the register records the ACL
|
|
/// writes on approval, so a scenario can assert on them without a running Objecten.</summary>
|
|
public sealed class InMemoryRegisterRecordGateway : IRegisterRecordGateway
|
|
{
|
|
public List<RegisterRecord> Upserted { get; } = [];
|
|
|
|
public Task UpsertAsync(RegisterRecord record, CancellationToken ct = default)
|
|
{
|
|
Upserted.Add(record);
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
/// <summary>The most recently written record — scenarios never read one back by object URL.</summary>
|
|
public Task<RegisterRecord?> GetAsync(Uri objectUrl, CancellationToken ct = default)
|
|
=> Task.FromResult(Upserted.Count == 0 ? null : Upserted[^1]);
|
|
}
|