SonataFlow integration test using PostgreSQL
This document describes how you can test your integrated workflow application using PostgreSQL persistence.
The example described in this document is based on the serverless-workflow-callback-quarkus
example application.
Overview
This document describes the process of launching and testing the artifact that is produced by the Quarkus builds, and verifying the interaction of the artifact with a PostgreSQL database instance. To perform this scenario and verify the service behavior, the following Quarkus annotations and tools are used:
-
@QuarkusIntegrationTest
: This annotation is used to launch and test the artifact produced by the Serverless Workflow Quarkus build. For more information, see Testing Quarkus application - Using@QuarkusIntegrationTest
in Quarkus documentation. -
Quarkus Dev Services: This facilitates writing integration tests that need launching services to support the workflow application. For more information, see Testing Quarkus application - launching containers in Quarkus documentation.
@QuarkusIntegrationTest
works immediately with the additional containers that are launched using Quarkus Dev Services.
Testing a workflow application using PostgreSQL persistence
You can test your workflow application using PostgreSQL persistence.
-
A workflow project is created.
For more information about creating a workflow project, see Creating your first Serverless Workflow service.
-
Workflow application persistence is enabled using PostgreSQL.
For more information, see Running workflow service using PostgreSQL.
-
Docker is installed.
-
Add the required test dependencies to the
pom.xml
file of your workflow application:Dependencies required for HTTP-based testing in JVM mode<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-junit5</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <scope>test</scope> </dependency>
Addawaitility
dependency inpom.xml
<dependency> <groupId>org.awaitility</groupId> <artifactId>awaitility</artifactId> <scope>test</scope> </dependency>
The
awaitility
dependency allows the test to express the time expectations of an asynchronous system. For more information, see Awaitility website. -
Check the dependencies of PostgreSQL resources.
The Quarkus Dev Services for Databases is enabled when a reactive or JDBC data source extension is present in the workflow application.
Ensure that the
pom.xml
file of your workflow application contains the required dependency for PostgreSQL resources.JDBC persistence add-on dependency<dependency> <groupId>org.kie.kogito</groupId> <artifactId>kogito-addons-quarkus-persistence-jdbc</artifactId> </dependency>
Quarkus JDBC PostgreSQL dependency<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-jdbc-postgresql</artifactId> </dependency>
Quarkus Agroal data source dependency<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-agroal</artifactId> </dependency>
-
To run the integration tests, add Apache Maven Failsafe plug-in in the
pom.xml
file of your workflow application.maven-failsafe-plugin
inpom.xml
plug-in section<plugin> <artifactId>maven-failsafe-plugin</artifactId> <version>${version.failsafe.plugin}</version> <configuration> <systemPropertyVariables> <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> <maven.home>${maven.home}</maven.home> </systemPropertyVariables> </configuration> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin>
For more information about
maven-failsafe-plugin
, see Maven Failsafe Plugin documentation. -
Enable Quarkus Database Dev Services.
The additional containers contain a full set of default configurations, including PostgreSQL Docker image name, default user, and default password. The required configuration to link the workflow application with the Quarkus Dev PostgreSQL container is automatically added to the integration test. Quarkus provides the properties such as
quarkus.datasource.reactive.url
,quarkus.datasource.jdbc.url
,quarkus.datasource.username
, orquarkus.datasource.password
, when you start the container.For more information, see Quarkus Dev Services for Databases in Quarkus documentation.
-
Create a test class and add the test annotations in the test class as shown in the following example:
Example integration test annotations in a test class@QuarkusIntegrationTest (1) class CallbackRestIT { (2) static { RestAssured.enableLoggingOfRequestAndResponseIfValidationFails();(3) } @Test void testCallbackRest() { String id = given() (3) .contentType(ContentType.JSON) .accept(ContentType.JSON) .post("/callback") .then() .statusCode(201) .extract() .path("id"); await() (4) .atLeast(1, SECONDS) .atMost(30, SECONDS) .with().pollInterval(1, SECONDS) .untilAsserted(() -> given() .contentType(ContentType.JSON) .accept(ContentType.JSON) .get("/callback/{id}", id) .then() .statusCode(404)); } }
1 Allows launching and testing the artifact that is produced by the Quarkus build. Also, supports testing of a JAR file, a native image, or a container image. 2 Test name ends with 'IT' to identify which test needs to be executed as an integration test. 3 Testing application interactions using REST Assured. 4 await()
allows the test to retry the validations until the verifications are declared or until the specified time expectation is expired.Once you specify the required resources and annotations, you can start testing the different interactions with the workflow application as described in Testing your workflow application using REST Assured document.
-
To run the tests, execute the following command:
Run the testsmvn clean verify
Found an issue?
If you find an issue or any misleading information, please feel free to report it here. We really appreciate it!