refactor: rename Application → Aanvraag across the wire (Step 1/8)
The wire said Application, the domain said Aanvraag — one aggregate with two names at every hop. Rename the backend DTOs and the /applications route to /aanvragen, regenerate the typed client, and rename the frontend adapter/store to match. Renamed: ApplicationSummaryDto/DetailDto, CreateApplicationRequest, SubmitApplicationRequest/Response → Aanvraag* equivalents; ApplicationsAdapter/Store → AanvragenAdapter/Store; applications.adapter.ts/applications.store.ts → aanvragen.*. Left untouched: the admin Case/Zaak vocabulary (/admin/cases, AdminCasesStore) — a separate read model, not part of this rename; the internal BigRegister.Domain.Applications namespace and the Applications EF table (renaming those needs a new EF migration, out of scope here). Part of the dashboard-readability refactor (see the approved plan). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -99,19 +99,19 @@ public sealed record AanvraagStatusDto(
|
||||
bool? Manual = null,
|
||||
string? Reden = null);
|
||||
|
||||
public sealed record ApplicationSummaryDto(
|
||||
public sealed record AanvraagSummaryDto(
|
||||
string Id, string Type, AanvraagStatusDto Status,
|
||||
IReadOnlyList<string> DocumentIds,
|
||||
string CreatedAt, string UpdatedAt, string? SubmittedAt,
|
||||
string? Owner = null); // populated for the admin cross-owner list (WP-36); the user's own list ignores it
|
||||
|
||||
public sealed record ApplicationDetailDto(
|
||||
public sealed record AanvraagDetailDto(
|
||||
string Id, string Type, AanvraagStatusDto Status,
|
||||
System.Text.Json.JsonElement? Draft,
|
||||
IReadOnlyList<string> DocumentIds,
|
||||
string CreatedAt, string UpdatedAt, string? SubmittedAt);
|
||||
|
||||
public sealed record CreateApplicationRequest(string Type);
|
||||
public sealed record CreateAanvraagRequest(string Type);
|
||||
|
||||
public sealed record DraftSyncRequest(
|
||||
System.Text.Json.JsonElement Draft, int StepIndex, int StepCount,
|
||||
@@ -120,12 +120,12 @@ public sealed record DraftSyncRequest(
|
||||
// Submit carries only the fields the server re-validates per wizard type.
|
||||
// AanvullendeScholing/ScholingPunten (WP-69) — intake-typed aanvragen only (gated by
|
||||
// IntakePolicy.RejectIncompleteScholing's caller), null for the others.
|
||||
public sealed record SubmitApplicationRequest(
|
||||
public sealed record AanvraagIndienenRequest(
|
||||
string? DiplomaHerkomst = null, int? Uren = null,
|
||||
IReadOnlyList<DocumentRefDto>? Documents = null,
|
||||
bool? AanvullendeScholing = null, int? ScholingPunten = null);
|
||||
|
||||
public sealed record SubmitApplicationResponse(string Referentie, AanvraagStatusDto Status);
|
||||
public sealed record AanvraagIndienenResponse(string Referentie, AanvraagStatusDto Status);
|
||||
|
||||
// --- Beoordeling (WP-65): the behandelportal's case-detail screen. ---
|
||||
|
||||
@@ -137,7 +137,7 @@ public sealed record BeoordelingDocumentDto(string DocumentId, string CategoryId
|
||||
public sealed record BeoordelingDecisionsDto(bool CanBesluiten);
|
||||
|
||||
public sealed record BeoordelingViewDto(
|
||||
ApplicationSummaryDto Aanvraag,
|
||||
AanvraagSummaryDto Aanvraag,
|
||||
IReadOnlyList<BeoordelingDocumentDto> Documenten,
|
||||
BeoordelingDecisionsDto Decisions);
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ public static class Mappers
|
||||
/// reads it past that point; see <c>AanvraagMapper.ApplyTo</c>'s Submitted branch).</summary>
|
||||
private static JsonElement? DraftOf(Aanvraag a) => a is Aanvraag.Concept c ? c.Draft : null;
|
||||
|
||||
public static ApplicationSummaryDto ToSummaryDto(this Aanvraag a, DateTimeOffset now) => new(
|
||||
public static AanvraagSummaryDto ToSummaryDto(this Aanvraag a, DateTimeOffset now) => new(
|
||||
a.Id, a.Type, a.ToStatusDto(now), a.DocumentIds,
|
||||
a.CreatedAt.ToString("o"), a.UpdatedAt.ToString("o"), SubmittedAtOf(a));
|
||||
|
||||
@@ -74,10 +74,10 @@ public static class Mappers
|
||||
/// someone who is not the subject (`/admin/cases`, `/werkvoorraad`), so it goes out masked
|
||||
/// (RB-03/BIO-003). Masking here rather than at each endpoint means a third cross-owner
|
||||
/// list cannot be added that forgets to.
|
||||
public static ApplicationSummaryDto ToAdminSummaryDto(this Aanvraag a, DateTimeOffset now) =>
|
||||
public static AanvraagSummaryDto ToAdminSummaryDto(this Aanvraag a, DateTimeOffset now) =>
|
||||
a.ToSummaryDto(now) with { Owner = Pii.MaskTail(a.Owner, 3) };
|
||||
|
||||
public static ApplicationDetailDto ToDetailDto(this Aanvraag a, DateTimeOffset now) => new(
|
||||
public static AanvraagDetailDto ToDetailDto(this Aanvraag a, DateTimeOffset now) => new(
|
||||
a.Id, a.Type, a.ToStatusDto(now), DraftOf(a), a.DocumentIds,
|
||||
a.CreatedAt.ToString("o"), a.UpdatedAt.ToString("o"), SubmittedAtOf(a));
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ public static class DocumentStore
|
||||
/// SeedData.Registration.BigNummer ("19012345601", 11 digits — the seeded doctor's BIG-nummer,
|
||||
/// a different Dutch identifier scheme). Previously this constant reused that BigNummer value
|
||||
/// as a stand-in BSN, which is invalid Dutch-BSN shape: harmless against the local store, but
|
||||
/// a real OpenZaak instance rejects it outright — GET /api/v1/applications 500s (`inpBsn` query
|
||||
/// a real OpenZaak instance rejects it outright — GET /api/v1/aanvragen 500s (`inpBsn` query
|
||||
/// filter validation) and every submit's rol-creation POST fails (`inpBsn` max_length) once
|
||||
/// Zgw:Enabled=true. Not "111222333" or "999888777" — both already mean a different fixture
|
||||
/// identity (the OpenZaak-harness/unit-test caller, and ApplicationTests' "other citizen").
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace BigRegister.Api.Data;
|
||||
/// <summary>
|
||||
/// The cases (zaken) READ seam (WP-49). A "zaak" in ZGW terms is an <see cref="Aanvraag"/>
|
||||
/// here; this interface is the one injection point that lets a real ZGW backend (OpenZaak)
|
||||
/// replace the local SQLite store <em>behind the same <see cref="ApplicationSummaryDto"/>
|
||||
/// replace the local SQLite store <em>behind the same <see cref="AanvraagSummaryDto"/>
|
||||
/// contract</em> — so the frontend never changes (BFF-lite anti-corruption, ADR-0001).
|
||||
///
|
||||
/// Default binding is <see cref="LocalZaakSource"/> (offline). Setting <c>Zgw:Enabled=true</c>
|
||||
@@ -20,7 +20,7 @@ public interface IZaakSource
|
||||
{
|
||||
/// <summary>Every case across every owner, newest-first (the admin cross-owner list,
|
||||
/// WP-36) — cases:manage only, deliberately NOT citizen-scoped.</summary>
|
||||
IReadOnlyList<ApplicationSummaryDto> ListCases(DateTimeOffset now);
|
||||
IReadOnlyList<AanvraagSummaryDto> ListCases(DateTimeOffset now);
|
||||
|
||||
/// <summary>
|
||||
/// Only <paramref name="caller"/>'s own cases (WP-53) — the citizen-scoped counterpart of
|
||||
@@ -29,7 +29,7 @@ public interface IZaakSource
|
||||
/// <c>rol__betrokkeneIdentificatie__natuurlijkPersoon__inpBsn</c> query filter so a citizen
|
||||
/// can never see another citizen's zaken.
|
||||
/// </summary>
|
||||
IReadOnlyList<ApplicationSummaryDto> ListMyCases(ZorgverlenerCaller caller, DateTimeOffset now);
|
||||
IReadOnlyList<AanvraagSummaryDto> ListMyCases(ZorgverlenerCaller caller, DateTimeOffset now);
|
||||
|
||||
/// <summary>
|
||||
/// Register a just-submitted <paramref name="aanvraag"/> as a zaak (WP-50). The aanvraag is
|
||||
|
||||
@@ -12,12 +12,12 @@ namespace BigRegister.Api.Data;
|
||||
/// </summary>
|
||||
public sealed class LocalZaakSource : IZaakSource
|
||||
{
|
||||
public IReadOnlyList<ApplicationSummaryDto> ListCases(DateTimeOffset now) =>
|
||||
public IReadOnlyList<AanvraagSummaryDto> ListCases(DateTimeOffset now) =>
|
||||
ApplicationStore.ListAll().Select(a => a.ToAdminSummaryDto(now)).ToList();
|
||||
|
||||
/// <summary>Citizen-scoped (WP-53) — exactly what <c>GET /applications</c> used to compute
|
||||
/// <summary>Citizen-scoped (WP-53) — exactly what <c>GET /aanvragen</c> used to compute
|
||||
/// inline before it was routed through this seam.</summary>
|
||||
public IReadOnlyList<ApplicationSummaryDto> ListMyCases(ZorgverlenerCaller caller, DateTimeOffset now) =>
|
||||
public IReadOnlyList<AanvraagSummaryDto> ListMyCases(ZorgverlenerCaller caller, DateTimeOffset now) =>
|
||||
ApplicationStore.List(caller.Bsn)
|
||||
.OrderByDescending(a => a.UpdatedAt)
|
||||
.Select(a => a.ToSummaryDto(now)).ToList();
|
||||
|
||||
@@ -9,7 +9,7 @@ public sealed record FeatureFlagDef(string Key, string Description, bool Default
|
||||
public static class FeatureFlags
|
||||
{
|
||||
/// Whether self-service registration (inschrijving) is open. When off, the FE hides the
|
||||
/// "Inschrijven" action and POST /applications for a `registratie` is refused (server-enforced).
|
||||
/// "Inschrijven" action and POST /aanvragen for a `registratie` is refused (server-enforced).
|
||||
public const string InschrijvingOpen = "inschrijving-open";
|
||||
|
||||
public static readonly IReadOnlyList<FeatureFlagDef> Catalog = new[]
|
||||
|
||||
@@ -6,7 +6,7 @@ namespace BigRegister.Domain.Intake;
|
||||
/// (<c>GET /intake/policy</c>) and applies it for instant UX feedback
|
||||
/// (<c>intake.machine.ts</c>'s <c>lageUren</c>); <see cref="RejectIncompleteScholing"/> is the
|
||||
/// backend re-validating it as the authority on submit (WP-69) —
|
||||
/// <c>POST /applications/{id}/submit</c> (intake-typed aanvragen only) calls it before
|
||||
/// <c>POST /aanvragen/{id}/submit</c> (intake-typed aanvragen only) calls it before
|
||||
/// writing anything, and a violation 400s (<c>ProblemDetails</c>), never silently accepts
|
||||
/// an incomplete answer.
|
||||
/// </summary>
|
||||
|
||||
@@ -342,19 +342,19 @@ api.MapDelete("/admin/uploads/{documentId}", (string documentId, HttpContext ctx
|
||||
// ApplicationStore directly — under Zgw:Enabled=true a citizen's own dashboard list comes from
|
||||
// OpenZaak (BSN-filtered) too, closing the last "reads a static store directly" gap
|
||||
// openzaak-integration.md's ACL caveat used to flag for this endpoint.
|
||||
api.MapGet("/applications", (HttpContext ctx, IZaakSource zaken) =>
|
||||
api.MapGet("/aanvragen", (HttpContext ctx, IZaakSource zaken) =>
|
||||
zaken.ListMyCases(ctx.Zorgverlener(), DateTimeOffset.UtcNow));
|
||||
|
||||
api.MapGet("/applications/{id}", (string id, HttpContext ctx) =>
|
||||
api.MapGet("/aanvragen/{id}", (string id, HttpContext ctx) =>
|
||||
ApplicationStore.Get(id, ctx.Zorgverlener().Bsn) is { } a
|
||||
? Results.Ok(a.ToDetailDto(DateTimeOffset.UtcNow))
|
||||
: Results.NotFound())
|
||||
.Produces<ApplicationDetailDto>()
|
||||
.Produces<AanvraagDetailDto>()
|
||||
.Produces(StatusCodes.Status404NotFound);
|
||||
|
||||
// --- writes ---
|
||||
|
||||
api.MapPost("/applications", (CreateApplicationRequest req, HttpContext ctx) =>
|
||||
api.MapPost("/aanvragen", (CreateAanvraagRequest req, HttpContext ctx) =>
|
||||
{
|
||||
// Feature flag (WP-47): self-service registration can be closed by an admin.
|
||||
if (req.Type == "registratie" && !FeatureFlagStore.IsEnabled(FeatureFlags.InschrijvingOpen))
|
||||
@@ -364,13 +364,13 @@ api.MapPost("/applications", (CreateApplicationRequest req, HttpContext ctx) =>
|
||||
return Results.Problem(
|
||||
detail: "U hebt al een concept van dit type. Rond dat eerst af of verwijder het.",
|
||||
statusCode: StatusCodes.Status409Conflict);
|
||||
return Results.Created($"/api/v1/applications/{a.Id}", a.ToDetailDto(DateTimeOffset.UtcNow));
|
||||
return Results.Created($"/api/v1/aanvragen/{a.Id}", a.ToDetailDto(DateTimeOffset.UtcNow));
|
||||
})
|
||||
.Produces<ApplicationDetailDto>(StatusCodes.Status201Created)
|
||||
.Produces<AanvraagDetailDto>(StatusCodes.Status201Created)
|
||||
.ProducesProblem(StatusCodes.Status409Conflict);
|
||||
|
||||
// Draft sync per step — idempotent; keep it debounced on the client (it is chatty).
|
||||
api.MapPut("/applications/{id}", (string id, DraftSyncRequest req, HttpContext ctx) =>
|
||||
api.MapPut("/aanvragen/{id}", (string id, DraftSyncRequest req, HttpContext ctx) =>
|
||||
{
|
||||
var owner = ctx.Zorgverlener().Bsn;
|
||||
// A citizen may only reference their own uploads in a draft — reject before the sync
|
||||
@@ -388,7 +388,7 @@ api.MapPut("/applications/{id}", (string id, DraftSyncRequest req, HttpContext c
|
||||
|
||||
// Cancel a Concept (cascades to its unlinked documents). Submitted aanvragen cannot
|
||||
// be withdrawn (out of scope — no "intrekken").
|
||||
api.MapDelete("/applications/{id}", (string id, HttpContext ctx) =>
|
||||
api.MapDelete("/aanvragen/{id}", (string id, HttpContext ctx) =>
|
||||
{
|
||||
var a = ApplicationStore.Get(id, ctx.Zorgverlener().Bsn);
|
||||
if (a is null) return Results.NotFound();
|
||||
@@ -403,7 +403,7 @@ api.MapDelete("/applications/{id}", (string id, HttpContext ctx) =>
|
||||
|
||||
// Submit runs the server-owned rules, sets autoApprovable, and transitions the
|
||||
// aanvraag. handmatig no longer 422s (ADR-0002): it becomes a manual (pending) case.
|
||||
api.MapPost("/applications/{id}/submit", (string id, SubmitApplicationRequest req, HttpContext ctx, IZaakSource zaken, IDocumentSource documents) =>
|
||||
api.MapPost("/aanvragen/{id}/submit", (string id, AanvraagIndienenRequest req, HttpContext ctx, IZaakSource zaken, IDocumentSource documents) =>
|
||||
{
|
||||
var existing = ApplicationStore.Get(id, ctx.Zorgverlener().Bsn);
|
||||
if (existing is null) return Results.NotFound();
|
||||
@@ -480,9 +480,9 @@ api.MapPost("/applications/{id}/submit", (string id, SubmitApplicationRequest re
|
||||
}
|
||||
}
|
||||
|
||||
return Results.Ok(new SubmitApplicationResponse(referentie, status));
|
||||
return Results.Ok(new AanvraagIndienenResponse(referentie, status));
|
||||
})
|
||||
.Produces<SubmitApplicationResponse>()
|
||||
.Produces<AanvraagIndienenResponse>()
|
||||
.ProducesProblem(StatusCodes.Status400BadRequest)
|
||||
.ProducesProblem(StatusCodes.Status409Conflict)
|
||||
.Produces(StatusCodes.Status404NotFound);
|
||||
@@ -494,7 +494,7 @@ api.MapPost("/applications/{id}/submit", (string id, SubmitApplicationRequest re
|
||||
api.MapGet("/admin/cases", (HttpContext ctx, IZaakSource zaken) => CasesAdmin(ctx, () =>
|
||||
Results.Ok(zaken.ListCases(DateTimeOffset.UtcNow))))
|
||||
.Gate("CasesAdmin")
|
||||
.Produces<List<ApplicationSummaryDto>>()
|
||||
.Produces<List<AanvraagSummaryDto>>()
|
||||
.ProducesProblem(StatusCodes.Status403Forbidden);
|
||||
|
||||
// Queryable authz/PII-reveal audit trail (WP-41) — data-minimised, no PII. Admin-gated
|
||||
@@ -510,7 +510,7 @@ api.MapGet("/admin/audit", (HttpContext ctx) => CasesAdmin(ctx, () =>
|
||||
// --- writes ---
|
||||
|
||||
// Admin delete removes ANY case (any owner, submitted or not) — unlike the user-facing
|
||||
// DELETE /applications/{id}. A missing id is a 404.
|
||||
// DELETE /aanvragen/{id}. A missing id is a 404.
|
||||
api.MapDelete("/admin/cases/{id}", (string id, HttpContext ctx) => CasesAdmin(ctx, () =>
|
||||
{
|
||||
if (!ApplicationStore.DeleteAny(id)) return Results.NotFound();
|
||||
@@ -531,14 +531,14 @@ api.MapGet("/werkvoorraad", (HttpContext ctx, IZaakSource zaken) => Beoordelen(c
|
||||
.Where(c => c.Status.Tag is "Ingediend" or "InBehandeling")
|
||||
.ToList())))
|
||||
.Gate("Beoordelen")
|
||||
.Produces<List<ApplicationSummaryDto>>()
|
||||
.Produces<List<AanvraagSummaryDto>>()
|
||||
.ProducesProblem(StatusCodes.Status403Forbidden);
|
||||
|
||||
// --- Beoordeling (WP-65): one aanvraag's case-treatment detail — read side only (recording
|
||||
// a decision is WP-65's second half). Reads through IZaakSource.ListCases (no new seam method:
|
||||
// adding one now would force an OpenZaak get-by-id + mapper, which is WP-66's surface) — O(n)
|
||||
// over a POC-sized table. A Concept isn't a case a behandelaar can treat yet, so it 404s here
|
||||
// same as an unknown id (only /applications/{id}, citizen-scoped, shows a Concept).
|
||||
// same as an unknown id (only /aanvragen/{id}, citizen-scoped, shows a Concept).
|
||||
api.MapGet("/beoordeling/{id}", (string id, HttpContext ctx, IZaakSource zaken) =>
|
||||
Beoordelen(ctx, $"aanvraag/{id}", () =>
|
||||
{
|
||||
|
||||
@@ -18,9 +18,9 @@ public sealed record ZgwPage<T>(
|
||||
/// The <see cref="IZaakSource"/> backed by a real OpenZaak / ZGW Zaken API (WP-49 read, WP-50
|
||||
/// write). Reads zaken (following pagination), maps each zaak's zaaktype URL back to the
|
||||
/// internal aanvraag-type key via <c>Zgw:ZaaktypeUrls</c> (a local lookup — NOT OpenZaak's
|
||||
/// human zaaktype label, which isn't a value <see cref="ApplicationSummaryDto.Type"/>'s
|
||||
/// human zaaktype label, which isn't a value <see cref="AanvraagSummaryDto.Type"/>'s
|
||||
/// contract accepts; see <see cref="AanvraagTypeFor"/>), and maps into
|
||||
/// <see cref="ApplicationSummaryDto"/> via <see cref="ZgwZaakMapper"/>. Creates a zaak +
|
||||
/// <see cref="AanvraagSummaryDto"/> via <see cref="ZgwZaakMapper"/>. Creates a zaak +
|
||||
/// status + rol for a just-submitted aanvraag. Selected only when <c>Zgw:Enabled=true</c>;
|
||||
/// the default stays <see cref="LocalZaakSource"/>.
|
||||
///
|
||||
@@ -36,16 +36,16 @@ public sealed class OpenZaakZaakSource(HttpClient http, ZgwTokenProvider tokens,
|
||||
// sync /admin/cases endpoint, and ASP.NET Core has no sync-context to deadlock on. Make the
|
||||
// whole cases read path async (endpoint + CasesAdmin + interface) if OpenZaak becomes the
|
||||
// default and this blocking call shows up under load.
|
||||
public IReadOnlyList<ApplicationSummaryDto> ListCases(DateTimeOffset now) =>
|
||||
public IReadOnlyList<AanvraagSummaryDto> ListCases(DateTimeOffset now) =>
|
||||
ListCasesAsync(bsn: null, caller: null).GetAwaiter().GetResult();
|
||||
|
||||
/// <summary>WP-53: same read, filtered to one citizen's own zaken via ZGW's rol filter param
|
||||
/// (see <see cref="ListCasesAsync"/>) — and minted with that citizen's identity, not the
|
||||
/// system-level one <see cref="ListCases"/> uses.</summary>
|
||||
public IReadOnlyList<ApplicationSummaryDto> ListMyCases(ZorgverlenerCaller caller, DateTimeOffset now) =>
|
||||
public IReadOnlyList<AanvraagSummaryDto> ListMyCases(ZorgverlenerCaller caller, DateTimeOffset now) =>
|
||||
ListCasesAsync(caller.Bsn, caller).GetAwaiter().GetResult();
|
||||
|
||||
private async Task<IReadOnlyList<ApplicationSummaryDto>> ListCasesAsync(string? bsn, CallerIdentity? caller)
|
||||
private async Task<IReadOnlyList<AanvraagSummaryDto>> ListCasesAsync(string? bsn, CallerIdentity? caller)
|
||||
{
|
||||
var url = $"{options.ZrcBaseUrl}/zaken";
|
||||
if (bsn is not null)
|
||||
@@ -55,7 +55,7 @@ public sealed class OpenZaakZaakSource(HttpClient http, ZgwTokenProvider tokens,
|
||||
}
|
||||
|
||||
/// <summary>Real, live-repro'd bug (behandelportal's werkvoorraad always failed to parse):
|
||||
/// <c>ApplicationSummaryDto.Type</c>'s contract is the internal aanvraag-type key (e.g.
|
||||
/// <c>AanvraagSummaryDto.Type</c>'s contract is the internal aanvraag-type key (e.g.
|
||||
/// "herregistratie" — what <see cref="LocalZaakSource"/>/<c>Mappers.ToSummaryDto</c> send,
|
||||
/// and what the FE's <c>AANVRAAG_TYPES</c> trust boundary accepts), NOT OpenZaak's human
|
||||
/// zaaktype label ("Herregistratie arts") this used to resolve via an extra Catalogi round
|
||||
|
||||
@@ -6,7 +6,7 @@ namespace BigRegister.Api.Zgw;
|
||||
|
||||
/// <summary>
|
||||
/// The subset of a ZGW Zaak (Zaken API / ZRC) the read slice needs. The full resource has
|
||||
/// dozens of fields; we bind only what maps to <see cref="ApplicationSummaryDto"/>. Note the
|
||||
/// dozens of fields; we bind only what maps to <see cref="AanvraagSummaryDto"/>. Note the
|
||||
/// two ZGW traits that force an anti-corruption layer: <see cref="Url"/> is the resource's
|
||||
/// identity (not a bare id), and <see cref="Zaaktype"/> is a URL <em>into another service</em>
|
||||
/// (Catalogi/ZTC) that must be resolved to a human label.
|
||||
@@ -20,7 +20,7 @@ public sealed record ZgwZaak(
|
||||
[property: JsonPropertyName("registratiedatum")] DateOnly? Registratiedatum);
|
||||
|
||||
/// <summary>
|
||||
/// Anti-corruption map: ZGW Zaak → the existing <see cref="ApplicationSummaryDto"/> the FE
|
||||
/// Anti-corruption map: ZGW Zaak → the existing <see cref="AanvraagSummaryDto"/> the FE
|
||||
/// already renders (WP-49). This is where "URL as identity" and the cross-service zaaktype
|
||||
/// join get flattened away, so nothing downstream (the FE) sees ZGW shapes.
|
||||
/// </summary>
|
||||
@@ -29,7 +29,7 @@ public static class ZgwZaakMapper
|
||||
/// <summary>Last path segment of a ZGW resource URL — the uuid that identifies it.</summary>
|
||||
public static string Uuid(string url) => url.TrimEnd('/').Split('/').Last();
|
||||
|
||||
public static ApplicationSummaryDto ToSummaryDto(ZgwZaak z, string zaaktypeLabel)
|
||||
public static AanvraagSummaryDto ToSummaryDto(ZgwZaak z, string zaaktypeLabel)
|
||||
{
|
||||
// ponytail: coarse status map — an open zaak (no einddatum) is In behandeling, a closed
|
||||
// one is Goedgekeurd. Real fidelity (statustype/resultaat lookups) is a later slice; the
|
||||
@@ -41,7 +41,7 @@ public static class ZgwZaakMapper
|
||||
var created = Iso(z.Registratiedatum ?? z.Startdatum);
|
||||
var updated = Iso(z.Einddatum ?? z.Registratiedatum ?? z.Startdatum);
|
||||
|
||||
return new ApplicationSummaryDto(
|
||||
return new AanvraagSummaryDto(
|
||||
Id: Uuid(z.Url),
|
||||
Type: zaaktypeLabel,
|
||||
Status: status,
|
||||
|
||||
+109
-109
@@ -425,7 +425,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"/api/v1/applications": {
|
||||
"/api/v1/aanvragen": {
|
||||
"get": {
|
||||
"tags": [
|
||||
"BigRegister.Api, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
|
||||
@@ -438,7 +438,7 @@
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/ApplicationSummaryDto"
|
||||
"$ref": "#/components/schemas/AanvraagSummaryDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -454,7 +454,7 @@
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/CreateApplicationRequest"
|
||||
"$ref": "#/components/schemas/CreateAanvraagRequest"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -466,7 +466,7 @@
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ApplicationDetailDto"
|
||||
"$ref": "#/components/schemas/AanvraagDetailDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -484,7 +484,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"/api/v1/applications/{id}": {
|
||||
"/api/v1/aanvragen/{id}": {
|
||||
"get": {
|
||||
"tags": [
|
||||
"BigRegister.Api, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
|
||||
@@ -505,7 +505,7 @@
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ApplicationDetailDto"
|
||||
"$ref": "#/components/schemas/AanvraagDetailDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -592,7 +592,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"/api/v1/applications/{id}/submit": {
|
||||
"/api/v1/aanvragen/{id}/submit": {
|
||||
"post": {
|
||||
"tags": [
|
||||
"BigRegister.Api, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
|
||||
@@ -611,7 +611,7 @@
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/SubmitApplicationRequest"
|
||||
"$ref": "#/components/schemas/AanvraagIndienenRequest"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -623,7 +623,7 @@
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/SubmitApplicationResponse"
|
||||
"$ref": "#/components/schemas/AanvraagIndienenResponse"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -667,7 +667,7 @@
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/ApplicationSummaryDto"
|
||||
"$ref": "#/components/schemas/AanvraagSummaryDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -766,7 +766,7 @@
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/ApplicationSummaryDto"
|
||||
"$ref": "#/components/schemas/AanvraagSummaryDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1484,57 +1484,7 @@
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"AanvraagStatusDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"tag": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"stepIndex": {
|
||||
"type": "integer",
|
||||
"format": "int32",
|
||||
"nullable": true
|
||||
},
|
||||
"stepCount": {
|
||||
"type": "integer",
|
||||
"format": "int32",
|
||||
"nullable": true
|
||||
},
|
||||
"referentie": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"manual": {
|
||||
"type": "boolean",
|
||||
"nullable": true
|
||||
},
|
||||
"reden": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"AdresDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"straat": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"postcode": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"woonplaats": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"ApplicationDetailDto": {
|
||||
"AanvraagDetailDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"id": {
|
||||
@@ -1573,7 +1523,83 @@
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"ApplicationSummaryDto": {
|
||||
"AanvraagIndienenRequest": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"diplomaHerkomst": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"uren": {
|
||||
"type": "integer",
|
||||
"format": "int32",
|
||||
"nullable": true
|
||||
},
|
||||
"documents": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/DocumentRefDto"
|
||||
},
|
||||
"nullable": true
|
||||
},
|
||||
"aanvullendeScholing": {
|
||||
"type": "boolean",
|
||||
"nullable": true
|
||||
},
|
||||
"scholingPunten": {
|
||||
"type": "integer",
|
||||
"format": "int32",
|
||||
"nullable": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"AanvraagIndienenResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"referentie": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"status": {
|
||||
"$ref": "#/components/schemas/AanvraagStatusDto"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"AanvraagStatusDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"tag": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"stepIndex": {
|
||||
"type": "integer",
|
||||
"format": "int32",
|
||||
"nullable": true
|
||||
},
|
||||
"stepCount": {
|
||||
"type": "integer",
|
||||
"format": "int32",
|
||||
"nullable": true
|
||||
},
|
||||
"referentie": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"manual": {
|
||||
"type": "boolean",
|
||||
"nullable": true
|
||||
},
|
||||
"reden": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"AanvraagSummaryDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"id": {
|
||||
@@ -1613,6 +1639,24 @@
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"AdresDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"straat": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"postcode": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"woonplaats": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"AuthzAuditDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -1674,7 +1718,7 @@
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"aanvraag": {
|
||||
"$ref": "#/components/schemas/ApplicationSummaryDto"
|
||||
"$ref": "#/components/schemas/AanvraagSummaryDto"
|
||||
},
|
||||
"documenten": {
|
||||
"type": "array",
|
||||
@@ -1860,7 +1904,7 @@
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"CreateApplicationRequest": {
|
||||
"CreateAanvraagRequest": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"type": {
|
||||
@@ -2678,50 +2722,6 @@
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"SubmitApplicationRequest": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"diplomaHerkomst": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"uren": {
|
||||
"type": "integer",
|
||||
"format": "int32",
|
||||
"nullable": true
|
||||
},
|
||||
"documents": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/DocumentRefDto"
|
||||
},
|
||||
"nullable": true
|
||||
},
|
||||
"aanvullendeScholing": {
|
||||
"type": "boolean",
|
||||
"nullable": true
|
||||
},
|
||||
"scholingPunten": {
|
||||
"type": "integer",
|
||||
"format": "int32",
|
||||
"nullable": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"SubmitApplicationResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"referentie": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"status": {
|
||||
"$ref": "#/components/schemas/AanvraagStatusDto"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"UploadCategoriesDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
|
||||
+35
-35
@@ -8,27 +8,27 @@ using Microsoft.AspNetCore.Mvc.Testing;
|
||||
|
||||
namespace BigRegister.Tests;
|
||||
|
||||
public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture<TestWebApplicationFactory>
|
||||
public class AanvraagTests(TestWebApplicationFactory factory) : IClassFixture<TestWebApplicationFactory>
|
||||
{
|
||||
private readonly HttpClient _client = factory.CreateClient();
|
||||
|
||||
private async Task<ApplicationDetailDto> Create(string type = "registratie")
|
||||
private async Task<AanvraagDetailDto> Create(string type = "registratie")
|
||||
{
|
||||
// WP-35: one Concept per type is now server-enforced, and these tests share one DB
|
||||
// (IClassFixture). Clear any leftover Concept so each test starts from a clean slate.
|
||||
var existing = await List();
|
||||
Assert.NotNull(existing);
|
||||
foreach (var s in existing.Where(x => x.Status.Tag == "Concept"))
|
||||
await _client.DeleteAsync($"/api/v1/applications/{s.Id}");
|
||||
var res = await _client.PostAsJsonAsync("/api/v1/applications", new { type });
|
||||
await _client.DeleteAsync($"/api/v1/aanvragen/{s.Id}");
|
||||
var res = await _client.PostAsJsonAsync("/api/v1/aanvragen", new { type });
|
||||
Assert.Equal(HttpStatusCode.Created, res.StatusCode);
|
||||
var created = await res.Content.ReadFromJsonAsync<ApplicationDetailDto>();
|
||||
var created = await res.Content.ReadFromJsonAsync<AanvraagDetailDto>();
|
||||
Assert.NotNull(created);
|
||||
return created;
|
||||
}
|
||||
|
||||
private Task<List<ApplicationSummaryDto>?> List() =>
|
||||
_client.GetFromJsonAsync<List<ApplicationSummaryDto>>("/api/v1/applications");
|
||||
private Task<List<AanvraagSummaryDto>?> List() =>
|
||||
_client.GetFromJsonAsync<List<AanvraagSummaryDto>>("/api/v1/aanvragen");
|
||||
|
||||
// --- Lifecycle over HTTP ---
|
||||
|
||||
@@ -36,7 +36,7 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
public async Task Create_then_list_shows_a_concept_with_step_progress()
|
||||
{
|
||||
var a = await Create();
|
||||
await _client.PutAsJsonAsync($"/api/v1/applications/{a.Id}",
|
||||
await _client.PutAsJsonAsync($"/api/v1/aanvragen/{a.Id}",
|
||||
new { draft = new { beroep = "arts" }, stepIndex = 1, stepCount = 4 });
|
||||
|
||||
var list = await List();
|
||||
@@ -51,10 +51,10 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
public async Task Draft_sync_is_readable_back_from_detail()
|
||||
{
|
||||
var a = await Create();
|
||||
await _client.PutAsJsonAsync($"/api/v1/applications/{a.Id}",
|
||||
await _client.PutAsJsonAsync($"/api/v1/aanvragen/{a.Id}",
|
||||
new { draft = new { beroep = "verpleegkundige" }, stepIndex = 2, stepCount = 4 });
|
||||
|
||||
var detail = await _client.GetFromJsonAsync<ApplicationDetailDto>($"/api/v1/applications/{a.Id}");
|
||||
var detail = await _client.GetFromJsonAsync<AanvraagDetailDto>($"/api/v1/aanvragen/{a.Id}");
|
||||
Assert.NotNull(detail);
|
||||
Assert.NotNull(detail.Draft);
|
||||
Assert.Equal("verpleegkundige", detail.Draft.Value.GetProperty("beroep").GetString());
|
||||
@@ -64,9 +64,9 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
public async Task Submit_duo_registratie_is_in_behandeling_and_auto()
|
||||
{
|
||||
var a = await Create("registratie");
|
||||
var res = await _client.PostAsJsonAsync($"/api/v1/applications/{a.Id}/submit", new { diplomaHerkomst = "duo" });
|
||||
var res = await _client.PostAsJsonAsync($"/api/v1/aanvragen/{a.Id}/submit", new { diplomaHerkomst = "duo" });
|
||||
res.EnsureSuccessStatusCode();
|
||||
var body = (await res.Content.ReadFromJsonAsync<SubmitApplicationResponse>())!;
|
||||
var body = (await res.Content.ReadFromJsonAsync<AanvraagIndienenResponse>())!;
|
||||
Assert.StartsWith("BIG-2026-", body.Referentie);
|
||||
Assert.Equal("InBehandeling", body.Status.Tag);
|
||||
Assert.False(body.Status.Manual); // auto-approvable → not a manual case
|
||||
@@ -76,9 +76,9 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
public async Task Submit_handmatig_registratie_succeeds_as_manual_case()
|
||||
{
|
||||
var a = await Create("registratie");
|
||||
var res = await _client.PostAsJsonAsync($"/api/v1/applications/{a.Id}/submit", new { diplomaHerkomst = "handmatig" });
|
||||
var res = await _client.PostAsJsonAsync($"/api/v1/aanvragen/{a.Id}/submit", new { diplomaHerkomst = "handmatig" });
|
||||
res.EnsureSuccessStatusCode(); // no longer a 422
|
||||
var body = (await res.Content.ReadFromJsonAsync<SubmitApplicationResponse>())!;
|
||||
var body = (await res.Content.ReadFromJsonAsync<AanvraagIndienenResponse>())!;
|
||||
Assert.Equal("InBehandeling", body.Status.Tag);
|
||||
Assert.True(body.Status.Manual);
|
||||
}
|
||||
@@ -87,9 +87,9 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
public async Task Submit_herregistratie_with_zero_uren_is_afgewezen()
|
||||
{
|
||||
var a = await Create("herregistratie");
|
||||
var res = await _client.PostAsJsonAsync($"/api/v1/applications/{a.Id}/submit", new { uren = 0 });
|
||||
var res = await _client.PostAsJsonAsync($"/api/v1/aanvragen/{a.Id}/submit", new { uren = 0 });
|
||||
res.EnsureSuccessStatusCode(); // the submission is accepted...
|
||||
var body = (await res.Content.ReadFromJsonAsync<SubmitApplicationResponse>())!;
|
||||
var body = (await res.Content.ReadFromJsonAsync<AanvraagIndienenResponse>())!;
|
||||
Assert.Equal("Afgewezen", body.Status.Tag); // ...but resolves to rejected
|
||||
Assert.NotNull(body.Status.Reden);
|
||||
}
|
||||
@@ -98,8 +98,8 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
public async Task Submitting_twice_conflicts()
|
||||
{
|
||||
var a = await Create("registratie");
|
||||
(await _client.PostAsJsonAsync($"/api/v1/applications/{a.Id}/submit", new { diplomaHerkomst = "duo" })).EnsureSuccessStatusCode();
|
||||
var again = await _client.PostAsJsonAsync($"/api/v1/applications/{a.Id}/submit", new { diplomaHerkomst = "duo" });
|
||||
(await _client.PostAsJsonAsync($"/api/v1/aanvragen/{a.Id}/submit", new { diplomaHerkomst = "duo" })).EnsureSuccessStatusCode();
|
||||
var again = await _client.PostAsJsonAsync($"/api/v1/aanvragen/{a.Id}/submit", new { diplomaHerkomst = "duo" });
|
||||
Assert.Equal(HttpStatusCode.Conflict, again.StatusCode);
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
public async Task Creating_a_second_concept_of_the_same_type_conflicts()
|
||||
{
|
||||
await Create("herregistratie");
|
||||
var dup = await _client.PostAsJsonAsync("/api/v1/applications", new { type = "herregistratie" });
|
||||
var dup = await _client.PostAsJsonAsync("/api/v1/aanvragen", new { type = "herregistratie" });
|
||||
Assert.Equal(HttpStatusCode.Conflict, dup.StatusCode);
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
public async Task A_concept_of_a_different_type_is_allowed()
|
||||
{
|
||||
await Create("registratie");
|
||||
var other = await _client.PostAsJsonAsync("/api/v1/applications", new { type = "herregistratie" });
|
||||
var other = await _client.PostAsJsonAsync("/api/v1/aanvragen", new { type = "herregistratie" });
|
||||
Assert.Equal(HttpStatusCode.Created, other.StatusCode);
|
||||
}
|
||||
|
||||
@@ -125,8 +125,8 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
public async Task A_new_concept_is_allowed_once_the_previous_one_is_submitted()
|
||||
{
|
||||
var a = await Create("registratie");
|
||||
(await _client.PostAsJsonAsync($"/api/v1/applications/{a.Id}/submit", new { diplomaHerkomst = "duo" })).EnsureSuccessStatusCode();
|
||||
var next = await _client.PostAsJsonAsync("/api/v1/applications", new { type = "registratie" });
|
||||
(await _client.PostAsJsonAsync($"/api/v1/aanvragen/{a.Id}/submit", new { diplomaHerkomst = "duo" })).EnsureSuccessStatusCode();
|
||||
var next = await _client.PostAsJsonAsync("/api/v1/aanvragen", new { type = "registratie" });
|
||||
Assert.Equal(HttpStatusCode.Created, next.StatusCode);
|
||||
}
|
||||
|
||||
@@ -134,38 +134,38 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
public async Task Cancel_concept_removes_it()
|
||||
{
|
||||
var a = await Create();
|
||||
Assert.Equal(HttpStatusCode.NoContent, (await _client.DeleteAsync($"/api/v1/applications/{a.Id}")).StatusCode);
|
||||
Assert.Equal(HttpStatusCode.NotFound, (await _client.GetAsync($"/api/v1/applications/{a.Id}")).StatusCode);
|
||||
Assert.Equal(HttpStatusCode.NoContent, (await _client.DeleteAsync($"/api/v1/aanvragen/{a.Id}")).StatusCode);
|
||||
Assert.Equal(HttpStatusCode.NotFound, (await _client.GetAsync($"/api/v1/aanvragen/{a.Id}")).StatusCode);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Cancel_submitted_aanvraag_conflicts()
|
||||
{
|
||||
var a = await Create("registratie");
|
||||
(await _client.PostAsJsonAsync($"/api/v1/applications/{a.Id}/submit", new { diplomaHerkomst = "duo" })).EnsureSuccessStatusCode();
|
||||
Assert.Equal(HttpStatusCode.Conflict, (await _client.DeleteAsync($"/api/v1/applications/{a.Id}")).StatusCode);
|
||||
(await _client.PostAsJsonAsync($"/api/v1/aanvragen/{a.Id}/submit", new { diplomaHerkomst = "duo" })).EnsureSuccessStatusCode();
|
||||
Assert.Equal(HttpStatusCode.Conflict, (await _client.DeleteAsync($"/api/v1/aanvragen/{a.Id}")).StatusCode);
|
||||
}
|
||||
|
||||
// --- WP-53: citizen-scoping — GET /applications must never leak across identities. ---
|
||||
// --- WP-53: citizen-scoping — GET /aanvragen must never leak across identities. ---
|
||||
|
||||
[Fact]
|
||||
public async Task Applications_are_scoped_to_the_caller_bsn()
|
||||
{
|
||||
var mine = await Create("intake");
|
||||
|
||||
var createOther = new HttpRequestMessage(HttpMethod.Post, "/api/v1/applications")
|
||||
var createOther = new HttpRequestMessage(HttpMethod.Post, "/api/v1/aanvragen")
|
||||
{
|
||||
Content = JsonContent.Create(new { type = "intake" }),
|
||||
Headers = { { "X-Subject", "999888777" } },
|
||||
};
|
||||
var otherRes = await _client.SendAsync(createOther);
|
||||
Assert.Equal(HttpStatusCode.Created, otherRes.StatusCode);
|
||||
var other = (await otherRes.Content.ReadFromJsonAsync<ApplicationDetailDto>())!;
|
||||
var other = (await otherRes.Content.ReadFromJsonAsync<AanvraagDetailDto>())!;
|
||||
|
||||
try
|
||||
{
|
||||
var listOther = new HttpRequestMessage(HttpMethod.Get, "/api/v1/applications") { Headers = { { "X-Subject", "999888777" } } };
|
||||
var theirCases = (await (await _client.SendAsync(listOther)).Content.ReadFromJsonAsync<List<ApplicationSummaryDto>>())!;
|
||||
var listOther = new HttpRequestMessage(HttpMethod.Get, "/api/v1/aanvragen") { Headers = { { "X-Subject", "999888777" } } };
|
||||
var theirCases = (await (await _client.SendAsync(listOther)).Content.ReadFromJsonAsync<List<AanvraagSummaryDto>>())!;
|
||||
Assert.Contains(theirCases, c => c.Id == other.Id);
|
||||
Assert.DoesNotContain(theirCases, c => c.Id == mine.Id);
|
||||
|
||||
@@ -175,9 +175,9 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
}
|
||||
finally
|
||||
{
|
||||
var deleteOther = new HttpRequestMessage(HttpMethod.Delete, $"/api/v1/applications/{other.Id}") { Headers = { { "X-Subject", "999888777" } } };
|
||||
var deleteOther = new HttpRequestMessage(HttpMethod.Delete, $"/api/v1/aanvragen/{other.Id}") { Headers = { { "X-Subject", "999888777" } } };
|
||||
await _client.SendAsync(deleteOther);
|
||||
await _client.DeleteAsync($"/api/v1/applications/{mine.Id}");
|
||||
await _client.DeleteAsync($"/api/v1/aanvragen/{mine.Id}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,7 +205,7 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
var foreignDoc = await UploadAs(_client, "999888777", Guid.NewGuid().ToString());
|
||||
var a = await Create("registratie");
|
||||
|
||||
var res = await _client.PostAsJsonAsync($"/api/v1/applications/{a.Id}/submit",
|
||||
var res = await _client.PostAsJsonAsync($"/api/v1/aanvragen/{a.Id}/submit",
|
||||
new { diplomaHerkomst = "duo", documents = new[] { new { categoryId = "diploma", channel = "digital", documentId = foreignDoc.DocumentId } } });
|
||||
Assert.Equal(HttpStatusCode.BadRequest, res.StatusCode);
|
||||
|
||||
@@ -221,7 +221,7 @@ public class ApplicationTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
var foreignDoc = await UploadAs(_client, "999888777", Guid.NewGuid().ToString());
|
||||
var a = await Create("registratie");
|
||||
|
||||
var res = await _client.PutAsJsonAsync($"/api/v1/applications/{a.Id}",
|
||||
var res = await _client.PutAsJsonAsync($"/api/v1/aanvragen/{a.Id}",
|
||||
new { draft = new { }, stepIndex = 0, stepCount = 1, documentIds = new[] { foreignDoc.DocumentId } });
|
||||
Assert.Equal(HttpStatusCode.BadRequest, res.StatusCode);
|
||||
}
|
||||
@@ -9,7 +9,7 @@ namespace BigRegister.Tests.Acceptance;
|
||||
|
||||
/// <summary>
|
||||
/// Behaviour-level tests for the scholing-threshold enforcement (WP-69) over
|
||||
/// <c>POST /applications/{id}/submit</c> (the wizard's real path — WP-72 deleted the legacy
|
||||
/// <c>POST /aanvragen/{id}/submit</c> (the wizard's real path — WP-72 deleted the legacy
|
||||
/// <c>POST /intakes</c> endpoint this once also covered). Built through the <see
|
||||
/// cref="Given"/> type-state builder, mirroring <see cref="BesluitLifecycleTests"/> rather
|
||||
/// than the full wizard/upload dance — the builder's default owner IS <see
|
||||
@@ -28,7 +28,7 @@ public class IntakeSubmissionTests(TestWebApplicationFactory factory) : IClassFi
|
||||
}
|
||||
|
||||
private Task<HttpResponseMessage> Submit(string id, object body) =>
|
||||
_client.PostAsJsonAsync($"/api/v1/applications/{id}/submit", body);
|
||||
_client.PostAsJsonAsync($"/api/v1/aanvragen/{id}/submit", body);
|
||||
|
||||
[Fact]
|
||||
public async Task Below_threshold_without_an_answer_is_rejected_and_stays_a_concept()
|
||||
@@ -117,7 +117,7 @@ public class IntakeSubmissionTests(TestWebApplicationFactory factory) : IClassFi
|
||||
|
||||
// Then the submission is accepted and resolves to Afgewezen — not a 400.
|
||||
res.EnsureSuccessStatusCode();
|
||||
var body = (await res.Content.ReadFromJsonAsync<SubmitApplicationResponse>())!;
|
||||
var body = (await res.Content.ReadFromJsonAsync<AanvraagIndienenResponse>())!;
|
||||
Assert.Equal("Afgewezen", body.Status.Tag);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,11 +18,11 @@ public class AdminCasesTests(TestWebApplicationFactory factory) : IClassFixture<
|
||||
return req;
|
||||
}
|
||||
|
||||
private async Task<ApplicationDetailDto> Create(string type)
|
||||
private async Task<AanvraagDetailDto> Create(string type)
|
||||
{
|
||||
var res = await _client.PostAsJsonAsync("/api/v1/applications", new { type });
|
||||
var res = await _client.PostAsJsonAsync("/api/v1/aanvragen", new { type });
|
||||
Assert.Equal(HttpStatusCode.Created, res.StatusCode);
|
||||
return (await res.Content.ReadFromJsonAsync<ApplicationDetailDto>())!;
|
||||
return (await res.Content.ReadFromJsonAsync<AanvraagDetailDto>())!;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -33,7 +33,7 @@ public class AdminCasesTests(TestWebApplicationFactory factory) : IClassFixture<
|
||||
{
|
||||
var list = await _client.SendAsync(Admin(HttpMethod.Get, "/api/v1/admin/cases"));
|
||||
list.EnsureSuccessStatusCode();
|
||||
var cases = (await list.Content.ReadFromJsonAsync<List<ApplicationSummaryDto>>())!;
|
||||
var cases = (await list.Content.ReadFromJsonAsync<List<AanvraagSummaryDto>>())!;
|
||||
var mine = cases.Single(x => x.Id == a.Id);
|
||||
// RB-03/BIO-003: the owner is carried, but masked — it is a BSN, and this list is
|
||||
// read by someone who is not the subject.
|
||||
@@ -57,13 +57,13 @@ public class AdminCasesTests(TestWebApplicationFactory factory) : IClassFixture<
|
||||
public async Task Admin_can_delete_a_submitted_case()
|
||||
{
|
||||
var a = await Create("registratie");
|
||||
(await _client.PostAsJsonAsync($"/api/v1/applications/{a.Id}/submit", new { diplomaHerkomst = "duo" }))
|
||||
(await _client.PostAsJsonAsync($"/api/v1/aanvragen/{a.Id}/submit", new { diplomaHerkomst = "duo" }))
|
||||
.EnsureSuccessStatusCode();
|
||||
|
||||
// The user-facing DELETE refuses a submitted case (409); admin delete removes it.
|
||||
var del = await _client.SendAsync(Admin(HttpMethod.Delete, $"/api/v1/admin/cases/{a.Id}"));
|
||||
Assert.Equal(HttpStatusCode.NoContent, del.StatusCode);
|
||||
Assert.Equal(HttpStatusCode.NotFound, (await _client.GetAsync($"/api/v1/applications/{a.Id}")).StatusCode);
|
||||
Assert.Equal(HttpStatusCode.NotFound, (await _client.GetAsync($"/api/v1/aanvragen/{a.Id}")).StatusCode);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -17,12 +17,12 @@ namespace BigRegister.Tests;
|
||||
file sealed class IdMismatchZaakSource : IZaakSource
|
||||
{
|
||||
private readonly LocalZaakSource inner = new();
|
||||
private static ApplicationSummaryDto Rekey(ApplicationSummaryDto dto) => dto with { Id = $"zaak-{dto.Id}" };
|
||||
private static AanvraagSummaryDto Rekey(AanvraagSummaryDto dto) => dto with { Id = $"zaak-{dto.Id}" };
|
||||
|
||||
public IReadOnlyList<ApplicationSummaryDto> ListCases(DateTimeOffset now) =>
|
||||
public IReadOnlyList<AanvraagSummaryDto> ListCases(DateTimeOffset now) =>
|
||||
inner.ListCases(now).Select(Rekey).ToList();
|
||||
|
||||
public IReadOnlyList<ApplicationSummaryDto> ListMyCases(ZorgverlenerCaller caller, DateTimeOffset now) =>
|
||||
public IReadOnlyList<AanvraagSummaryDto> ListMyCases(ZorgverlenerCaller caller, DateTimeOffset now) =>
|
||||
inner.ListMyCases(caller, now).Select(Rekey).ToList();
|
||||
|
||||
public (string Referentie, AanvraagStatusDto Status, string? ZaakUrl) CreateZaak(
|
||||
@@ -67,13 +67,13 @@ public class BeoordelingIdMismatchTests
|
||||
using var factory = Factory();
|
||||
using var client = factory.CreateClient();
|
||||
|
||||
var created = await client.PostAsJsonAsync("/api/v1/applications", new { type = "registratie" });
|
||||
var app = (await created.Content.ReadFromJsonAsync<ApplicationDetailDto>())!;
|
||||
var submit = await client.PostAsJsonAsync($"/api/v1/applications/{app.Id}/submit", new { diplomaHerkomst = "handmatig" });
|
||||
var created = await client.PostAsJsonAsync("/api/v1/aanvragen", new { type = "registratie" });
|
||||
var app = (await created.Content.ReadFromJsonAsync<AanvraagDetailDto>())!;
|
||||
var submit = await client.PostAsJsonAsync($"/api/v1/aanvragen/{app.Id}/submit", new { diplomaHerkomst = "handmatig" });
|
||||
submit.EnsureSuccessStatusCode();
|
||||
|
||||
var werkvoorraad = await client.SendAsync(Behandelaar(HttpMethod.Get, "/api/v1/werkvoorraad"));
|
||||
var items = (await werkvoorraad.Content.ReadFromJsonAsync<List<ApplicationSummaryDto>>())!;
|
||||
var items = (await werkvoorraad.Content.ReadFromJsonAsync<List<AanvraagSummaryDto>>())!;
|
||||
var caseId = Assert.Single(items).Id;
|
||||
// Sanity: the id divergence this test exists for is real, not accidentally absent.
|
||||
Assert.NotEqual(app.Id, caseId);
|
||||
|
||||
@@ -35,17 +35,17 @@ public class BeoordelingTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
/// A manual (never auto-approved) case with one linked document, so it stays
|
||||
/// InBehandeling/decidable regardless of test timing (the 8s auto-approval window
|
||||
/// would otherwise make a duo-registratie/herregistratie fixture flaky).
|
||||
private async Task<(ApplicationDetailDto App, string DocumentId)> CreateManualCaseWithDocument()
|
||||
private async Task<(AanvraagDetailDto App, string DocumentId)> CreateManualCaseWithDocument()
|
||||
{
|
||||
var created = await _client.PostAsJsonAsync("/api/v1/applications", new { type = "registratie" });
|
||||
var a = (await created.Content.ReadFromJsonAsync<ApplicationDetailDto>())!;
|
||||
var created = await _client.PostAsJsonAsync("/api/v1/aanvragen", new { type = "registratie" });
|
||||
var a = (await created.Content.ReadFromJsonAsync<AanvraagDetailDto>())!;
|
||||
|
||||
var localId = Guid.NewGuid().ToString();
|
||||
var upload = await _client.PostAsync("/api/v1/uploads", UploadForm(localId, "diploma", "diploma.pdf"));
|
||||
upload.EnsureSuccessStatusCode();
|
||||
var doc = (await upload.Content.ReadFromJsonAsync<UploadResponse>())!;
|
||||
|
||||
var submit = await _client.PostAsJsonAsync($"/api/v1/applications/{a.Id}/submit", new
|
||||
var submit = await _client.PostAsJsonAsync($"/api/v1/aanvragen/{a.Id}/submit", new
|
||||
{
|
||||
diplomaHerkomst = "handmatig",
|
||||
documents = new[] { new { categoryId = "diploma", channel = "digital", documentId = doc.DocumentId } },
|
||||
@@ -88,8 +88,8 @@ public class BeoordelingTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
[Fact]
|
||||
public async Task Concept_and_unknown_id_are_not_found()
|
||||
{
|
||||
var created = await _client.PostAsJsonAsync("/api/v1/applications", new { type = "registratie" });
|
||||
var concept = (await created.Content.ReadFromJsonAsync<ApplicationDetailDto>())!;
|
||||
var created = await _client.PostAsJsonAsync("/api/v1/aanvragen", new { type = "registratie" });
|
||||
var concept = (await created.Content.ReadFromJsonAsync<AanvraagDetailDto>())!;
|
||||
try
|
||||
{
|
||||
var conceptRes = await _client.SendAsync(AsBehandelaar(HttpMethod.Get, $"/api/v1/beoordeling/{concept.Id}"));
|
||||
@@ -100,7 +100,7 @@ public class BeoordelingTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
}
|
||||
finally
|
||||
{
|
||||
await _client.DeleteAsync($"/api/v1/applications/{concept.Id}");
|
||||
await _client.DeleteAsync($"/api/v1/aanvragen/{concept.Id}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -202,9 +202,9 @@ public class EndpointTests(TestWebApplicationFactory factory) : IClassFixture<Te
|
||||
var doc = await Upload(Guid.NewGuid().ToString());
|
||||
// Through the real submit path (RB-06 deleted POST /registrations, which was the only
|
||||
// other caller of DocumentStore.Link and had no ownership guard on it).
|
||||
var created = await _client.PostAsJsonAsync("/api/v1/applications", new { type = "registratie" });
|
||||
var aanvraag = (await created.Content.ReadFromJsonAsync<ApplicationDetailDto>())!;
|
||||
var submit = await _client.PostAsJsonAsync($"/api/v1/applications/{aanvraag.Id}/submit",
|
||||
var created = await _client.PostAsJsonAsync("/api/v1/aanvragen", new { type = "registratie" });
|
||||
var aanvraag = (await created.Content.ReadFromJsonAsync<AanvraagDetailDto>())!;
|
||||
var submit = await _client.PostAsJsonAsync($"/api/v1/aanvragen/{aanvraag.Id}/submit",
|
||||
new { diplomaHerkomst = "duo", documents = new[] { new DocumentRefDto("diploma", "digital", doc.DocumentId) } });
|
||||
submit.EnsureSuccessStatusCode();
|
||||
Assert.Equal(HttpStatusCode.Conflict, (await _client.DeleteAsync($"/api/v1/uploads/{doc.DocumentId}")).StatusCode);
|
||||
|
||||
@@ -51,16 +51,16 @@ public class FeatureFlagTests(TestWebApplicationFactory factory) : IClassFixture
|
||||
{
|
||||
try
|
||||
{
|
||||
// Off → POST /applications for a registratie is refused.
|
||||
// Off → POST /aanvragen for a registratie is refused.
|
||||
(await _client.SendAsync(Admin(HttpMethod.Put, $"/api/v1/admin/flags/{FeatureFlags.InschrijvingOpen}", new { enabled = false })))
|
||||
.EnsureSuccessStatusCode();
|
||||
var blocked = await _client.PostAsJsonAsync("/api/v1/applications", new { type = "registratie" });
|
||||
var blocked = await _client.PostAsJsonAsync("/api/v1/aanvragen", new { type = "registratie" });
|
||||
Assert.Equal(HttpStatusCode.Forbidden, blocked.StatusCode);
|
||||
|
||||
// On → allowed again.
|
||||
(await _client.SendAsync(Admin(HttpMethod.Put, $"/api/v1/admin/flags/{FeatureFlags.InschrijvingOpen}", new { enabled = true })))
|
||||
.EnsureSuccessStatusCode();
|
||||
var ok = await _client.PostAsJsonAsync("/api/v1/applications", new { type = "registratie" });
|
||||
var ok = await _client.PostAsJsonAsync("/api/v1/aanvragen", new { type = "registratie" });
|
||||
Assert.Equal(HttpStatusCode.Created, ok.StatusCode);
|
||||
}
|
||||
finally
|
||||
|
||||
@@ -63,7 +63,7 @@ public class OpenZaakIntegrationTests
|
||||
using var client = factory.CreateClient();
|
||||
client.DefaultRequestHeaders.Add("X-Role", "admin"); // CasesAdmin gate (cases:manage)
|
||||
|
||||
var cases = await client.GetFromJsonAsync<List<ApplicationSummaryDto>>("/api/v1/admin/cases");
|
||||
var cases = await client.GetFromJsonAsync<List<AanvraagSummaryDto>>("/api/v1/admin/cases");
|
||||
|
||||
Assert.NotNull(cases);
|
||||
// bootstrap-catalogus.sh seeds exactly one zaak, identificatie BIG-2026-000123.
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace BigRegister.Tests;
|
||||
/// - it is named, with a reason, in <see cref="AllowList"/> below.
|
||||
///
|
||||
/// The allow-list is deliberately not "public routes" — most of its entries are NOT public.
|
||||
/// `GET /applications/{id}` requires a caller identity and is scoped to that caller's own BSN
|
||||
/// `GET /aanvragen/{id}` requires a caller identity and is scoped to that caller's own BSN
|
||||
/// inline (`ctx.Zorgverlener()`), not through one of the five wrappers, which only gate the
|
||||
/// coarse admin/behandelaar surfaces. Recording that here, with the actual reason, is the point
|
||||
/// of BIO-016's remediation ("makes 'this endpoint is public' a decision someone wrote down")
|
||||
@@ -58,12 +58,12 @@ public class RouteInventoryTests(TestWebApplicationFactory factory) : IClassFixt
|
||||
new("GET", "/api/v1/uploads/{documentId}/content", "Ownership-scoped inline (RB-01/BIO-004): owning citizen, or a behandelaar via Authz.CanBeoordelen."),
|
||||
new("GET", "/api/v1/uploads/status", "Ownership-scoped inline: DocumentStore.ByLocalIds filtered to ctx.Zorgverlener().Bsn."),
|
||||
new("DELETE", "/api/v1/uploads/{documentId}", "Ownership-scoped inline: DocumentStore.DeleteOwned keyed by ctx.Zorgverlener().Bsn."),
|
||||
new("GET", "/api/v1/applications", "Ownership-scoped inline: IZaakSource.ListMyCases(ctx.Zorgverlener(), ...)."),
|
||||
new("GET", "/api/v1/applications/{id}", "Ownership-scoped inline: ApplicationStore.Get(id, ctx.Zorgverlener().Bsn)."),
|
||||
new("POST", "/api/v1/applications", "Ownership-scoped inline: created under ctx.Zorgverlener().Bsn."),
|
||||
new("PUT", "/api/v1/applications/{id}", "Ownership-scoped inline: ApplicationStore.SyncDraft keyed by ctx.Zorgverlener().Bsn."),
|
||||
new("DELETE", "/api/v1/applications/{id}", "Ownership-scoped inline: ApplicationStore.Get/.Delete keyed by ctx.Zorgverlener().Bsn."),
|
||||
new("POST", "/api/v1/applications/{id}/submit", "Ownership-scoped inline: ApplicationStore.Submit keyed by ctx.Zorgverlener().Bsn."),
|
||||
new("GET", "/api/v1/aanvragen", "Ownership-scoped inline: IZaakSource.ListMyCases(ctx.Zorgverlener(), ...)."),
|
||||
new("GET", "/api/v1/aanvragen/{id}", "Ownership-scoped inline: ApplicationStore.Get(id, ctx.Zorgverlener().Bsn)."),
|
||||
new("POST", "/api/v1/aanvragen", "Ownership-scoped inline: created under ctx.Zorgverlener().Bsn."),
|
||||
new("PUT", "/api/v1/aanvragen/{id}", "Ownership-scoped inline: ApplicationStore.SyncDraft keyed by ctx.Zorgverlener().Bsn."),
|
||||
new("DELETE", "/api/v1/aanvragen/{id}", "Ownership-scoped inline: ApplicationStore.Get/.Delete keyed by ctx.Zorgverlener().Bsn."),
|
||||
new("POST", "/api/v1/aanvragen/{id}/submit", "Ownership-scoped inline: ApplicationStore.Submit keyed by ctx.Zorgverlener().Bsn."),
|
||||
|
||||
// --- External caller, not a Principal at all. ---
|
||||
new("POST", "/api/v1/zgw/notificaties", "OpenZaak's NRC, not a user: gated by a fixed-time shared-secret comparison, audited directly."),
|
||||
|
||||
@@ -18,11 +18,11 @@ public class WerkvoorraadTests(TestWebApplicationFactory factory) : IClassFixtur
|
||||
return req;
|
||||
}
|
||||
|
||||
private async Task<ApplicationDetailDto> CreateAndSubmitHerregistratie()
|
||||
private async Task<AanvraagDetailDto> CreateAndSubmitHerregistratie()
|
||||
{
|
||||
var created = await _client.PostAsJsonAsync("/api/v1/applications", new { type = "herregistratie" });
|
||||
var a = (await created.Content.ReadFromJsonAsync<ApplicationDetailDto>())!;
|
||||
(await _client.PostAsJsonAsync($"/api/v1/applications/{a.Id}/submit", new { uren = 200 }))
|
||||
var created = await _client.PostAsJsonAsync("/api/v1/aanvragen", new { type = "herregistratie" });
|
||||
var a = (await created.Content.ReadFromJsonAsync<AanvraagDetailDto>())!;
|
||||
(await _client.PostAsJsonAsync($"/api/v1/aanvragen/{a.Id}/submit", new { uren = 200 }))
|
||||
.EnsureSuccessStatusCode();
|
||||
return a;
|
||||
}
|
||||
@@ -35,7 +35,7 @@ public class WerkvoorraadTests(TestWebApplicationFactory factory) : IClassFixtur
|
||||
{
|
||||
var res = await _client.SendAsync(AsBehandelaar("/api/v1/werkvoorraad"));
|
||||
res.EnsureSuccessStatusCode();
|
||||
var queue = (await res.Content.ReadFromJsonAsync<List<ApplicationSummaryDto>>())!;
|
||||
var queue = (await res.Content.ReadFromJsonAsync<List<AanvraagSummaryDto>>())!;
|
||||
var mine = queue.Single(x => x.Id == a.Id);
|
||||
Assert.Equal("InBehandeling", mine.Status.Tag);
|
||||
// RB-03/BIO-003: masked, like /admin/cases — both inherit ToAdminSummaryDto.
|
||||
@@ -53,18 +53,18 @@ public class WerkvoorraadTests(TestWebApplicationFactory factory) : IClassFixtur
|
||||
[Fact]
|
||||
public async Task Queue_excludes_concepts()
|
||||
{
|
||||
var created = await _client.PostAsJsonAsync("/api/v1/applications", new { type = "herregistratie" });
|
||||
var a = (await created.Content.ReadFromJsonAsync<ApplicationDetailDto>())!;
|
||||
var created = await _client.PostAsJsonAsync("/api/v1/aanvragen", new { type = "herregistratie" });
|
||||
var a = (await created.Content.ReadFromJsonAsync<AanvraagDetailDto>())!;
|
||||
try
|
||||
{
|
||||
var res = await _client.SendAsync(AsBehandelaar("/api/v1/werkvoorraad"));
|
||||
res.EnsureSuccessStatusCode();
|
||||
var queue = (await res.Content.ReadFromJsonAsync<List<ApplicationSummaryDto>>())!;
|
||||
var queue = (await res.Content.ReadFromJsonAsync<List<AanvraagSummaryDto>>())!;
|
||||
Assert.DoesNotContain(queue, x => x.Id == a.Id);
|
||||
}
|
||||
finally
|
||||
{
|
||||
await _client.DeleteAsync($"/api/v1/applications/{a.Id}");
|
||||
await _client.DeleteAsync($"/api/v1/aanvragen/{a.Id}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,14 +39,14 @@ public class ZgwDivergenceTests
|
||||
b.ConfigurePrimaryHttpMessageHandler(() => stub))));
|
||||
}
|
||||
|
||||
/// <summary>Doesn't call GET /applications first (unlike ApplicationTests.Create) — under
|
||||
/// <summary>Doesn't call GET /aanvragen first (unlike ApplicationTests.Create) — under
|
||||
/// Zgw:Enabled=true that route goes through IZaakSource too, which this test's stub doesn't
|
||||
/// need to answer since every test here uses a fresh db and creates exactly one aanvraag.</summary>
|
||||
private static async Task<string> CreateConcept(HttpClient client, string type = "registratie")
|
||||
{
|
||||
var res = await client.PostAsJsonAsync("/api/v1/applications", new { type });
|
||||
var res = await client.PostAsJsonAsync("/api/v1/aanvragen", new { type });
|
||||
res.EnsureSuccessStatusCode();
|
||||
var body = (await res.Content.ReadFromJsonAsync<ApplicationDetailDto>())!;
|
||||
var body = (await res.Content.ReadFromJsonAsync<AanvraagDetailDto>())!;
|
||||
return body.Id;
|
||||
}
|
||||
|
||||
@@ -78,11 +78,11 @@ public class ZgwDivergenceTests
|
||||
using var client = factory.CreateClient();
|
||||
|
||||
var id = await CreateConcept(client);
|
||||
var res = await client.PostAsJsonAsync($"/api/v1/applications/{id}/submit", new { diplomaHerkomst = "duo" });
|
||||
var res = await client.PostAsJsonAsync($"/api/v1/aanvragen/{id}/submit", new { diplomaHerkomst = "duo" });
|
||||
|
||||
// The local write is still authoritative: 200 with a real reference, not a 500.
|
||||
res.EnsureSuccessStatusCode();
|
||||
var body = (await res.Content.ReadFromJsonAsync<SubmitApplicationResponse>())!;
|
||||
var body = (await res.Content.ReadFromJsonAsync<AanvraagIndienenResponse>())!;
|
||||
Assert.NotEmpty(body.Referentie);
|
||||
|
||||
var stored = ApplicationStore.ListAll().Single(a => a.Id == id);
|
||||
@@ -103,7 +103,7 @@ public class ZgwDivergenceTests
|
||||
using var client = factory.CreateClient();
|
||||
|
||||
var id = await CreateConcept(client);
|
||||
var res = await client.PostAsJsonAsync($"/api/v1/applications/{id}/submit", new { diplomaHerkomst = "duo" });
|
||||
var res = await client.PostAsJsonAsync($"/api/v1/aanvragen/{id}/submit", new { diplomaHerkomst = "duo" });
|
||||
res.EnsureSuccessStatusCode();
|
||||
|
||||
var stored = ApplicationStore.ListAll().Single(a => a.Id == id);
|
||||
@@ -126,7 +126,7 @@ public class ZgwDivergenceTests
|
||||
using var client = factory.CreateClient();
|
||||
|
||||
var id = await CreateConcept(client);
|
||||
(await client.PostAsJsonAsync($"/api/v1/applications/{id}/submit", new { diplomaHerkomst = "duo" }))
|
||||
(await client.PostAsJsonAsync($"/api/v1/aanvragen/{id}/submit", new { diplomaHerkomst = "duo" }))
|
||||
.EnsureSuccessStatusCode();
|
||||
|
||||
var error = ApplicationStore.ListAll().Single(a => a.Id == id).ZgwError;
|
||||
|
||||
Reference in New Issue
Block a user