|
24 | 24 | import java.util.List; |
25 | 25 |
|
26 | 26 | import org.flowable.common.engine.api.FlowableException; |
| 27 | +import org.flowable.common.engine.api.FlowableIllegalArgumentException; |
27 | 28 | import org.flowable.common.engine.api.scope.ScopeTypes; |
28 | 29 | import org.flowable.common.engine.impl.interceptor.Command; |
29 | 30 | import org.flowable.common.engine.impl.interceptor.CommandContext; |
@@ -198,6 +199,102 @@ public void testQueryByElementId() { |
198 | 199 |
|
199 | 200 | } |
200 | 201 |
|
| 202 | + @Test |
| 203 | + @Deployment(resources = "org/flowable/engine/test/api/mgmt/ExternalWorkerJobQueryTest.bpmn20.xml") |
| 204 | + public void testQueryByElementIds() { |
| 205 | + ProcessInstance processInstance1 = runtimeService.startProcessInstanceByKey("externalWorkerJobQueryTest"); |
| 206 | + ProcessInstance processInstance2 = runtimeService.startProcessInstanceByKey("externalWorkerJobQueryTest"); |
| 207 | + |
| 208 | + // both element ids -> all four jobs (two per instance) |
| 209 | + assertThat(managementService.createExternalWorkerJobQuery() |
| 210 | + .elementIds(List.of("externalOrder", "externalCustomer1")).count()).isEqualTo(4); |
| 211 | + |
| 212 | + // single element id -> one per instance |
| 213 | + assertThat(managementService.createExternalWorkerJobQuery() |
| 214 | + .elementIds(List.of("externalOrder")).list()) |
| 215 | + .extracting(ExternalWorkerJob::getProcessInstanceId) |
| 216 | + .containsExactlyInAnyOrder(processInstance1.getId(), processInstance2.getId()); |
| 217 | + |
| 218 | + assertThat(managementService.createExternalWorkerJobQuery() |
| 219 | + .elementIds(List.of("invalid")).count()).isZero(); |
| 220 | + |
| 221 | + // empty collection is ignored (the filter is not applied) |
| 222 | + assertThat(managementService.createExternalWorkerJobQuery() |
| 223 | + .elementIds(Collections.emptyList()).count()) |
| 224 | + .isEqualTo(managementService.createExternalWorkerJobQuery().count()); |
| 225 | + |
| 226 | + assertThatThrownBy(() -> managementService.createExternalWorkerJobQuery().elementIds(null)) |
| 227 | + .isExactlyInstanceOf(FlowableIllegalArgumentException.class); |
| 228 | + } |
| 229 | + |
| 230 | + @Test |
| 231 | + @Deployment(resources = "org/flowable/engine/test/api/mgmt/ExternalWorkerJobQueryTest.bpmn20.xml") |
| 232 | + public void testOrQueryByElementIds() { |
| 233 | + ProcessInstance processInstance1 = runtimeService.startProcessInstanceByKey("externalWorkerJobQueryTest"); |
| 234 | + ProcessInstance processInstance2 = runtimeService.startProcessInstanceByKey("externalWorkerJobQueryTest"); |
| 235 | + |
| 236 | + // AND (processInstanceId) + OR (elementIds): only processInstance1's two jobs |
| 237 | + List<ExternalWorkerJob> jobs = managementService.createExternalWorkerJobQuery() |
| 238 | + .processInstanceId(processInstance1.getId()) |
| 239 | + .or() |
| 240 | + .elementIds(List.of("externalOrder", "externalCustomer1")) |
| 241 | + .endOr() |
| 242 | + .list(); |
| 243 | + assertThat(jobs).hasSize(2); |
| 244 | + assertThat(jobs).extracting(ExternalWorkerJob::getProcessInstanceId) |
| 245 | + .containsOnly(processInstance1.getId()); |
| 246 | + |
| 247 | + // OR (jobId OR elementIds): orderJob1 by id, plus every "externalCustomer1" job by element |
| 248 | + ExternalWorkerJob orderJob1 = managementService.createExternalWorkerJobQuery() |
| 249 | + .processInstanceId(processInstance1.getId()) |
| 250 | + .elementId("externalOrder") |
| 251 | + .singleResult(); |
| 252 | + jobs = managementService.createExternalWorkerJobQuery() |
| 253 | + .or() |
| 254 | + .jobId(orderJob1.getId()) |
| 255 | + .elementIds(List.of("externalCustomer1")) |
| 256 | + .endOr() |
| 257 | + .list(); |
| 258 | + assertThat(jobs).extracting(ExternalWorkerJob::getElementId) |
| 259 | + .containsExactlyInAnyOrder("externalOrder", "externalCustomer1", "externalCustomer1"); |
| 260 | + assertThat(jobs).extracting(ExternalWorkerJob::getProcessInstanceId) |
| 261 | + .contains(processInstance1.getId(), processInstance2.getId()); |
| 262 | + } |
| 263 | + |
| 264 | + @Test |
| 265 | + public void testQueryByScopeIds() { |
| 266 | + // covers the SCOPE_ID_ block of ExternalWorkerJob.xml, which the elementIds tests do not exercise |
| 267 | + ExternalWorkerJobEntity job1 = createExternalWorkerJobWithScope("agent", "scope1", "element1"); |
| 268 | + ExternalWorkerJobEntity job2 = createExternalWorkerJobWithScope("agent", null, "element2"); |
| 269 | + |
| 270 | + assertThat(managementService.createExternalWorkerJobQuery().scopeIds(List.of("scope1")).count()).isEqualTo(1); |
| 271 | + assertThat(managementService.createExternalWorkerJobQuery().scopeIds(List.of("scope1", "scope2")).count()).isEqualTo(1); |
| 272 | + assertThat(managementService.createExternalWorkerJobQuery().scopeIds(List.of("unknown")).count()).isZero(); |
| 273 | + |
| 274 | + // scopeIds OR elementIds inside an or() |
| 275 | + assertThat(managementService.createExternalWorkerJobQuery().or() |
| 276 | + .scopeIds(List.of("scope1")) |
| 277 | + .elementIds(List.of("element2")) |
| 278 | + .endOr().list()) |
| 279 | + .extracting(Job::getId) |
| 280 | + .containsExactlyInAnyOrder(job1.getId(), job2.getId()); |
| 281 | + |
| 282 | + // empty collection is ignored (the filter is not applied) |
| 283 | + assertThat(managementService.createExternalWorkerJobQuery().scopeIds(new ArrayList<>()).count()) |
| 284 | + .isEqualTo(managementService.createExternalWorkerJobQuery().count()); |
| 285 | + |
| 286 | + assertThatThrownBy(() -> managementService.createExternalWorkerJobQuery().scopeIds(null)) |
| 287 | + .isExactlyInstanceOf(FlowableIllegalArgumentException.class); |
| 288 | + |
| 289 | + managementService.executeCommand(commandContext -> { |
| 290 | + ExternalWorkerJobEntityManager externalWorkerJobEntityManager = CommandContextUtil.getProcessEngineConfiguration(commandContext) |
| 291 | + .getJobServiceConfiguration().getExternalWorkerJobEntityManager(); |
| 292 | + externalWorkerJobEntityManager.delete(job1.getId()); |
| 293 | + externalWorkerJobEntityManager.delete(job2.getId()); |
| 294 | + return null; |
| 295 | + }); |
| 296 | + } |
| 297 | + |
201 | 298 | @Test |
202 | 299 | @Deployment(resources = "org/flowable/engine/test/api/mgmt/ExternalWorkerJobQueryTest.bpmn20.xml") |
203 | 300 | public void testQueryByElementName() { |
@@ -700,6 +797,20 @@ public Void execute(CommandContext commandContext) { |
700 | 797 | }); |
701 | 798 | } |
702 | 799 |
|
| 800 | + private ExternalWorkerJobEntity createExternalWorkerJobWithScope(String scopeType, String scopeId, String elementId) { |
| 801 | + return managementService.executeCommand(commandContext -> { |
| 802 | + JobService jobService = CommandContextUtil.getJobService(commandContext); |
| 803 | + ExternalWorkerJobEntity jobEntity = jobService.createExternalWorkerJob(); |
| 804 | + jobEntity.setJobType(Job.JOB_TYPE_EXTERNAL_WORKER); |
| 805 | + jobEntity.setScopeType(scopeType); |
| 806 | + jobEntity.setScopeId(scopeId); |
| 807 | + jobEntity.setElementId(elementId); |
| 808 | + jobService.insertExternalWorkerJob(jobEntity); |
| 809 | + assertThat(jobEntity.getId()).isNotNull(); |
| 810 | + return jobEntity; |
| 811 | + }); |
| 812 | + } |
| 813 | + |
703 | 814 | @Test |
704 | 815 | @Deployment(resources = "org/flowable/engine/test/api/mgmt/ExternalWorkerJobQueryTest.bpmn20.xml") |
705 | 816 | public void testOrQuery() { |
|
0 commit comments