Skip to content

Commit

Permalink
Add Basic C8 (spring) ITests
Browse files Browse the repository at this point in the history
  • Loading branch information
p-wunderlich committed May 2, 2024
1 parent 6aecc60 commit 6f1e4cf
Show file tree
Hide file tree
Showing 8 changed files with 338 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ abstract class AbstractC7RemoteApiITest(processTestHelperImpl: ProcessTestHelper
fun setUp() {
repositoryService.createDeployment()
.name("Simple Process")
.addClasspathResource("bpmn/simple-process.bpmn")
.addClasspathResource(BPMN)
.deploy()
}

Expand Down
41 changes: 38 additions & 3 deletions engine-adapter/camunda-platform-8-spring-boot-starter/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@
<artifactId>process-engine-api-adapter-camunda-platform-c8-spring-boot-starter</artifactId>
<properties>
<spring-boot.version>3.1.8</spring-boot.version>
<zeebe-client-java.version>8.4.4</zeebe-client-java.version>
<zeebe-client-java.version>8.4.1</zeebe-client-java.version>
<camunda-tasklist-client-java.version>8.4.0.3</camunda-tasklist-client-java.version>
<java-client-operate.version>8.4.1</java-client-operate.version>
<spring-zeebe.version>8.4.1</spring-zeebe.version>
<zeebe-bom.version>8.4.1</zeebe-bom.version>
</properties>


Expand Down Expand Up @@ -51,7 +53,7 @@
<dependency>
<groupId>io.camunda.spring</groupId>
<artifactId>spring-boot-starter-camunda</artifactId>
<version>8.4.1</version>
<version>${spring-zeebe.version}</version>
<scope>provided</scope>
</dependency>

Expand All @@ -78,7 +80,40 @@
<scope>provided</scope>
</dependency>


<!-- Testing -->
<dependency>
<groupId>io.camunda.spring</groupId>
<artifactId>java-common</artifactId>
<version>8.4.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.camunda</groupId>
<artifactId>spring-zeebe-test-testcontainer</artifactId>
<version>${spring-zeebe.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>dev.bpm-crafters.process-engine-api</groupId>
<artifactId>process-engine-api-adapter-testing</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.tngtech.jgiven</groupId>
<artifactId>jgiven-spring-junit5</artifactId>
<version>1.3.1</version>
<scope>test</scope>
</dependency>

</dependencies>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package dev.bpmcrafters.processengineapi.adapter.c8

import dev.bpmcrafters.processengineapi.test.JGivenSpringBaseIntegrationTest
import dev.bpmcrafters.processengineapi.test.ProcessTestHelper
import io.camunda.tasklist.CamundaTaskListClient
import io.camunda.zeebe.client.ZeebeClient
import io.camunda.zeebe.client.api.response.DeploymentEvent
import io.camunda.zeebe.process.test.assertions.BpmnAssert.assertThat
import io.camunda.zeebe.spring.test.ZeebeSpringTest
import io.mockk.mockk
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.mock.mockito.MockBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Primary
import org.springframework.test.annotation.DirtiesContext
import org.springframework.test.context.ActiveProfiles
import org.testcontainers.junit.jupiter.Testcontainers


@SpringBootTest(
classes = [C8TestApplication::class],
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
@ZeebeSpringTest
@ActiveProfiles("itest")
@DirtiesContext
@Testcontainers
abstract class AbstractC8ApiITest(processTestHelperImpl: ProcessTestHelper) : JGivenSpringBaseIntegrationTest(processTestHelperImpl) {

companion object {
const val KEY = "simple-process"
const val START_MESSAGE = "startMessage"
const val BPMN = "bpmn/$KEY.bpmn"

const val USER_TASK = "user-perform-task"
const val EXTERNAL_TASK = "execute-action-external"
}

@Autowired
lateinit var zeebe: ZeebeClient

/**
* In tests we have no task list so also no need for the real client
*/
@MockBean
lateinit var camundaTaskListClient: CamundaTaskListClient

@BeforeEach
fun setUp() {
val event: DeploymentEvent = zeebe.newDeployResourceCommand()
.addResourceFromClasspath(BPMN)
.send()
.join()

assertThat(event)
}

@AfterEach
fun tearDown() {
processTestHelper.clearAllSubscriptions()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package dev.bpmcrafters.processengineapi.adapter.c8

import dev.bpmcrafters.processengineapi.adapter.c8.task.delivery.PullUserTaskDelivery
import dev.bpmcrafters.processengineapi.adapter.c8.task.delivery.SubscribingRefreshingUserTaskDelivery
import dev.bpmcrafters.processengineapi.adapter.c8.task.delivery.SubscribingServiceTaskDelivery
import dev.bpmcrafters.processengineapi.adapter.commons.task.InMemSubscriptionRepository
import dev.bpmcrafters.processengineapi.adapter.commons.task.SubscriptionRepository
import dev.bpmcrafters.processengineapi.process.ProcessInformation
import dev.bpmcrafters.processengineapi.process.StartProcessApi
import dev.bpmcrafters.processengineapi.task.ExternalTaskCompletionApi
import dev.bpmcrafters.processengineapi.task.TaskSubscriptionApi
import dev.bpmcrafters.processengineapi.task.UserTaskCompletionApi
import dev.bpmcrafters.processengineapi.test.ProcessTestHelper

class C8ProcessTestHelper(
private val startProcessApi: StartProcessApi,
private val userTaskDelivery: SubscribingRefreshingUserTaskDelivery,
private val subscribingServiceTaskDelivery: SubscribingServiceTaskDelivery,
private val taskSubscriptionApi: TaskSubscriptionApi,
private val userTaskCompletionApi: UserTaskCompletionApi,
private val externalTaskCompletionApi: ExternalTaskCompletionApi,
private val subscriptionRepository: SubscriptionRepository
) : ProcessTestHelper {

override fun getStartProcessApi(): StartProcessApi = startProcessApi
override fun getTaskSubscriptionApi(): TaskSubscriptionApi = taskSubscriptionApi
override fun getUserTaskCompletionApi(): UserTaskCompletionApi = userTaskCompletionApi
override fun getExternalTaskCompletionApi(): ExternalTaskCompletionApi = externalTaskCompletionApi

override fun triggerUserTaskDeliveryManually() = userTaskDelivery.refresh()
override fun triggerExternalTaskDeliveryManually() = subscribingServiceTaskDelivery.subscribe()

override fun getProcessInformation(instanceId: String): ProcessInformation = ProcessInformation(
instanceId = "fixme",
meta = emptyMap()
)

override fun clearAllSubscriptions() = (subscriptionRepository as InMemSubscriptionRepository).deleteAllTaskSubscriptions()

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package dev.bpmcrafters.processengineapi.adapter.c8

import dev.bpmcrafters.processengineapi.test.ProcessTestHelper
import io.toolisticon.testing.jgiven.THEN
import io.toolisticon.testing.jgiven.WHEN
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired

class C8StartProcessApiITest(@Autowired processTestHelperImpl: ProcessTestHelper) : AbstractC8ApiITest(processTestHelperImpl) {

@Test
fun `should start process by definition without payload`() {
WHEN
.`start process by definition`(KEY)

THEN
.`we should have a running process`()
}

@Test
fun `should start process by definition with payload`() {
WHEN
.`start process by definition with payload`(KEY, "key" to "value")

THEN
.`we should have a running process`()
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package dev.bpmcrafters.processengineapi.adapter.c8

import com.tngtech.jgiven.integration.spring.EnableJGiven
import dev.bpmcrafters.processengineapi.adapter.c8.task.delivery.SubscribingRefreshingUserTaskDelivery
import dev.bpmcrafters.processengineapi.adapter.c8.task.delivery.SubscribingServiceTaskDelivery
import dev.bpmcrafters.processengineapi.adapter.commons.task.SubscriptionRepository
import dev.bpmcrafters.processengineapi.process.StartProcessApi
import dev.bpmcrafters.processengineapi.task.ExternalTaskCompletionApi
import dev.bpmcrafters.processengineapi.task.TaskSubscriptionApi
import dev.bpmcrafters.processengineapi.task.UserTaskCompletionApi
import dev.bpmcrafters.processengineapi.test.ProcessTestHelper
import io.camunda.tasklist.CamundaTaskListClient
import io.mockk.mockk
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Primary


@EnableJGiven
@SpringBootApplication
class C8TestApplication {

@Bean
fun processTestHelper(
startProcessApi: StartProcessApi,
taskSubscriptionApi: TaskSubscriptionApi,
userTaskDelivery: SubscribingRefreshingUserTaskDelivery,
subscribingServiceTaskDelivery: SubscribingServiceTaskDelivery,
userTaskCompletionApi: UserTaskCompletionApi,
externalTaskCompletionApi: ExternalTaskCompletionApi,
subscriptionRepository: SubscriptionRepository,
): ProcessTestHelper = C8ProcessTestHelper(
startProcessApi = startProcessApi,
taskSubscriptionApi = taskSubscriptionApi,
userTaskDelivery = userTaskDelivery,
subscribingServiceTaskDelivery = subscribingServiceTaskDelivery,
userTaskCompletionApi = userTaskCompletionApi,
externalTaskCompletionApi = externalTaskCompletionApi,
subscriptionRepository = subscriptionRepository
)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
spring:
application:
name: ITest

dev:
bpm-crafters:
process-api:
adapter:
c8:
user-tasks:
delivery-strategy: subscription_refreshing
fixed-rate-schedule-rate: 5000 # every 5 seconds
tasklist-url: localhost
fixed-rate-refresh-rate: 5000 # every 5 seconds
service-tasks:
delivery-strategy: subscription
worker-id: execute-action-external
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_0jyd698" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.22.0" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.4.0">
<bpmn:process id="simple-process" name="Simple Process" isExecutable="true">
<bpmn:startEvent id="started" name="Started">
<bpmn:outgoing>Flow_14ng1om</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_14ng1om" sourceRef="started" targetRef="Gateway_0r4dt9x" />
<bpmn:serviceTask id="service-do-action1" name="Execute&#10;action">
<bpmn:extensionElements>
<zeebe:taskDefinition type="execute-action-external" />
</bpmn:extensionElements>
<bpmn:incoming>Flow_0zaxz2a</bpmn:incoming>
<bpmn:outgoing>Flow_1cwg293</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:userTask id="user-perform-task" name="Perform&#10;User&#10;Task">
<bpmn:extensionElements>
<zeebe:assignmentDefinition assignee="kermit" candidateGroups="avengers" candidateUsers="gonzo, fozzy" />
<zeebe:formDefinition formKey="user-task-form-1" />
</bpmn:extensionElements>
<bpmn:incoming>Flow_0kv6x7n</bpmn:incoming>
<bpmn:outgoing>Flow_08tjrzz</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_08tjrzz" sourceRef="user-perform-task" targetRef="Gateway_1reomxy" />
<bpmn:endEvent id="ended" name="Finished">
<bpmn:incoming>Flow_0ljvt4k</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_0zaxz2a" sourceRef="Gateway_0r4dt9x" targetRef="service-do-action1" />
<bpmn:parallelGateway id="Gateway_0r4dt9x">
<bpmn:incoming>Flow_14ng1om</bpmn:incoming>
<bpmn:outgoing>Flow_0zaxz2a</bpmn:outgoing>
<bpmn:outgoing>Flow_0kv6x7n</bpmn:outgoing>
</bpmn:parallelGateway>
<bpmn:sequenceFlow id="Flow_0kv6x7n" sourceRef="Gateway_0r4dt9x" targetRef="user-perform-task" />
<bpmn:sequenceFlow id="Flow_1cwg293" sourceRef="service-do-action1" targetRef="Gateway_1reomxy" />
<bpmn:parallelGateway id="Gateway_1reomxy">
<bpmn:incoming>Flow_1cwg293</bpmn:incoming>
<bpmn:incoming>Flow_08tjrzz</bpmn:incoming>
<bpmn:outgoing>Flow_0ljvt4k</bpmn:outgoing>
</bpmn:parallelGateway>
<bpmn:sequenceFlow id="Flow_0ljvt4k" sourceRef="Gateway_1reomxy" targetRef="ended" />
</bpmn:process>
<bpmn:message id="Message_1v4m9q6" name="message1">
<bpmn:extensionElements>
<zeebe:subscription correlationKey="=stringValue" />
</bpmn:extensionElements>
</bpmn:message>
<bpmn:signal id="Signal_2sv5u5p" name="signal1" />
<bpmn:error id="Error_1tp4181" name="action_error" errorCode="action_error" />
<bpmn:error id="Error_09pdhdd" name="user_error" errorCode="user_error" />
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="simple-process">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="started">
<dc:Bounds x="179" y="189" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="179" y="232" width="36" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_023h4rq_di" bpmnElement="Gateway_0r4dt9x">
<dc:Bounds x="285" y="182" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1i94u5i_di" bpmnElement="user-perform-task">
<dc:Bounds x="420" y="250" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0saruaw_di" bpmnElement="service-do-action1">
<dc:Bounds x="420" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_02yufp5_di" bpmnElement="Gateway_1reomxy">
<dc:Bounds x="605" y="182" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1x8zoeq_di" bpmnElement="ended">
<dc:Bounds x="782" y="189" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="779" y="232" width="42" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_14ng1om_di" bpmnElement="Flow_14ng1om">
<di:waypoint x="215" y="207" />
<di:waypoint x="285" y="207" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0zaxz2a_di" bpmnElement="Flow_0zaxz2a">
<di:waypoint x="310" y="182" />
<di:waypoint x="310" y="120" />
<di:waypoint x="420" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0kv6x7n_di" bpmnElement="Flow_0kv6x7n">
<di:waypoint x="310" y="232" />
<di:waypoint x="310" y="290" />
<di:waypoint x="420" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_08tjrzz_di" bpmnElement="Flow_08tjrzz">
<di:waypoint x="520" y="290" />
<di:waypoint x="630" y="290" />
<di:waypoint x="630" y="232" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1cwg293_di" bpmnElement="Flow_1cwg293">
<di:waypoint x="520" y="120" />
<di:waypoint x="630" y="120" />
<di:waypoint x="630" y="182" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0ljvt4k_di" bpmnElement="Flow_0ljvt4k">
<di:waypoint x="655" y="207" />
<di:waypoint x="782" y="207" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

0 comments on commit 6f1e4cf

Please sign in to comment.