Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94a506cbfc | ||
|
|
c53354cd22 |
@@ -80,10 +80,16 @@ fl_base="http://$(ip "$fl"):8080/flowable-rest/service"
|
|||||||
reg_id="${loc##*/}"
|
reg_id="${loc##*/}"
|
||||||
|
|
||||||
# Extracts the Beoordelen task id for our registration from a Flowable task-query response on stdin.
|
# Extracts the Beoordelen task id for our registration from a Flowable task-query response on stdin.
|
||||||
|
# Tolerates an empty/non-JSON body (a transient failure during the poll) by printing nothing.
|
||||||
task_for_reg() { REG_ID="$reg_id" python3 -c "import os,sys,json
|
task_for_reg() { REG_ID="$reg_id" python3 -c "import os,sys,json
|
||||||
d=json.load(sys.stdin); rid=os.environ['REG_ID']
|
try:
|
||||||
|
d=json.load(sys.stdin)
|
||||||
|
except Exception:
|
||||||
|
d={}
|
||||||
|
rid=os.environ['REG_ID']
|
||||||
|
# Flowable's task-query returns the included process variables under 'variables'.
|
||||||
print(next((t['id'] for t in (d.get('data') or [])
|
print(next((t['id'] for t in (d.get('data') or [])
|
||||||
if any(v.get('name')=='registrationId' and v.get('value')==rid for v in (t.get('processVariables') or []))), ''))"; }
|
if any(v.get('name')=='registrationId' and v.get('value')==rid for v in (t.get('variables') or []))), ''))"; }
|
||||||
|
|
||||||
flcurl() { docker run --rm --network "$net" curlimages/curl:latest -fsS -u rest-admin:test "$@"; }
|
flcurl() { docker run --rm --network "$net" curlimages/curl:latest -fsS -u rest-admin:test "$@"; }
|
||||||
query='{"processDefinitionKey":"registratie","taskDefinitionKey":"Beoordelen","includeProcessVariables":true}'
|
query='{"processDefinitionKey":"registratie","taskDefinitionKey":"Beoordelen","includeProcessVariables":true}'
|
||||||
@@ -91,7 +97,7 @@ query='{"processDefinitionKey":"registratie","taskDefinitionKey":"Beoordelen","i
|
|||||||
echo ">> polling Flowable for the Beoordelen user task (werkbak)"
|
echo ">> polling Flowable for the Beoordelen user task (werkbak)"
|
||||||
task_id=""
|
task_id=""
|
||||||
for _ in $(seq 1 30); do
|
for _ in $(seq 1 30); do
|
||||||
resp="$(flcurl -X POST "$fl_base/runtime/tasks/query" -H 'Content-Type: application/json' -d "$query" 2>/dev/null || true)"
|
resp="$(flcurl -X POST "$fl_base/query/tasks" -H 'Content-Type: application/json' -d "$query" 2>/dev/null || true)"
|
||||||
task_id="$(printf '%s' "$resp" | task_for_reg)"
|
task_id="$(printf '%s' "$resp" | task_for_reg)"
|
||||||
[ -n "$task_id" ] && break
|
[ -n "$task_id" ] && break
|
||||||
sleep 2
|
sleep 2
|
||||||
@@ -108,7 +114,7 @@ flcurl -X POST "$fl_base/runtime/tasks/$task_id" -H 'Content-Type: application/j
|
|||||||
-d '{"action":"complete","variables":[{"name":"besluit","type":"string","value":"goedkeuren"}]}' >/dev/null
|
-d '{"action":"complete","variables":[{"name":"besluit","type":"string","value":"goedkeuren"}]}' >/dev/null
|
||||||
|
|
||||||
echo ">> asserting the process finished (no Beoordelen task remains for the registration)"
|
echo ">> asserting the process finished (no Beoordelen task remains for the registration)"
|
||||||
resp="$(flcurl -X POST "$fl_base/runtime/tasks/query" -H 'Content-Type: application/json' -d "$query")"
|
resp="$(flcurl -X POST "$fl_base/query/tasks" -H 'Content-Type: application/json' -d "$query")"
|
||||||
still="$(printf '%s' "$resp" | task_for_reg)"
|
still="$(printf '%s' "$resp" | task_for_reg)"
|
||||||
[ -z "$still" ] || { echo "FAIL — Beoordelen task $still still active after completion" >&2; exit 1; }
|
[ -z "$still" ] || { echo "FAIL — Beoordelen task $still still active after completion" >&2; exit 1; }
|
||||||
echo "OK — behandelaar claimed and completed the Beoordelen task; the registratie process finished"
|
echo "OK — behandelaar claimed and completed the Beoordelen task; the registratie process finished"
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public sealed class FlowableWorkflowClient(HttpClient http, FlowableOptions opti
|
|||||||
var request = new TaskQueryRequest(ProcessDefinitionKey, BeoordelenTaskKey, IncludeProcessVariables: true);
|
var request = new TaskQueryRequest(ProcessDefinitionKey, BeoordelenTaskKey, IncludeProcessVariables: true);
|
||||||
|
|
||||||
var page = await PostAsync<TaskQueryRequest, TaskQueryResult>(
|
var page = await PostAsync<TaskQueryRequest, TaskQueryResult>(
|
||||||
"service/runtime/tasks/query", request, ct);
|
"service/query/tasks", request, ct);
|
||||||
|
|
||||||
var tasks = page?.Data ?? [];
|
var tasks = page?.Data ?? [];
|
||||||
return [.. tasks.Select(t => new BeoordelingTask(t.Id, RegistrationId.Parse(t.RegistrationId())))];
|
return [.. tasks.Select(t => new BeoordelingTask(t.Id, RegistrationId.Parse(t.RegistrationId())))];
|
||||||
@@ -137,11 +137,13 @@ public sealed class FlowableWorkflowClient(HttpClient http, FlowableOptions opti
|
|||||||
|
|
||||||
private sealed record UserTaskDto(
|
private sealed record UserTaskDto(
|
||||||
[property: JsonPropertyName("id")] string Id,
|
[property: JsonPropertyName("id")] string Id,
|
||||||
[property: JsonPropertyName("processVariables")] IReadOnlyList<Variable>? ProcessVariables)
|
// Flowable's task-query returns the (included) process variables under "variables", not
|
||||||
|
// "processVariables"; the request opts in via includeProcessVariables.
|
||||||
|
[property: JsonPropertyName("variables")] IReadOnlyList<Variable>? Variables)
|
||||||
{
|
{
|
||||||
/// <summary>The registration id this task carries as a process variable.</summary>
|
/// <summary>The registration id this task carries as a process variable.</summary>
|
||||||
public string RegistrationId() =>
|
public string RegistrationId() =>
|
||||||
ProcessVariables?.SingleOrDefault(v => v.Name == "registrationId")?.Value
|
Variables?.SingleOrDefault(v => v.Name == "registrationId")?.Value
|
||||||
?? throw new InvalidOperationException($"Beoordelen task {Id} carries no registrationId variable.");
|
?? throw new InvalidOperationException($"Beoordelen task {Id} carries no registrationId variable.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ public class FlowableWorkflowClientTests
|
|||||||
var capture = new RequestCapture();
|
var capture = new RequestCapture();
|
||||||
var client = Client(capture.Responds(HttpStatusCode.OK,
|
var client = Client(capture.Responds(HttpStatusCode.OK,
|
||||||
$$"""
|
$$"""
|
||||||
{"data":[{"id":"task-1","processVariables":[{"name":"registrationId","type":"string","value":"{{rid}}"}]}],"total":1}
|
{"data":[{"id":"task-1","variables":[{"name":"registrationId","type":"string","value":"{{rid}}"}]}],"total":1}
|
||||||
"""));
|
"""));
|
||||||
|
|
||||||
var tasks = await client.GetOpenBeoordelingenAsync();
|
var tasks = await client.GetOpenBeoordelingenAsync();
|
||||||
@@ -167,7 +167,7 @@ public class FlowableWorkflowClientTests
|
|||||||
Assert.Equal("task-1", task.TaskId);
|
Assert.Equal("task-1", task.TaskId);
|
||||||
Assert.Equal(rid, task.RegistrationId);
|
Assert.Equal(rid, task.RegistrationId);
|
||||||
Assert.Equal(HttpMethod.Post, capture.Seen!.Method);
|
Assert.Equal(HttpMethod.Post, capture.Seen!.Method);
|
||||||
Assert.Equal("http://flowable/flowable-rest/service/runtime/tasks/query",
|
Assert.Equal("http://flowable/flowable-rest/service/query/tasks",
|
||||||
capture.Seen.RequestUri!.ToString());
|
capture.Seen.RequestUri!.ToString());
|
||||||
Assert.Equal("rest-admin:test", DecodeBasic(capture.Seen));
|
Assert.Equal("rest-admin:test", DecodeBasic(capture.Seen));
|
||||||
Assert.Contains("\"processDefinitionKey\":\"registratie\"", capture.Body);
|
Assert.Contains("\"processDefinitionKey\":\"registratie\"", capture.Body);
|
||||||
@@ -192,7 +192,7 @@ public class FlowableWorkflowClientTests
|
|||||||
{
|
{
|
||||||
var capture = new RequestCapture();
|
var capture = new RequestCapture();
|
||||||
var client = Client(capture.Responds(HttpStatusCode.OK,
|
var client = Client(capture.Responds(HttpStatusCode.OK,
|
||||||
"""{"data":[{"id":"task-1","processVariables":[]}],"total":1}"""));
|
"""{"data":[{"id":"task-1","variables":[]}],"total":1}"""));
|
||||||
|
|
||||||
var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => client.GetOpenBeoordelingenAsync());
|
var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => client.GetOpenBeoordelingenAsync());
|
||||||
Assert.Contains("task-1", ex.Message);
|
Assert.Contains("task-1", ex.Message);
|
||||||
|
|||||||
Reference in New Issue
Block a user