test(workflow): user-task client — werkbak query, claim, complete beoordeling (refs #13)
Red — GetOpenBeoordelingenAsync/ClaimAsync/CompleteBeoordelingAsync do not exist yet. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using Big.Application;
|
||||||
using Big.Domain;
|
using Big.Domain;
|
||||||
using Big.Infrastructure;
|
using Big.Infrastructure;
|
||||||
|
|
||||||
@@ -136,4 +137,106 @@ public class FlowableWorkflowClientTests
|
|||||||
await Assert.ThrowsAsync<HttpRequestException>(
|
await Assert.ThrowsAsync<HttpRequestException>(
|
||||||
() => client.CompleteOpenZaakJobAsync("job-1", new Uri("http://openzaak/zaken/api/v1/zaken/abc")));
|
() => client.CompleteOpenZaakJobAsync("job-1", new Uri("http://openzaak/zaken/api/v1/zaken/abc")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── S-12b: behandelaar user tasks (werkbak / claim / complete) ────────────────────────────────
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Open_beoordelingen_queries_beoordelen_tasks_with_their_registration_id()
|
||||||
|
{
|
||||||
|
var rid = RegistrationId.New();
|
||||||
|
var capture = new RequestCapture();
|
||||||
|
var client = Client(capture.Responds(HttpStatusCode.OK,
|
||||||
|
$$"""
|
||||||
|
{"data":[{"id":"task-1","processVariables":[{"name":"registrationId","type":"string","value":"{{rid}}"}]}],"total":1}
|
||||||
|
"""));
|
||||||
|
|
||||||
|
var tasks = await client.GetOpenBeoordelingenAsync();
|
||||||
|
|
||||||
|
var task = Assert.Single(tasks);
|
||||||
|
Assert.Equal("task-1", task.TaskId);
|
||||||
|
Assert.Equal(rid, task.RegistrationId);
|
||||||
|
Assert.Equal(HttpMethod.Post, capture.Seen!.Method);
|
||||||
|
Assert.Equal("http://flowable/flowable-rest/service/runtime/tasks/query",
|
||||||
|
capture.Seen.RequestUri!.ToString());
|
||||||
|
Assert.Equal("rest-admin:test", DecodeBasic(capture.Seen));
|
||||||
|
Assert.Contains("\"processDefinitionKey\":\"registratie\"", capture.Body);
|
||||||
|
Assert.Contains("\"taskDefinitionKey\":\"Beoordelen\"", capture.Body);
|
||||||
|
Assert.Contains("\"includeProcessVariables\":true", capture.Body);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[InlineData("""{"data":[],"total":0}""")]
|
||||||
|
[InlineData("""{"data":null,"total":0}""")]
|
||||||
|
public async Task Open_beoordelingen_is_empty_when_no_tasks_are_waiting(string body)
|
||||||
|
{
|
||||||
|
var capture = new RequestCapture();
|
||||||
|
var client = Client(capture.Responds(HttpStatusCode.OK, body));
|
||||||
|
|
||||||
|
Assert.Empty(await client.GetOpenBeoordelingenAsync());
|
||||||
|
Assert.NotNull(capture.Seen);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Open_beoordelingen_throws_when_a_task_carries_no_registration_id()
|
||||||
|
{
|
||||||
|
var capture = new RequestCapture();
|
||||||
|
var client = Client(capture.Responds(HttpStatusCode.OK,
|
||||||
|
"""{"data":[{"id":"task-1","processVariables":[]}],"total":1}"""));
|
||||||
|
|
||||||
|
var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => client.GetOpenBeoordelingenAsync());
|
||||||
|
Assert.Contains("task-1", ex.Message);
|
||||||
|
Assert.Contains("registrationId", ex.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Claim_assigns_the_task_to_the_behandelaar()
|
||||||
|
{
|
||||||
|
var capture = new RequestCapture();
|
||||||
|
var client = Client(capture.Responds(HttpStatusCode.OK));
|
||||||
|
|
||||||
|
await client.ClaimAsync("task-1", "merel-behandelaar");
|
||||||
|
|
||||||
|
Assert.Equal(HttpMethod.Post, capture.Seen!.Method);
|
||||||
|
Assert.Equal("http://flowable/flowable-rest/service/runtime/tasks/task-1",
|
||||||
|
capture.Seen.RequestUri!.ToString());
|
||||||
|
Assert.Contains("\"action\":\"claim\"", capture.Body);
|
||||||
|
Assert.Contains("\"assignee\":\"merel-behandelaar\"", capture.Body);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Claim_throws_when_flowable_rejects_the_request()
|
||||||
|
{
|
||||||
|
var capture = new RequestCapture();
|
||||||
|
var client = Client(capture.Responds(HttpStatusCode.Conflict));
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<HttpRequestException>(() => client.ClaimAsync("task-1", "merel-behandelaar"));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[InlineData(BeoordelingsBesluit.Goedkeuren, "goedkeuren")]
|
||||||
|
[InlineData(BeoordelingsBesluit.Afwijzen, "afwijzen")]
|
||||||
|
public async Task Complete_posts_the_besluit_variable_to_the_task(BeoordelingsBesluit besluit, string expected)
|
||||||
|
{
|
||||||
|
var capture = new RequestCapture();
|
||||||
|
var client = Client(capture.Responds(HttpStatusCode.OK));
|
||||||
|
|
||||||
|
await client.CompleteBeoordelingAsync("task-1", besluit);
|
||||||
|
|
||||||
|
Assert.Equal(HttpMethod.Post, capture.Seen!.Method);
|
||||||
|
Assert.Equal("http://flowable/flowable-rest/service/runtime/tasks/task-1",
|
||||||
|
capture.Seen.RequestUri!.ToString());
|
||||||
|
Assert.Contains("\"action\":\"complete\"", capture.Body);
|
||||||
|
Assert.Contains("\"name\":\"besluit\"", capture.Body);
|
||||||
|
Assert.Contains($"\"value\":\"{expected}\"", capture.Body);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Complete_beoordeling_throws_when_flowable_rejects_the_request()
|
||||||
|
{
|
||||||
|
var capture = new RequestCapture();
|
||||||
|
var client = Client(capture.Responds(HttpStatusCode.InternalServerError));
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<HttpRequestException>(
|
||||||
|
() => client.CompleteBeoordelingAsync("task-1", BeoordelingsBesluit.Goedkeuren));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user