Repository navigation
Description
This repository has phpunit in require-dev but no test infrastructure, so
every feature is currently verified from a consuming application. Two features
merged (or in review) as #12 and #13 made that gap concrete: their most fragile
parts are pure bundle logic, and the tests that cover them today live in another
repository.
What a bundle-local suite should cover first, in rough priority order:
External worker (#12)
ExternalWorkerRunnerdecisions — success reportscomplete, a throwing
handler reportsfailwith the exception message and no explicitretries
(the engine keeps its policy), an unhandled topic reportsunacquireand is
not counted as processed, and held job ids are released on shutdown.ExternalWorkerHandlerRegistry— topic-to-handler mapping, and a topic
claimed by two handlers failing loudly at resolution instead of first-match-wins.ExternalWorkerJob::fromApi()— flattening{name,type,value}variables into
aname => valuemap, missing/empty variables, unknown fields.ExternalWorkerOutcomefactories and the payload each one produces
(especially: only what the caller decided is sent).- The acquire payload shape:
lockDurationpassed through as an ISO-8601
duration string,numberOfTaskshonouring the batch size.
Event registry (#13)
createEventDeployment()builds the request the engine actually wants —
metadata on the query string asdeploymentName/category/tenantId, not
as multipart parts, file part namedfilewith its extension preserved. Most
fragile piece of that feature; regressing it back to the DMN shape is silent.- The
.event/.channelextension gate rejecting.bpmn20.xml,.dmnand
especially.bar/.zip(the plausible-but-wrong case). FlowEventInstance/create.input.jsonreally requiring one event and one
channel reference, rejecting an array/scalareventPayload, and the REST
operation andflowable:events:instances:createrejecting identically — one
schema, two consumers.
Cross-cutting
- Provider query mapping:
listQuery()whitelists, per-resourcedefaultSort,
andrelationFilters()turning both an IRI and a bare id into the engine's id
field. - Path prefixes staying
/service(process engine) vs./dmn-apivs.
/external-job-apivs./event-registry-api/…— the
base_url-without-/servicegotcha applies per engine. - Operation names resolving to their input schema. A concrete regression this
would have caught:flow_external_worker_job_bpmn_errorresolved to
FlowExternalWorkerJobBpmn/error.input.json(the resolver splits at the last
underscore) and the operation shipped without a documented request body.
Most of this needs no engine: a MockHttpClient for the client, plain unit tests
for the worker core, and a Symfony kernel test for the DI wiring
(registerForAutoconfiguration of ExternalWorkerHandlerInterface, the tagged
registry, the input-schema resolver chain). Only an end-to-end event-correlation
test would want a real flowable-rest service.
🤖 Generated with Claude Code
Activity
schmunk42 commentedon Nov 1, 2026
Status after 0.11.0 (#21): the bundle now has a kernel-based test suite (
tests/Kernel,tests/Http) with its own test authentication (X-Test-Roles, undertests/only), a GitHub Actions workflow and a Docker Compose CLI runner. The HTTP and MCP suites cover the permission matrix: every operation and every MCP tool answers 403 without itsflowable:*permission.Still open from the list above: the unit tests for the external worker (items 1-5), the event registry (6-8) and the cross-cutting provider mapping, path prefixes and input-schema resolution (9-11). Keeping this issue open for those.