From 5b9590717afc5e7a9422df8356807c8dc7b009c5 Mon Sep 17 00:00:00 2001
From: BDA <58807088+boddissattva@users.noreply.github.com>
Date: Thu, 12 Dec 2024 10:11:00 +0100
Subject: [PATCH] chore(docs) : Docker and Actions (#33)
---
LICENSE.txt | 202 ++++++++++++++++++
README.md | 7 +-
docs/docs/documentation/actions/amqp.md | 113 +++++-----
docs/docs/documentation/actions/assertions.md | 50 +++--
docs/docs/documentation/actions/context.md | 172 +++++++++++++++
docs/docs/documentation/actions/groovy.md | 16 +-
docs/docs/documentation/actions/http.md | 70 +++---
.../documentation/actions/introduction.md | 35 ++-
docs/docs/documentation/actions/jms.md | 176 +++++++++------
docs/docs/documentation/actions/kafka.md | 21 +-
docs/docs/documentation/actions/micrometer.md | 150 ++++++-------
docs/docs/documentation/actions/mongo.md | 1 +
docs/docs/documentation/actions/other.md | 22 --
docs/docs/documentation/actions/selenium.md | 37 ++--
docs/docs/documentation/actions/soap.md | 2 +-
docs/docs/documentation/actions/sql.md | 12 +-
docs/docs/documentation/actions/ssh.md | 87 ++++----
docs/docs/documentation/campaign.md | 8 +
docs/docs/documentation/environment.md | 8 +
docs/docs/documentation/intellij_plugin.md | 6 +-
docs/docs/documentation/scenario.md | 15 ++
.../{scenario_sync.md => synchronize.md} | 12 +-
docs/docs/documentation/write.md | 8 -
docs/docs/getting_started/run.md | 29 +--
docs/docs/getting_started/write.md | 6 +-
docs/docs/index.md | 30 ++-
docs/docs/installation/local_dev.md | 9 +-
docs/mkdocs.yml | 51 +++--
28 files changed, 935 insertions(+), 420 deletions(-)
create mode 100644 LICENSE.txt
create mode 100644 docs/docs/documentation/actions/context.md
delete mode 100644 docs/docs/documentation/actions/other.md
create mode 100644 docs/docs/documentation/campaign.md
create mode 100644 docs/docs/documentation/environment.md
create mode 100644 docs/docs/documentation/scenario.md
rename docs/docs/documentation/{scenario_sync.md => synchronize.md} (93%)
delete mode 120000 docs/docs/documentation/write.md
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 000000000..d64569567
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/README.md b/README.md
index 8c715e55f..16460f6f4 100644
--- a/README.md
+++ b/README.md
@@ -10,11 +10,12 @@
[![Build](https://github.com/Enedis-OSS/chutney/actions/workflows/build-all.yml/badge.svg?branch=main)](https://github.com/Enedis-OSS/chutney/actions/workflows/build-all.yml)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/559893368d134d729b204891e3ce0239)](https://www.codacy.com/gh/chutney-testing/chutney?utm_source=github.com&utm_medium=referral&utm_content=chutney-testing/chutney&utm_campaign=Badge_Grade)
-[![Coverage Status](https://codecov.io/gh/Enedis-OSS/chutney/branch/master/graph/badge.svg)](https://codecov.io/gh/chutney-testing/chutney/)
+[![Coverage Status](https://codecov.io/gh/Enedis-OSS/chutney/branch/master/graph/badge.svg)](https://codecov.io/gh/Enedis-OSS/chutney/)
[![REUSE](https://github.com/Enedis-OSS/chutney/actions/workflows/reuse.yml/badge.svg)](https://github.com/Enedis-OSS/chutney/actions/workflows/reuse.yml)
[![GitHub Release](https://img.shields.io/github/v/release/Enedis-OSS/chutney)](https://github.com/Enedis-OSS/chutney/releases)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.chutneytesting/server/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.chutneytesting/server)
[![GitHub Release](https://img.shields.io/github/v/release/Enedis-OSS/chutney?label=docker)](https://github.com/Enedis-OSS/chutney/pkgs/container/chutney%2Fchutney-server)
+[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
-------------
@@ -45,7 +46,7 @@ In addition, Chutney provide SpEL evaluation and extensible [Function](https://g
[Find out more in the documentation !](https://www.chutney-testing.com/)
-Still asking yourself ["Why another test tool ?"](https://www.chutney-testing.com/concepts/)
+Still asking yourself ["Why another test tool ?"](https://www.chutney-testing.com/#why-another-test-tool)
-------------
## Demo
@@ -64,7 +65,7 @@ See [Start a server](https://www.chutney-testing.com/installation/local_dev/#sta
#### On premise
-See [installation on premise](https://www.chutney-testing.com/installation/on_premise/), for details if you want to customize your own version of chutney server.
+See [installation on premise](https://www.chutney-testing.com/installation/on_premise/introduction/), for details if you want to customize your own version of chutney server.
-------------
diff --git a/docs/docs/documentation/actions/amqp.md b/docs/docs/documentation/actions/amqp.md
index 5f6925518..611279bef 100644
--- a/docs/docs/documentation/actions/amqp.md
+++ b/docs/docs/documentation/actions/amqp.md
@@ -42,13 +42,14 @@ Use this action to publish a message to an exchange.
=== "Inputs"
- | Required | Name | Type | Description |
- |:--------:|:----------------|:-------------------------|:----------------|
- | * | `exchange-name` | String | The exchange to publish the message to. Must exist |
- | | `routing-key` | String | The routing key. See this [example](https://www.rabbitmq.com/tutorials/tutorial-five-python.html#:~:text=complex%20topic%20exchange.-,Topic%20exchange,-Messages%20sent%20to){:target=_blank} for more details. |
- | | `headers` | Map | Message headers |
- | | `properties` | Map | Other message's [properties](https://rabbitmq.github.io/rabbitmq-java-client/api/current/com/rabbitmq/client/AMQP.BasicProperties.html){:target=_blank}. Actually only content_type property is handled. |
- | * | `payload` | String | Message content |
+ | Required | Name | Type | Description |
+ |:--------:|:----------------|:---------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+ | * | `target` | String | The AMQP service name to use |
+ | * | `exchange-name` | String | The exchange to publish the message to |
+ | | `routing-key` | String | The routing key. See this [example](https://www.rabbitmq.com/tutorials/tutorial-five-python.html#:~:text=complex%20topic%20exchange.-,Topic%20exchange,-Messages%20sent%20to){:target=_blank} for more details. |
+ | | `headers` | Map | Message headers |
+ | | `properties` | Map | Other message's [properties](https://rabbitmq.github.io/rabbitmq-java-client/api/current/com/rabbitmq/client/AMQP.BasicProperties.html){:target=_blank}. Actually only content_type property is handled |
+ | * | `payload` | String | Message content |
=== "Outputs"
@@ -91,9 +92,9 @@ Use this action to consume messages from a queue.
!!! warning "Parallel consume"
* Only **one** queue consumer can be started at a given time.
* To start a queue consumer, Chutney:
- * check if an other consumer was started:
+ * check if another consumer was started:
* if true, it re check the queue availability every `500 ms` without exceeding `timeout` duration. At every iteration, the remaining timeout is reduced by `500 ms`.
- * else, it mark the queue as locked and start the current consumer.
+ * else, it marks the queue as locked and start the current consumer.
* consume messages without exceeding the remaining timeout ( = timeout - n * 500ms) or the `nb-messages`.
* stop consumer and unlock the queue.
@@ -102,21 +103,22 @@ Use this action to consume messages from a queue.
=== "Inputs"
- | Required | Name | Type | Default | Description |
- |:--------:|:--------------|:------------|:-----------|:------------------------------------|
- | * | `queue-name` | string | | Queue name. |
- | | `nb-messages` | integer | 1 | How many messages to be consumed. Throw error if got messages number is less than nb-messages. |
- | | `selector` | string | | |
- | | `timeout` | [duration](/documentation/actions/other.md/#duration-type) | `"10 sec"` | In how many time a consume connection must be established and messages must be read |
- | | `ack` | boolean | true | [Basic.ack](https://www.rabbitmq.com/confirms.html#acknowledgement-modes){:target=_blank} acknowledgements mode is used if true. |
+ | Required | Name | Type | Default | Description |
+ |:--------:|:--------------|:---------------------------------------------------------------------------|:-----------|:---------------------------------------------------------------------------------------------------------------------------------|
+ | * | `target` | string | | The AMQP service name to use |
+ | * | `queue-name` | string | | Queue name |
+ | | `nb-messages` | integer | 1 | How many messages to be consumed. Throw error if got messages number is less than nb-messages |
+ | | `selector` | string | | |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | `"10 sec"` | In how many time a consume connection must be established and messages must be read |
+ | | `ack` | boolean | true | [Basic.ack](https://www.rabbitmq.com/confirms.html#acknowledgement-modes){:target=_blank} acknowledgements mode is used if true |
=== "Outputs"
- | Name | Type | Description |
- |-----------:|:-------|:-----------------|
- | `body` | String | response as Map |
- | `payloads` | String | response paylods |
- | `headers` | String | response headers |
+ | Name | Type | Description |
+ |-----------:|:----------------------------|:-----------------------------------------------------------|
+ | `body` | List\> | responses. Each map contains a `payload` and `header` keys |
+ | `payloads` | List | response payloads. Each one is a Map or String |
+ | `headers` | List | response headers. Each one is a Map |
### Example
@@ -151,17 +153,18 @@ Use this action to have direct access to available messages in a queue.
=== "Inputs"
- | Required | Name | Type | Description |
- |:--------:|:-------------|:-------|:-----------:|
- | * | `queue-name` | String | Queue name. |
+ | Required | Name | Type | Description |
+ |:--------:|:-------------|:-------|:-----------------------------:|
+ | * | `target` | String | The AMQP service name to use |
+ | * | `queue-name` | String | Queue name |
=== "Outputs"
- | Name | Type | Description |
- |----------:|:---------------------------------------|:-----------------|
- | `message` | String | [response](https://rabbitmq.github.io/rabbitmq-java-client/api/4.x.x/com/rabbitmq/client/GetResponse.html){:target=_blank} as Map |
- | `body` | String | response body |
- | `headers` | String | response headers |
+ | Name | Type | Description |
+ |----------:|:-------|:----------------------------------------------------------------------------------------------------------------------------------|
+ | `message` | String | [response](https://rabbitmq.github.io/rabbitmq-java-client/api/4.x.x/com/rabbitmq/client/GetResponse.html){:target=_blank} as Map |
+ | `body` | String | response body |
+ | `headers` | String | response headers |
@@ -186,9 +189,10 @@ For example, it can be used at the beginning of your scenario to ensure that use
=== "Inputs"
- | Required | Name | Type |Description |
- |:--------:|:--------------|:--------------|:-----------|
- | * | `queue-names` | List | to be burged queues names |
+ | Required | Name | Type | Description |
+ |:--------:|:--------------|:--------------|:-----------------------------|
+ | * | `target` | String | The AMQP service name to use |
+ | * | `queue-names` | List | queues names to be purged |
=== "Output"
No output
@@ -214,11 +218,12 @@ Use this action to create a temporary queue and bind it to an existing exchange
=== "Inputs"
- | Required | Name | Type | Default | Description |
- |:--------:|:----------------|:-------|:------------:|:-----------------|
- | * | `exchange-name` | String | | Exchange name |
- | | `routing-key` | String | "queue-name" | The routing key to use for the binding. See this [example](https://www.rabbitmq.com/tutorials/tutorial-five-python.html#:~:text=complex%20topic%20exchange.-,Topic%20exchange,-Messages%20sent%20to){:target=_blank} for more details. |
- | * | `queue-name` | String | | Queue name |
+ | Required | Name | Type | Default | Description |
+ |:--------:|:----------------|:-------|:------------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+ | * | `target` | String | | The AMQP service name to use |
+ | * | `exchange-name` | String | | Exchange name |
+ | | `routing-key` | String | "queue-name" | The routing key to use for the binding. See this [example](https://www.rabbitmq.com/tutorials/tutorial-five-python.html#:~:text=complex%20topic%20exchange.-,Topic%20exchange,-Messages%20sent%20to){:target=_blank} for more details. |
+ | * | `queue-name` | String | | Queue name |
=== "Outputs"
@@ -249,23 +254,24 @@ Use this action to delete a binding between exchange and queue.
=== "Inputs"
- | Required | Name | Type | Description |
- |:--------:|:----------------|:-------|:-----------------|
- | * | `queue-name` | String | Queue name |
- | | `exchange-name` | String | Exchange name |
- | | `routing-key` | String | The routing key used for the binding. |
+ | Required | Name | Type | Description |
+ |:--------:|:----------------|:-------|:--------------------------------------|
+ | * | `target` | String | The AMQP service name to use |
+ | * | `queue-name` | String | Queue name |
+ | | `exchange-name` | String | Exchange name |
+ | | `routing-key` | String | The routing key used for the binding. |
### Example
=== "Kotlin"
-``` kotlin
-AmqpUnbindQueueAction(
-target = "RABBITMQ_TARGET",
-queueName = "my.queue",
-exchangeName = "my.exchange",
-routingKey = "children.*"
-)
-```
+ ``` kotlin
+ AmqpUnbindQueueAction(
+ target = "RABBITMQ_TARGET",
+ queueName = "my.queue",
+ exchangeName = "my.exchange",
+ routingKey = "children.*"
+ )
+ ```
# Delete queue
!!! info "[Browse implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/amqp/AmqpDeleteQueueAction.java){:target="_blank"}"
@@ -273,9 +279,10 @@ routingKey = "children.*"
Use this action to delete an existing queue without regard for whether it is in use or has messages on it.
=== "Inputs"
- | Required | Name | Type | Description |
- |:--------:|:-----------|:-------|:------------|
- | * | queue-name | String | Queue name |
+ | Required | Name | Type | Description |
+ |:--------:|:-------------|:-------|:-----------------------------|
+ | * | `target` | String | The AMQP service name to use |
+ | * | `queue-name` | String | Queue name |
=== "Outputs"
No output
diff --git a/docs/docs/documentation/actions/assertions.md b/docs/docs/documentation/actions/assertions.md
index dbcf27a1b..c6f5c452f 100644
--- a/docs/docs/documentation/actions/assertions.md
+++ b/docs/docs/documentation/actions/assertions.md
@@ -18,18 +18,26 @@
- [Compare](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/assertion/CompareAction.java){:target="_blank"}
- [JSON Compare](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/assertion/JsonCompareAction.java){:target="_blank"}
+An assertion is a special case of action in Chutney :
+
+* It does not make use of external services (see [target](/documentation/environment.md/#target)).
+* It does not have outputs as two only outcomes could happen : pass or fail.
+* It should not have [validations](/documentation/actions/introduction.md/#validations) included as it is a validation in itself.
+
# Assertions
## Assert
!!! info "[Browse implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/assertion/AssertAction.java){:target="_blank"}"
-This action takes a list of assertions written using [SpEL](https://docs.spring.io/spring-framework/reference/core/expressions/language-ref.html){:target="_blank"} and validates they are all true.
+!!! tip "This action could be replaced by a direct [validation](/documentation/actions/introduction.md/#validations)"
+
+This action takes a list of assertions evaluated to boolean using [expressions](/documentation/actions/introduction.md/#expressions) and validates they are all true.
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:----------------|:------------|:----------------|
- | * | `asserts` | List of Map | |
+ | Required | Name | Type | Default |
+ |:--------:|:----------|:--------------------------------------|:--------|
+ | * | `asserts` | List of List\> | |
=== "Outputs"
No outputs
@@ -52,10 +60,10 @@ Asserts that JSON nodes have expected values.
=== "Inputs"
- | Required | Name | Type | Default | Description |
- |:--------:|:----------------|:--------------------|:----------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
- | * | `document` | String | | json's string representation |
- | * | `expected` | Map | | Keys contain [json paths](https://github.com/json-path/JsonPath){:target="_blank"} used to extract json node's data. Values contain expected nodes values or [assertions functions](#assertions-functions). |
+ | Required | Name | Type | Default | Description |
+ |:--------:|:-----------|:---------------------|:--------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+ | * | `document` | String | | json's string representation |
+ | * | `expected` | Map | | Keys contain [json paths](https://github.com/json-path/JsonPath){:target="_blank"} used to extract json node's data. Values contain expected nodes values or [assertions functions](#assertions-functions). |
=== "Outputs"
No outputs
@@ -85,10 +93,10 @@ Asserts that XML nodes have expected values.
=== "Inputs"
- | Required | Name | Type | Default | Description |
- |:--------:|:----------------|:------------|:----------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
- | * | `document` | String | | xml's string representation |
- | * | `expected` | Map | | keys contain [xml paths](https://www.w3schools.com/xml/xml_xpath.asp){:target="_blank"} used to extract xml node's data. Values contain expected nodes values or [assertions functions](#assertions-functions). |
+ | Required | Name | Type | Default | Description |
+ |:--------:|:-----------|:---------------------|:--------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+ | * | `document` | String | | xml's string representation |
+ | * | `expected` | Map | | keys contain [xml paths](https://www.w3schools.com/xml/xml_xpath.asp){:target="_blank"} used to extract xml node's data. Values contain expected nodes values or [assertions functions](#assertions-functions). |
=== "Outputs"
No outputs
@@ -118,8 +126,8 @@ Asserts that XML nodes have expected values.
Placeholders used by [xml-assert](#xml-assert) and [json-assert](#json-assert) actions to assert actual values.
-| Placeholder | Description | Example |
-|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------|:---------------------------------------------------|
+| Placeholder | Description | Example |
+|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------|:---------------------------------------------------|
| [`$isNull`](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/assertion/placeholder/IsNullAsserter.java){:target="_blank"} | must be null | `"$isNull"` |
| [`$isNotNull`](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/assertion/placeholder/NotNullAsserter.java){:target="_blank"} | must be not null | `"$isNotNull"` |
| [`$contains`](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/assertion/placeholder/ContainsAsserter.java){:target="_blank"} | must contains given value | `"$contains:abcde"` |
@@ -138,7 +146,7 @@ Placeholders used by [xml-assert](#xml-assert) and [json-assert](#json-assert) a
!!! Step validation
For functional validations, it's recommended to use above actions.
- For technical validations, it's possible to do them on scenario step [validation](/documentation/actions/introduction.md/#validation).
+ For technical validations, it's possible to do them on scenario step [validation](/documentation/actions/introduction.md/#validations).
## Json validation
@@ -327,12 +335,12 @@ Compares two JSON inputs (the whole content or only some nodes) using a comparis
=== "Inputs"
- | Required | Name | Type | Default | Description |
- |:--------:|:----------------|:------------|:-----------------|:--------------------------------------------------------------------------------------------|
- | * | `document1` | String | | first json |
- | * | `document2` | String | | second json |
- | * | `comparingPaths`| Map | Map.of("$", "$") | to be compared nodes [json paths](https://github.com/json-path/JsonPath){:target="_blank"} |
- | * | `mode` | String | STRICT | comparison mode |
+ | Required | Name | Type | Default | Description |
+ |:--------:|:-----------------|:---------------------|:-----------------|:-------------------------------------------------------------------------------------------|
+ | * | `document1` | String | | first json |
+ | * | `document2` | String | | second json |
+ | * | `comparingPaths` | Map | Map.of("$", "$") | to be compared nodes [json paths](https://github.com/json-path/JsonPath){:target="_blank"} |
+ | * | `mode` | String | STRICT | comparison mode |
=== "Outputs"
No outputs
diff --git a/docs/docs/documentation/actions/context.md b/docs/docs/documentation/actions/context.md
new file mode 100644
index 000000000..b94093f9e
--- /dev/null
+++ b/docs/docs/documentation/actions/context.md
@@ -0,0 +1,172 @@
+
+
+??? info "Browse implementations"
+
+ - [Context Put](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/context/ContextPutAction.java){:target="_blank}
+ - [Debug](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/context/DebugAction.java){:target="_blank"}
+ - [Sleep](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/context/SleepAction.java){:target="_blank"}
+ - [Final](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/context/FinalAction.java){:target="_blank"}
+ - [Fail](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/context/FailAction.java){:target="_blank"}
+ - [Success](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/context/SuccessAction.java){:target="_blank"}
+
+
+A context action is a special case of action in Chutney, providing technical support :
+
+* It does not make use of external services (see [target](/documentation/environment.md/#target)).
+* It does not define outputs.
+* It should not have [validations](/documentation/actions/introduction.md/#validations) included.
+
+# Context Put
+
+!!! info "[Browse implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/context/ContextPutAction.java){:target="_blank"}"
+
+Take a list of named values and put them into the execution context (i.e. create a variable for scenario [expressions](/documentation/actions/introduction.md/#expressions)).
+=== "Inputs"
+
+ | Required | Name | Type | Default |
+ |:--------:|:----------|:-------------------------|:--------|
+ | * | `entries` | Map of | |
+
+=== "Outputs"
+ No outputs
+
+### Example
+=== "Kotlin"
+ ``` kotlin
+ ContextPutAction(
+ entries = mapOf(
+ "startDate" to "now().toInstant()".spEL(),
+ "isoFormatter" to "isoDateFormatter('instant')".spEL(),
+ "uuid" to "generate().uuid()".spEL()
+ )
+ )
+ ```
+
+# Debug
+
+!!! info "[Browse implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/context/DebugAction.java){:target="_blank"}"
+
+Log the execution context variables.
+
+=== "Inputs"
+
+ | Required | Name | Type | Default | Description |
+ |:--------:|:----------|:--------------|:--------|:-----------------------------------------------|
+ | * | `filters` | List | | List of strings that logged keys must contains |
+
+=== "Outputs"
+ No outputs
+
+### Example
+=== "Kotlin"
+ ``` kotlin
+ DebugAction(
+ filters = listOf("date")
+ )
+ ```
+
+# Sleep
+
+!!! info "[Browse implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/context/SleepAction.java){:target="_blank"}"
+
+Wait for a given time.
+
+=== "Inputs"
+
+ | Required | Name | Type | Default | Description |
+ |:--------:|:-----------|:--------------------------------------------------------------------|:--------|:---------------------|
+ | * | `duration` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | | The time to wait for |
+
+=== "Outputs"
+ No outputs
+
+### Example
+=== "Kotlin"
+ ``` kotlin
+ SleepAction(
+ duration = "5 sec"
+ )
+ ```
+
+# Final
+
+!!! info "[Browse implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/context/FinalAction.java){:target="_blank"}"
+
+Define a [teardown](/documentation/actions/introduction.md/#teardown) action, which will be executed at the end of scenario execution.
+
+=== "Inputs"
+
+ | Required | Name | Type | Default | Description |
+ |:--------:|:----------------------|:---------------------|:--------|:--------------------------------------|
+ | * | `type` | String | | The action type |
+ | * | `name` | String | | The name of the teardown action step |
+ | | `inputs` | Map | | The inputs to use |
+ | | `validations` | Map | | The validations to execute |
+ | | `strategy-type` | String | | The type of strategy to use |
+ | | `strategy-properties` | Map | | The properties of the strategy to use |
+
+=== "Outputs"
+ No outputs
+
+### Example
+=== "Kotlin"
+ ``` kotlin
+ FinalAction(
+ name = "Assert time passes...",
+ type = "sleep",
+ inputs = mapOf(
+ "duration" to "500 ms"
+ ),
+ strategyType = "retry-with-timeout",
+ strategyProperties = mapOf(
+ "timeOut" to "3 s",
+ "retryDelay" to "1 s"
+ ),
+ validations = mapOf(
+ "date is past" to "now().isAfter(#dateToPass)".spEL()
+ )
+ )
+ ```
+
+# Fail
+
+!!! info "[Browse implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/context/FailAction.java){:target="_blank"}"
+
+Just fail.
+
+=== "Inputs"
+ No inputs
+
+=== "Outputs"
+ No outputs
+
+
+### Example
+=== "Kotlin"
+ ``` kotlin
+ FailAction()
+ ```
+
+# Success
+
+!!! info "[Browse implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/context/SuccessAction.java){:target="_blank"}"
+
+Just pass.
+
+=== "Inputs"
+ No inputs
+
+=== "Outputs"
+ No outputs
+
+
+### Example
+=== "Kotlin"
+ ``` kotlin
+ SuccessAction()
+ ```
diff --git a/docs/docs/documentation/actions/groovy.md b/docs/docs/documentation/actions/groovy.md
index 0b07aa3bb..5389b7aba 100644
--- a/docs/docs/documentation/actions/groovy.md
+++ b/docs/docs/documentation/actions/groovy.md
@@ -11,17 +11,17 @@ This action executes a [Groovy](https://groovy-lang.org/documentation.html){:tar
=== "Inputs"
- | Required | Name | Type | Default | Description |
- |:--------:|:----------------|:-------------------------|:----------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
- | * | `script` | String | | The groovy script to be executed. The last statement must return a Map either implicitly or explicitly. For a script that just launch background execution, an empty map ([:]) must be the last statement. |
- | | `parameters` | Map | | Key/values parameters to be used in the script |
+ | Required | Name | Type | Default | Description |
+ |:--------:|:-------------|:----------------------|:--------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+ | * | `script` | String | | The groovy script to be executed. The last statement must return a Map either implicitly or explicitly. For a script that just launch background execution, an empty map ([:]) must be the last statement. |
+ | | `parameters` | Map | | Key/values parameters to be used in the script |
=== "Outputs"
- | Name | Type | Description |
- |:----------------|:-------------------------------|:---------------------------------------------------------------|
- | `status` | Status enum (Success, Failure) | Execution status of the groovy task |
- | `outputs` | Map | The map returned by the last statement of the executed script. |
+ | Name | Type | Description |
+ |:----------|:-------------------------------|:---------------------------------------------------------------|
+ | `status` | Status enum (Success, Failure) | Execution status of the groovy task |
+ | `outputs` | Map | The map returned by the last statement of the executed script. |
Example:
=== "Kotlin"
diff --git a/docs/docs/documentation/actions/http.md b/docs/docs/documentation/actions/http.md
index 6c44db6b3..b332c8916 100644
--- a/docs/docs/documentation/actions/http.md
+++ b/docs/docs/documentation/actions/http.md
@@ -60,19 +60,19 @@
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:----------|:-----------------------------------------------------------------|:---------:|
- | * | `target` | String | |
- | * | `uri` | String | |
- | | `headers` | Map | |
- | | `timeout` | [Duration](/documentation/actions/other.md/#duration-type) (String) | "2000 ms" |
+ | Required | Name | Type | Default |
+ |:--------:|:----------|:---------------------------------------------------------------------------|:---------:|
+ | * | `target` | String | |
+ | * | `uri` | String | |
+ | | `headers` | Map | |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | "2000 ms" |
=== "Outputs"
| Name | Type |
- |:---------:|:--------------------------------------------------------------------------------------------------------------------------------------------|
+ |----------:|:--------------------------------------------------------------------------------------------------------------------------------------------|
| `status` | int |
- | `body` | String |
+ | `body` | String |
| `headers` | [HttpHeaders](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpHeaders.html){:target="_blank"} |
### Example
@@ -94,13 +94,13 @@
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:----------|:-----------------------------------------------------------------|:----------:|
- | * | `target` | String | |
- | * | `uri` | String | |
- | | `body` | String | `{}` |
- | | `headers` | Map | |
- | | `timeout` | [Duration](/documentation/actions/other.md/#duration-type) (String) | "2000 ms" |
+ | Required | Name | Type | Default |
+ |:--------:|:----------|:---------------------------------------------------------------------------|:---------:|
+ | * | `target` | String | |
+ | * | `uri` | String | |
+ | | `body` | String | `{}` |
+ | | `headers` | Map | |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | "2000 ms" |
=== "Outputs"
@@ -129,13 +129,13 @@
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:----------|:-----------------------------------------------------------------|:----------:|
- | * | `target` | String | |
- | * | `uri` | String | |
- | | `body` | String | `{}` |
- | | `headers` | Map | |
- | | `timeout` | [Duration](/documentation/actions/other.md/#duration-type) (String) | "2000 ms" |
+ | Required | Name | Type | Default |
+ |:--------:|:----------|:---------------------------------------------------------------------------|:---------:|
+ | * | `target` | String | |
+ | * | `uri` | String | |
+ | | `body` | String | `{}` |
+ | | `headers` | Map | |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | "2000 ms" |
=== "Outputs"
@@ -164,12 +164,12 @@
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:----------|:-----------------------------------------------------------------|:----------:|
- | * | `target` | String | |
- | * | `uri` | String | |
- | | `headers` | Map | |
- | | `timeout` | [Duration](/documentation/actions/other.md/#duration-type) (String) | "2000 ms" |
+ | Required | Name | Type | Default |
+ |:--------:|:----------|:---------------------------------------------------------------------------|:---------:|
+ | * | `target` | String | |
+ | * | `uri` | String | |
+ | | `headers` | Map | |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | "2000 ms" |
=== "Outputs"
@@ -198,13 +198,13 @@
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:----------|:-----------------------------------------------------------------|:----------:|
- | * | `target` | String | |
- | * | `uri` | String | |
- | | `body` | String | `{}` |
- | | `headers` | Map | |
- | | `timeout` | [Duration](/documentation/actions/other.md/#duration-type) (String) | "2000 ms" |
+ | Required | Name | Type | Default |
+ |:--------:|:----------|:---------------------------------------------------------------------------|:---------:|
+ | * | `target` | String | |
+ | * | `uri` | String | |
+ | | `body` | String | `{}` |
+ | | `headers` | Map | |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | "2000 ms" |
=== "Outputs"
diff --git a/docs/docs/documentation/actions/introduction.md b/docs/docs/documentation/actions/introduction.md
index 853632a40..adc3a158b 100644
--- a/docs/docs/documentation/actions/introduction.md
+++ b/docs/docs/documentation/actions/introduction.md
@@ -26,9 +26,11 @@ All actions are structured the same way with **inputs**, **outputs**, **validati
# Inputs
Inputs are the minimum information needed to run the action.
-For example, if you want to perform an HTTP GET request, you should give, at least, the targeted service and an URI.
+For example, if you want to perform an HTTP GET request, you should give, at least, the targeted service and a URI.
Obviously, you should be familiar with the technology behind each action you use, and we stick to the proper vocabulary (i.e. _body_ for HTTP, _payload_ for Kafka etc.)
+In order to use some existing context variables as inputs, you need to use an [expression](#expressions) and Chutney [functions](/documentation/functions/introduction.md), so we recommend you to read about them for further details.
+
!!! note
* Some input values are required and checked for correctness. While other values might not be required, or we provide a default value.
@@ -37,7 +39,25 @@ Obviously, you should be familiar with the technology behind each action you use
Please, refer to actions' configuration for further details.
* All actions must have a [Logger](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-spi/src/main/java/com/chutneytesting/action/spi/injectable/Logger.java){:target=_blank} class as input. At runtime a [DelagateLogger](https://github.com/Enedis-OSS/chutney/blob/main/chutney/engine/src/main/java/com/chutneytesting/engine/domain/execution/engine/parameterResolver/DelegateLogger.java){:target=_blank} is automatically injected by the execution engine.
- This logger contains action's logs which be present in the execution report.
+ This logger contains action's logs which be present in the execution report.
+
+??? info "Special inputs types"
+
+ * **Duration Type**
+
+ Sometimes, Action input is a String of type Duration.
+ Expected format is ` `.
+ `unit` values are :
+
+ * "nanos", "ns"
+ * "micros", "µs"
+ * "millis", "ms"
+ * "seconds", "s", "sec"
+ * "minutes", "m", "min"
+ * "hours", "h", "hour", "hours", "hour(s)"
+ * "days", "d", "day", "days", "day(s)"
+
+ **Examples** : "5 min", "300 sec", "1 day"
# Outputs
@@ -45,7 +65,7 @@ Outputs contain the data collected after performing an action, and only if it su
These data are set in the execution context and can be accessed and used later in another action.
Each action provide a set of default outputs. But they are generic and may contain much more information than what you actually need.
-In order to process them, you need to use an [expression](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#expressions) and Chutney [functions](/documentation/functions/introduction.md), so we recommend you to read about them for further details.
+In order to process them, you need to use an [expression](#expressions) and Chutney [functions](/documentation/functions/introduction.md), so we recommend you to read about them for further details.
!!! note
The execution context holds outputs in a key/value map, where the key is a string and the value is typed.
@@ -95,7 +115,7 @@ After executing this action, the execution context will contain the following ou
Your relevant data can be accessed from another SpEL using `#bestMovies` and since it is a List you can call methods on it, like so : `${#bestMovies.get(0)}`
`#body`, `#status` and `#headers` are also available but are very likely to be overridden by a following step while you have full control over the use of the `#bestMovies` key.
-# Validation
+# Validations
Validations are a list of checks you want to perform in order to validate a step.
By default, a step will _fail_ when an error occurs, but we cannot verify the semantic of the result.
@@ -104,7 +124,7 @@ Asserting a step depends on your feature and requirements.
For example, if an HTTP GET request returns a status code 500, the step is _technically_ complete and succeed.
But, you may want to fail the step if the status is different from 200.
-Each validation has a name and evaluates to a boolean, using [expressions](/common/coming_soon.md) and [functions](/common/coming_soon.md).
+Each validation has a name and evaluates to a boolean, using [expressions](#expressions) and [functions](/documentation/functions/introduction.md).
=== "Kotlin"
@@ -190,3 +210,8 @@ Step("Insert data in a table") { // (1)
1. This is a wrapper step
2. We declare our final action **first** !
3. We declare our real action after
+
+# Expressions
+
+Chutney expressions come from [Spring EL](https://docs.spring.io/spring-framework/reference/core/expressions.html){:target="_blank"}.
+The Chutney execution context is the evaluation context of **inputs**, **outputs** and **validations** expressions.
diff --git a/docs/docs/documentation/actions/jms.md b/docs/docs/documentation/actions/jms.md
index 3f5409b64..c6a7577b1 100644
--- a/docs/docs/documentation/actions/jms.md
+++ b/docs/docs/documentation/actions/jms.md
@@ -7,11 +7,19 @@
??? info "Browse implementations"
- - [Sender](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jms/JmsSenderAction.java){:target="_blank"}
- - [Listener](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jms/JmsListenerAction.java){:target="_blank"}
- - [Clean queue](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jms/JmsCleanQueueAction.java){:target="_blank"}
+ === "JMS"
-!!! note "Define a jms target"
+ - [Sender](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jms/JmsSenderAction.java){:target="_blank"}
+ - [Listener](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jms/JmsListenerAction.java){:target="_blank"}
+ - [Clean queue](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jms/JmsCleanQueueAction.java){:target="_blank"}
+
+ === "Jakarta"
+
+ - [Sender](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jakarta/JakartaSenderAction.java){:target="_blank"}
+ - [Listener](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jakarta/JakartaListenerAction.java){:target="_blank"}
+ - [Clean queue](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jakarta/JakartaCleanQueueAction.java){:target="_blank"}
+
+!!! note "Define a jms or jakarta target"
* Default `connectionFactoryName` is `ConnectionFactory`
* To configure ssl, by default we add these properties in InitialContext :
@@ -25,12 +33,12 @@
In order to provide more configuration, you should prefix all other target properties with `jndi.`.
By example, if you want to add `com.specific.vendor.properties` key, the key should be `jndi.com.specific.vendor.properties`
-```json title="Jms target example"
+```json title="Jms/Jakarta target example"
{
"name": "JMS_TARGET",
"url": "ssl://my.jms.server:61616",
"properties": {
- "connectionFactoryName": "MyConnectionFactory"
+ "connectionFactoryName": "MyConnectionFactory",
"java.naming.factory.initial": "org.apache.activemq.jndi.ActiveMQInitialContextFactory",
"username": "myUsername", // (1)
@@ -39,7 +47,7 @@
"trustStorePassword": "myTrustStorePassword",
"keyStore": "/home/APP/security/mykeyStore.jks",
"keyStorePassword": "mykeyStorePassword",
- "keyPassword": "myKeyStoreKeyPassword",
+ "keyPassword": "myKeyStoreKeyPassword"
}
}
```
@@ -47,8 +55,9 @@
1. Valid properties are `username` or `user`. Set this for basic authentication
2. Valid properties are `userPassword` or `password`. Set this for basic authentication
-# Jms Sender
-!!! info "[Browse implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jms/JmsSenderAction.java){:target="_blank"}"
+# Sender
+
+!!! info "Browse [JMS](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jms/JmsSenderAction.java){:target="_blank"} or [Jakarta](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jakarta/JakartaSenderAction.java){:target="_blank"} implementation"
=== "Inputs"
@@ -59,40 +68,52 @@
| * | `body` | String | |
| | `headers` | Map | |
-No output. Only a log in report if message was successfully sent
+=== "Outputs"
+ No output. Only a log in report if message was successfully sent
### Example
-=== "Kotlin"
-``` kotlin
-JmsSenderAction(
- target = "JMS_TARGET",
- destination = "jms/domain/my/queue",
- body = "my text body"
- attributes = mapOf(
- "jms.MyProperty" to "some value"
+=== "JMS"
+ ``` kotlin
+ JmsSenderAction(
+ target = "JMS_TARGET",
+ destination = "jms/domain/my/queue",
+ body = "my text body"
+ attributes = mapOf(
+ "jms.MyProperty" to "some value"
+ )
)
-)
-```
+ ```
+=== "Jakarta"
+ ``` kotlin
+ JakartaSenderAction(
+ target = "JMS_TARGET",
+ destination = "jms/domain/my/queue",
+ body = "my text body"
+ attributes = mapOf(
+ "jms.MyProperty" to "some value"
+ )
+ )
+ ```
-# Jms Listener
-!!! info "[Browse implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jms/JmsListenerAction.java){:target="_blank"}"
+# Listener
+!!! info "Browse [JMS](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jms/JmsListenerAction.java){:target="_blank"} or [Jakarta](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jakarta/JakartaListenerAction.java){:target="_blank"} implementation"
-* **Only works on javax.jms.TextMessage**
-* `selector` used as message filter in [createConsumer](https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createConsumer-javax.jms.Destination-java.lang.String-){:target="_blank"} or in [createBrowser](https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createBrowser-javax.jms.Queue-java.lang.String-){:target="_blank"}
+* **Only works on TextMessage**
+* `selector` used as message filter in **createConsumer** ([JMS](https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createConsumer-javax.jms.Destination-java.lang.String-){:target="_blank"} / [Jakarta](https://jakarta.ee/specifications/messaging/3.1/apidocs/jakarta.messaging/jakarta/jms/session#createConsumer(jakarta.jms.Destination,java.lang.String)){:target="_blank"}) or in **createBrowser** ([JMS](https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createBrowser-javax.jms.Queue-java.lang.String-){:target="_blank"} / [Jakarta](https://jakarta.ee/specifications/messaging/3.1/apidocs/jakarta.messaging/jakarta/jms/session#createBrowser(jakarta.jms.Queue,java.lang.String)){:target="_blank"})
* `bodySelector` verify in `browserMaxDepth` messages on the queue if it contains `bodySelector` characters
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:------------------|:--------|:----------:|
- | * | `target` | String | |
- | * | `destination` | String | |
- | | `selector` | String | |
- | | `bodySelector` | String | |
- | | `browserMaxDepth` | Integer | |
- | | `timeOut` | String | 500 ms |
+ | Required | Name | Type | Default |
+ |:--------:|:------------------|:---------------------------------------------------------------------------|:-------:|
+ | * | `target` | String | |
+ | * | `destination` | String | |
+ | | `selector` | String | |
+ | | `bodySelector` | String | |
+ | | `browserMaxDepth` | Integer | |
+ | | `timeOut` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | 500 ms |
=== "Outputs"
@@ -103,48 +124,69 @@ JmsSenderAction(
### Example
-=== "Kotlin"
-``` kotlin
-JmsListenerAction(
- target = "JMS_TARGET",
- destination = "jms/domain/my/queue",
- selector = "type = 'boat' AND color = 'red'",
- bodySelector = "some value to search in message",
- browserMaxDepth = 100,
- timeOut = "1 s"
-)
-```
+=== "JMS"
+ ``` kotlin
+ JmsListenerAction(
+ target = "JMS_TARGET",
+ destination = "jms/domain/my/queue",
+ selector = "type = 'boat' AND color = 'red'",
+ bodySelector = "some value to search in message",
+ browserMaxDepth = 100,
+ timeOut = "1 s"
+ )
+ ```
+=== "Jakarta"
+ ``` kotlin
+ JakartaListenerAction(
+ target = "JMS_TARGET",
+ destination = "jms/domain/my/queue",
+ selector = "type = 'boat' AND color = 'red'",
+ bodySelector = "some value to search in message",
+ browserMaxDepth = 100,
+ timeOut = "1 s"
+ )
+ ```
-# Jms Clean Queue
-!!! info "[Browse implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jms/JmsCleanQueueAction.java){:target="_blank"}"
+# Clean Queue
+!!! info "Browse [JMS](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jms/JmsCleanQueueAction.java){:target="_blank"} or [Jakarta](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/jakarta/JakartaCleanQueueAction.java){:target="_blank"} implementation"
-* **Only works on javax.jms.TextMessage**
-* `selector` used as message filter in [createConsumer](https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createConsumer-javax.jms.Destination-java.lang.String-){:target="_blank"} or in [createBrowser](https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createBrowser-javax.jms.Queue-java.lang.String-){:target="_blank"}
-* `bodySelector` verify in `browserMaxDepth` messages on the queue if it contains `bodySelector` characters **(only works on javax.jms.TextMessage)**
+* `selector` used as message filter in **createConsumer** ([JMS](https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createConsumer-javax.jms.Destination-java.lang.String-){:target="_blank"} / [Jakarta](https://jakarta.ee/specifications/messaging/3.1/apidocs/jakarta.messaging/jakarta/jms/session#createConsumer(jakarta.jms.Destination,java.lang.String)){:target="_blank"}) or in **createBrowser** ([JMS](https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createBrowser-javax.jms.Queue-java.lang.String-){:target="_blank"} / [Jakarta](https://jakarta.ee/specifications/messaging/3.1/apidocs/jakarta.messaging/jakarta/jms/session#createBrowser(jakarta.jms.Queue,java.lang.String)){:target="_blank"})
+* `bodySelector` verify in `browserMaxDepth` messages on the queue if it contains `bodySelector` characters **(only works on TextMessage)**
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:------------------|:-------------|:----------:|
- | * | `target` | String | |
- | * | `destination` | String | |
- | | `selector` | String | |
- | | `bodySelector` | String | |
- | | `browserMaxDepth` | Integer | |
- | | `timeOut` | String | 500 ms |
+ | Required | Name | Type | Default |
+ |:--------:|:------------------|:---------------------------------------------------------------------------|:-------:|
+ | * | `target` | String | |
+ | * | `destination` | String | |
+ | | `selector` | String | |
+ | | `bodySelector` | String | |
+ | | `browserMaxDepth` | Integer | |
+ | | `timeOut` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | 500 ms |
No output. Only a log in report with number of messages removed
### Example
-=== "Kotlin"
-``` kotlin
-JmsCleanQueueAction(
- target = "JMS_TARGET",
- destination = "jms/domain/my/queue",
- selector = "type = 'boat' AND color = 'red'",
- bodySelector = "some value to search in message",
- browserMaxDepth = 100,
- timeOut = "1 s"
-)
-```
+=== "JMS"
+ ``` kotlin
+ JmsCleanQueueAction(
+ target = "JMS_TARGET",
+ destination = "jms/domain/my/queue",
+ selector = "type = 'boat' AND color = 'red'",
+ bodySelector = "some value to search in message",
+ browserMaxDepth = 100,
+ timeOut = "1 s"
+ )
+ ```
+=== "Jakarta"
+ ``` kotlin
+ JakartaCleanQueueAction(
+ target = "JMS_TARGET",
+ destination = "jms/domain/my/queue",
+ selector = "type = 'boat' AND color = 'red'",
+ bodySelector = "some value to search in message",
+ browserMaxDepth = 100,
+ timeOut = "1 s"
+ )
+ ```
diff --git a/docs/docs/documentation/actions/kafka.md b/docs/docs/documentation/actions/kafka.md
index ee60caaac..9ff7a3a7d 100644
--- a/docs/docs/documentation/actions/kafka.md
+++ b/docs/docs/documentation/actions/kafka.md
@@ -66,20 +66,21 @@ Use this action to publish a message to a Kafka topic.
=== "Inputs"
- | Required | Name | Type | Description |
- |:--------:|:-------------|:---------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
- | * | `target` | String | Kafka target name |
- | * | `topic` | String | Topic where the message will be published |
- | * | `headers` | Map | Headers to be sent with the request |
- | * | `payload` | String | Message to be published |
- | | `properties` | Map | [Configurations](https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/ProducerConfig.java#:~:text=CONFIG%20%3D%20new,TRANSACTIONAL_ID_DOC){:target="_blank"} for Kafka producer. |
+ | Required | Name | Type | Description |
+ |:--------:|:-------------|:----------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+ | * | `target` | String | Kafka target name |
+ | * | `topic` | String | Topic where the message will be published |
+ | * | `headers` | Map | Headers to be sent with the request |
+ | * | `payload` | String | Message to be published |
+ | | `properties` | Map | [Configurations](https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/ProducerConfig.java#:~:text=CONFIG%20%3D%20new,TRANSACTIONAL_ID_DOC){:target="_blank"} for Kafka producer |
+ | | `key` | String | The key that will be included in the record |
=== "Outputs"
| Name | Type | Description |
|:----------|:---------|:--------------------------------------|
| `payload` | String | Sent message |
- | `headers` | String | Headers to be sent with the request |
+ | `headers` | String | Headers sent with the request |
### Example
@@ -119,8 +120,9 @@ Use this action to consume a message from a Kafka topic.
| | `selector` | String | | Consume only messages whose **headers** or **payload** match this selector. Selector must be [json paths](https://github.com/json-path/JsonPath){:target="_blank"} or [xml paths](https://www.w3schools.com/xml/xml_xpath.asp){:target="_blank"}. The root node is the whole message. |
| | `nb-messages` | Integer | 1 | How many messages to be consumed |
| | `content-type` | String | `application/json` | To be consumed message's content type |
- | | `timeout` | [Duration](/documentation/actions/other.md/#duration-type) | `60 sec` | Listening time on the topic |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | `60 sec` | Listening time on the topic |
| | `ackMode` | [AckMode](https://docs.spring.io/spring-kafka/api/org/springframework/kafka/listener/ContainerProperties.AckMode.html){:target="_blank"} | target's ackMode, else `BATCH` | The offset commit behavior |
+ | | `reset-offset` | Boolean | false | Consume from the first offset for each partitions |
=== "Outputs"
@@ -129,6 +131,7 @@ Use this action to consume a message from a Kafka topic.
| `body` | List\> | Consumed messages |
| `payloads` | List | Consumed messages payloads |
| `headers` | List | Consumed messages headers |
+ | `keys` | List | Consumed messages keys |
### Example
diff --git a/docs/docs/documentation/actions/micrometer.md b/docs/docs/documentation/actions/micrometer.md
index a7735cc37..85650c6c7 100644
--- a/docs/docs/documentation/actions/micrometer.md
+++ b/docs/docs/documentation/actions/micrometer.md
@@ -16,29 +16,28 @@
!!! note
Micrometer provides a static [global registry](https://micrometer.io/docs/concepts#_global_registry){:target=_blank}. This registry is used as default if no registry is given in action's inputs.
+
# Counter
!!! info "[Browse Implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/micrometer/MicrometerCounterAction.java){:target="_blank"}"
-Use this action to report
-a [count](https://micrometer.io/docs/concepts#_counters:~:text=9.-,Counters,-Counters%20report%20a){:target=_blank}
-metric.
+Use this action to report a [counter](https://micrometer.io/docs/concepts#_counters:~:text=9.-,Counters,-Counters%20report%20a){:target=_blank} metric.
=== "Inputs"
- | Required | Name | Type | Description |
- |:------------------------:|:-------------|:---------------------------------|:---------------------------------------------------------|
- | if `counter` is null | `name` | String | Counter name. |
- | if `name` is null | `counter` | [Counter](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/Counter.html){:target=_blank} | Counter instance. |
- | | `description`| String | Counter description |
- | | `unit` | String | Count [unit](https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/BaseUnits.java){:target=_blank} |
- | | `tags` | List | key,value list representing tags. A tag is a Key/value pair representing a dimension of a meter used to classify and drill into measurements. |
- | | `registry` | [MeterRegistry](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/MeterRegistry.html){:target=_blank} | Creates and manages your application's set of meters |
- | * | `increment` | Integer as String | Positive number by which the counter will be incremented. |
+ | Required | Name | Type | Description |
+ |:--------------------:|:--------------|:----------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+ | if `counter` is null | `name` | String | Counter name |
+ | if `name` is null | `counter` | [Counter](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/Counter.html){:target=_blank} | Counter instance |
+ | | `description` | String | Counter description |
+ | | `unit` | String | Count [unit](https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/BaseUnits.java){:target=_blank}|
+ | | `tags` | List | key,value list representing tags. A tag is a Key/value pair representing a dimension of a meter used to classify and drill into measurements |
+ | | `registry` | [MeterRegistry](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/MeterRegistry.html){:target=_blank} | Creates and manages your application's set of meters |
+ | * | `increment` | Integer as String | Positive number by which the counter will be incremented |
=== "Outputs"
- | Name | Type | Description |
+ | Name | Type | Description |
|:----------------------|:-----------------------------------------------------------------------------------------------------------------------------------|:------------------------|
| `micrometerCounter` | [Counter](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/Counter.html){:target=_blank} | The incremented counter |
@@ -66,16 +65,16 @@ Use this action to report a [gauge](https://micrometer.io/docs/concepts#_gauges)
=== "Inputs"
- | Required | Name | Type | Description |
- |:--------------------------:|:------------------|:--------------|:-----------------------------------------------------------|
- | * | `name` | String | Gauge name. |
- | | `description` | String | Gauge description |
- | if `gaugeFunction` is null | `gaugeObject` | Object | Gauge will return the current value of this object . |
- | if `gaugeObject` is null | `gaugeFunction` | String | Gauge function. |
- | | `unit` | String | Count [unit](https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/BaseUnits.java){:target=_blank} |
- | | `tags` | List | key,value list representing tags. A tag is a Key/value pair representing a dimension of a meter used to classify and drill into measurements. |
- | | `registry` | [MeterRegistry](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/MeterRegistry.html){:target=_blank} | Creates and manages your application's set of meters |
- | | `strongReference` | Boolean | Indicates that the gauge should maintain a strong reference on the object upon which its instantaneous value is determined. Default is False |
+ | Required | Name | Type | Description |
+ |:--------------------------:|:------------------|:----------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+ | * | `name` | String | Gauge name |
+ | | `description` | String | Gauge description |
+ | if `gaugeFunction` is null | `gaugeObject` | Object | Gauge will return the current value of this object |
+ | if `gaugeObject` is null | `gaugeFunction` | String | Gauge function |
+ | | `unit` | String | Count [unit](https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/BaseUnits.java){:target=_blank} |
+ | | `tags` | List | key,value list representing tags. A tag is a Key/value pair representing a dimension of a meter used to classify and drill into measurements. |
+ | | `registry` | [MeterRegistry](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/MeterRegistry.html){:target=_blank} | Creates and manages your application's set of meters |
+ | | `strongReference` | Boolean | Indicates that the gauge should maintain a strong reference on the object upon which its instantaneous value is determined. Default is False |
!!! info
1. GaugeObject is required and must be a Number, a Collection or a Map if no gaugeFunction supplied.
@@ -138,7 +137,7 @@ Use this action to report a [gauge](https://micrometer.io/docs/concepts#_gauges)
```
=== "only gaugeFunction"
- Supposing that we have class with a static methode that return an int.
+ Supposing that we have class with a static method that return an int.
``` java
public class MyClass {
@@ -175,27 +174,27 @@ metric.
=== "Inputs"
- | Required | Name | Type | Description |
- |:--------------------:|:-------------------------------|:---------------------------------|:---------------------------------------------------------|
- | if `timer` is null | `name` | String | Timer name. |
- | | `description` | String | Timer description |
- | | `tags` | List | key,value list representing tags. A tag is a Key/value pair representing a dimension of a meter used to classify and drill into measurements |
- | | `bufferLength` | Integer as String | Distribution statistic buffer length |
- | | `expiry` | [Duration](https://www.chutney-testing.com/documentation/actions/other.md/#duration-type) | Distribution statistic expiry |
- | | `maxValue` | [Duration](https://www.chutney-testing.com/documentation/actions/other.md/#duration-type) | Timer max duration |
- | | `minValue` | [Duration](https://www.chutney-testing.com/documentation/actions/other.md/#duration-type) | Timer min duration |
- | | `percentilePrecision` | Integer as String | Percentile precision |
- | | `publishPercentilesHistogram` | Boolean | Publish percentile histogram or not |
- | | `percentiles` | String | Comma separated list of doublepercentiles doubles |
- | | `sla` | String | Comma separated list of doublepercentiles doubles |
- | if `name` is null | `timer` | [Timer](https://micrometer.io/docs/concepts#_gauges:~:text=11.-,Timers,-Timers%20are%20intended){:target=_blank} | Timer instance. |
- | | `registry` | [MeterRegistry](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/MeterRegistry.html){:target=_blank} | Creates and manages your application's set of meters |
- | | `timeunit` | [TimeUnit](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/TimeUnit.html){:target=_blank} as String | Time unit |
- | | `record` | [Duration](https://www.chutney-testing.com/documentation/actions/other.md/#duration-type) | The timer will be updated by the record duration |
+ | Required | Name | Type | Description |
+ |:------------------:|:------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------|
+ | if `timer` is null | `name` | String | Timer name |
+ | | `description` | String | Timer description |
+ | | `tags` | List | key,value list representing tags. A tag is a Key/value pair representing a dimension of a meter used to classify and drill into measurements |
+ | | `bufferLength` | Integer as String | Distribution statistic buffer length |
+ | | `expiry` | [Duration](https://www.chutney-testing.com/documentation/actions/introduction.md/#duration-type) | Distribution statistic expiry |
+ | | `maxValue` | [Duration](https://www.chutney-testing.com/documentation/actions/introduction.md/#duration-type) | Timer max duration |
+ | | `minValue` | [Duration](https://www.chutney-testing.com/documentation/actions/introduction.md/#duration-type) | Timer min duration |
+ | | `percentilePrecision` | Integer as String | Percentile precision |
+ | | `publishPercentilesHistogram` | Boolean | Publish percentile histogram or not |
+ | | `percentiles` | String | Comma separated list of doublepercentiles doubles |
+ | | `sla` | String | Comma separated list of doublepercentiles doubles |
+ | if `name` is null | `timer` | [Timer](https://micrometer.io/docs/concepts#_gauges:~:text=11.-,Timers,-Timers%20are%20intended){:target=_blank} | Timer instance. |
+ | | `registry` | [MeterRegistry](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/MeterRegistry.html){:target=_blank} | Creates and manages your application's set of meters |
+ | | `timeunit` | [TimeUnit](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/TimeUnit.html){:target=_blank} as String | Time unit |
+ | | `record` | [Duration](https://www.chutney-testing.com/documentation/actions/introduction.md/#duration-type) | The timer will be updated by the record duration |
=== "Outputs"
- | Name | Type | Description |
+ | Name | Type | Description |
|:----------------------|:-----------------------------------------------------------------------------------------------------------------------------------|:------------------------|
| `micrometerTimer` | [Timer](https://www.javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/Timer.html){:target=_blank} | The timer |
@@ -219,15 +218,15 @@ Use this action to start a [Timer.Sample](https://www.javadoc.io/doc/io.micromet
=== "Inputs"
- | Required | Name | Type | Description |
- |:--------:|:-------------------------------|:---------------------------------|:---------------------------------------------------------|
- | | `registry` | [MeterRegistry](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/MeterRegistry.html){:target=_blank} | Creates and manages your application's set of meters |
+ | Required | Name | Type | Description |
+ |:--------:|:-----------|:----------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------|
+ | | `registry` | [MeterRegistry](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/MeterRegistry.html){:target=_blank} | Creates and manages your application's set of meters |
=== "Outputs"
- | Name | Type | Description |
- |:------------------------|:-----------------------------------------------------------------------------------------------------------------------------------|:------------------------|
- | `micrometerTimerSample` | [Timer.Sample](https://www.javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/Timer.Sample.html){:target=_blank} | The sample |
+ | Name | Type | Description |
+ |:------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------|:------------|
+ | `micrometerTimerSample` | [Timer.Sample](https://www.javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/Timer.Sample.html){:target=_blank} | The sample |
### Example
@@ -245,14 +244,15 @@ Use this action to stop a [Timer.Sample](https://www.javadoc.io/doc/io.micromete
=== "Inputs"
- | Required | Name | Type | Description |
- |:--------:|:-------------------------------|:---------------------------------|:---------------------------------------------------------|
- | * | `sample` | [Timer.Sample](https://www.javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/Timer.Sample.html){:target=_blank} | The previously started sample |
- | * | `timer` | [MeterRegistry](https://www.javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/Timer.Sample.html){:target=_blank} | Sample's duration will be recorded into this timer |
- | | `timeunit` | [TimeUnit](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/TimeUnit.html){:target=_blank} as String | Time unit. Default is SECONDS |
+ | Required | Name | Type | Description |
+ |:--------:|:-----------|:-------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------|
+ | * | `sample` | [Timer.Sample](https://www.javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/Timer.Sample.html){:target=_blank} | The previously started sample |
+ | * | `timer` | [MeterRegistry](https://www.javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/Timer.Sample.html){:target=_blank} | Sample's duration will be recorded into this timer |
+ | | `timeunit` | [TimeUnit](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/TimeUnit.html){:target=_blank} as String | Time unit. Default is SECONDS |
+
=== "Outputs"
- | Name | Type | Description |
+ | Name | Type | Description |
|:--------------------------------|:------------------------------------------------------------------------------------------------------------------|:-----------------------------|
| `micrometerTimerSampleDuration` | [Duration](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html){:target=_blank} | The sample recorded duration |
@@ -275,30 +275,30 @@ Use this action to report a [distribution summary](https://micrometer.io/docs/co
=== "Inputs"
- | Required | Name | Type | Description |
- |:-------------------------------------:|:-------------------------------|:---------------------------------|:---------------------------------------------------------|
- | if `distributionSummary` is null | `name` | String | Distrubution summary name. |
- | | `description` | String | Distrubution summary description |
- | | `tags` | List | Key,value list representing tags. A tag is a Key/value pair representing a dimension of a meter used to classify and drill into measurements |
- | | `bufferLength` | Integer as String | Distribution statistic buffer length |
- | | `expiry` | [Duration](https://www.chutney-testing.com/documentation/actions/other.md/#duration-type) | Distribution statistic expiry |
- | | `maxValue` | [Duration](https://www.chutney-testing.com/documentation/actions/other.md/#duration-type) | Distrubution max duration |
- | | `minValue` | [Duration](https://www.chutney-testing.com/documentation/actions/other.md/#duration-type) | Distrubution min duration |
- | | `percentilePrecision` | Integer as String | Percentile precision |
- | | `publishPercentilesHistogram` | Boolean | Publish percentile histogram or not |
- | | `percentiles` | String | Comma separated list of doublepercentiles doubles |
- | | `sla` | String | Comma separated list of doublepercentiles doubles |
- | | `scale` | Double as String | Scale value |
- | if `name` is null | `distributionSummary` | [DistributionSummary](https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/DistributionSummary.java){:target=_blank} | Distribution instance.|
- | | `registry` | [MeterRegistry](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/MeterRegistry.html){:target=_blank} | Creates and manages your application's set of meters |
- | | `timeunit` | [TimeUnit](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/TimeUnit.html){:target=_blank} as String | Time unit |
- | | `record` | Double as String | The distribution will be updated by the record value |
+ | Required | Name | Type | Description |
+ |:--------------------------------:|:------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------|
+ | if `distributionSummary` is null | `name` | String | Distrubution summary name. |
+ | | `description` | String | Distrubution summary description |
+ | | `tags` | List | Key,value list representing tags. A tag is a Key/value pair representing a dimension of a meter used to classify and drill into measurements |
+ | | `bufferLength` | Integer as String | Distribution statistic buffer length |
+ | | `expiry` | [Duration](https://www.chutney-testing.com/documentation/actions/introduction.md/#duration-type) | Distribution statistic expiry |
+ | | `maxValue` | [Duration](https://www.chutney-testing.com/documentation/actions/introduction.md/#duration-type) | Distrubution max duration |
+ | | `minValue` | [Duration](https://www.chutney-testing.com/documentation/actions/introduction.md/#duration-type) | Distrubution min duration |
+ | | `percentilePrecision` | Integer as String | Percentile precision |
+ | | `publishPercentilesHistogram` | Boolean | Publish percentile histogram or not |
+ | | `percentiles` | String | Comma separated list of doublepercentiles doubles |
+ | | `sla` | String | Comma separated list of doublepercentiles doubles |
+ | | `scale` | Double as String | Scale value |
+ | if `name` is null | `distributionSummary` | [DistributionSummary](https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/DistributionSummary.java){:target=_blank} | Distribution instance. |
+ | | `registry` | [MeterRegistry](https://javadoc.io/doc/io.micrometer/micrometer-core/latest/io/micrometer/core/instrument/MeterRegistry.html){:target=_blank} | Creates and manages your application's set of meters |
+ | | `timeunit` | [TimeUnit](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/TimeUnit.html){:target=_blank} as String | Time unit |
+ | | `record` | Double as String | The distribution will be updated by the record value |
=== "Outputs"
- | Name | Type | Description |
- |:----------------------|:-----------------------------------------------------------------------------------------------------------------------------------|:------------------------|
- | `micrometerSummary` | [DistributionSummary](https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/DistributionSummary.java){:target=_blank} | The distribution summary |
+ | Name | Type | Description |
+ |:--------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------|
+ | `micrometerSummary` | [DistributionSummary](https://github.com/micrometer-metrics/micrometer/blob/main/micrometer-core/src/main/java/io/micrometer/core/instrument/DistributionSummary.java){:target=_blank} | The distribution summary |
### Example
diff --git a/docs/docs/documentation/actions/mongo.md b/docs/docs/documentation/actions/mongo.md
index d48d579e9..e47dfbe07 100644
--- a/docs/docs/documentation/actions/mongo.md
+++ b/docs/docs/documentation/actions/mongo.md
@@ -200,6 +200,7 @@ MongoListAction(
!!! note
ArrayFilters are supported since MongoDB v3.5.12+ ([https://jira.mongodb.org/browse/SERVER-831](https://jira.mongodb.org/browse/SERVER-831){:target="_blank"})
+
=== "Outputs"
| Name | Type |
diff --git a/docs/docs/documentation/actions/other.md b/docs/docs/documentation/actions/other.md
deleted file mode 100644
index 9f9046396..000000000
--- a/docs/docs/documentation/actions/other.md
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-# Duration Type
-
-Sometimes, Action input is a String of type Duration.
-Expected format is ` `.
-`unit` values are :
-
-* "nanos", "ns"
-* "micros", "µs"
-* "millis", "ms"
-* "seconds", "s", "sec"
-* "minutes", "m", "min"
-* "hours", "h", "hour", "hours", "hour(s)"
-* "days", "d", "day", "days", "day(s)"
-
-**Examples** : "5 min", "300 sec", "1 day"
diff --git a/docs/docs/documentation/actions/selenium.md b/docs/docs/documentation/actions/selenium.md
index d94a663bb..d0175f7fc 100644
--- a/docs/docs/documentation/actions/selenium.md
+++ b/docs/docs/documentation/actions/selenium.md
@@ -106,7 +106,7 @@ See [WebDriver.close()](https://www.selenium.dev/selenium/docs/api/java/org/open
!!! info "[Browse Implementation](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/selenium/SeleniumDriverInitAction.java){:target="_blank"}"
-This action instantiate a webdriver
+This action instantiate a WebDriver
!!! important
Firefox is the default browser and `browser` input should be empty, but you should provide `browserPath` input.
@@ -169,19 +169,18 @@ See [WebDriver.get(String url)](https://www.selenium.dev/selenium/docs/api/java/
=== "Inputs"
- | Required | Name | Type | Note |
- |:--------:|:-------------|:--------|:----------------------------------------------:|
- | * | `web-driver` | String | |
- | | `selector` | String | (Weird implemention) Used as a boolean. If null, the page is opened in current window. If not the page is opened in a new window |
- | * | `value` | String | The URL to load. Must be a fully qualified URL |
+ | Required | Name | Type | Note |
+ |:--------:|:-------------|:-------|:--------------------------------------------------------------------------------------------------------------------------------:|
+ | * | `web-driver` | String | |
+ | | `selector` | String | (Weird implemention) Used as a boolean. If null, the page is opened in current window. If not the page is opened in a new window |
+ | * | `value` | String | The URL to load. Must be a fully qualified URL |
=== "Outputs"
- | Name | Type | Note |
+ | Name | Type | Note |
|:-----------:|:-------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `outputGet` | String | This value can be used to switch to this window using action [SwitchTo](#switch-to). See [WebDriver.getWindowHandle()](https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/WebDriver.html#getWindowHandle()){:target="_blank"} for further details. |
-
### Example
=== "Kotlin"
@@ -449,10 +448,10 @@ See [WebDriver.Window.setSize()](https://www.selenium.dev/selenium/docs/api/java
=== "Inputs"
-| Required | Name | Type | Default |
-|:--------:|:----------|:--------|:---------:|
-| * | `width` | Integer | |
-| * | `height` | Integer | |
+ | Required | Name | Type | Default |
+ |:--------:|:----------|:--------|:---------:|
+ | * | `width` | Integer | |
+ | * | `height` | Integer | |
### Example
@@ -532,13 +531,13 @@ This action waits N seconds or until the expected conditions are met.
=== "Inputs"
-| Required | Name | Type | Default | Note |
-|:--------:|:-------------|:--------|:-------:|:-------:|
-| * | `web-driver` | String | | |
-| * | `selector` | String | | |
-| * | `by` | String | | |
-| | `wait` | Integer | 1 | seconds |
-| | `value` | String | | |
+ | Required | Name | Type | Default | Note |
+ |:--------:|:-------------|:--------|:-------:|:-------:|
+ | * | `web-driver` | String | | |
+ | * | `selector` | String | | |
+ | * | `by` | String | | |
+ | | `wait` | Integer | 1 | seconds |
+ | | `value` | String | | |
### Example
diff --git a/docs/docs/documentation/actions/soap.md b/docs/docs/documentation/actions/soap.md
index 39b8ee0f7..33765e0aa 100644
--- a/docs/docs/documentation/actions/soap.md
+++ b/docs/docs/documentation/actions/soap.md
@@ -16,7 +16,7 @@
| * | `body` | String | {} |
| | `username` | String | |
| | `password` | String | |
- | | `timeout` | String ([Duration](/documentation/actions/other.md/#duration-type)) | "2000 ms" |
+ | | `timeout` | String ([Duration](/documentation/actions/introduction.md/#duration-type)) | "2000 ms" |
| | `headers` | String | |
=== "Outputs"
diff --git a/docs/docs/documentation/actions/sql.md b/docs/docs/documentation/actions/sql.md
index 07bd92a4a..28e612eb2 100644
--- a/docs/docs/documentation/actions/sql.md
+++ b/docs/docs/documentation/actions/sql.md
@@ -40,7 +40,7 @@
"password": "myPassword",
"maxFetchSize": "100",
"dataSource.driverClassName": "oracle.jdbc.OracleDriver",
- "dataSource.maximumPoolSize": "5"
+ "dataSource.maximumPoolSize": "1"
}
}
```
@@ -71,11 +71,11 @@ When you provide only one statement in input, the following outputs and operatio
=== "Outputs"
-| Name | Type | Note |
-|---------------:|:----------------|:------------------------------|
-| `rows` | [`Rows`](#rows) | |
-| `firstRow` | [`Row`](#row) | is an alias for `rows.get(0)` |
-| `affectedRows` | int | for non `SELECT` statements |
+ | Name | Type | Note |
+ |---------------:|:----------------|:------------------------------|
+ | `rows` | [`Rows`](#rows) | |
+ | `firstRow` | [`Row`](#row) | is an alias for `rows.get(0)` |
+ | `affectedRows` | int | for non `SELECT` statements |
## Rows
diff --git a/docs/docs/documentation/actions/ssh.md b/docs/docs/documentation/actions/ssh.md
index f98e41c88..865997de3 100644
--- a/docs/docs/documentation/actions/ssh.md
+++ b/docs/docs/documentation/actions/ssh.md
@@ -21,9 +21,10 @@
- [Client](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/ssh/sshj/SshJClient.java){:target="_blank"}
- [Action](https://github.com/Enedis-OSS/chutney/blob/main/chutney/action-impl/src/main/java/com/chutneytesting/action/ssh/SshClientAction.java){:target="_blank"}
-!!! note "Target Authentication"
+!!! note "Target Authentication and proxy"
- You can either use basic authentication or use a private key and a passphrase.
+ You can either use basic authentication or use a private key and a passphrase.
+ You can also use properties to set up a proxy jump connection.
```json title="target example"
{
@@ -34,6 +35,11 @@
"password": "myPassword", // (2)
"privateKey": "/path/to/the/private/key", // (3)
"privateKeyPassphrase": "myPrivateKeyPassphrase" // (4)
+ "proxy": "ssh://proxy.host:2222" // (5)
+ "proxyUser": "myProxyUser" // (6)
+ "proxyPassword": "myProxyPassword" // (7)
+ "proxyPrivateKey": "/path/to/the/private/proxy_key", // (8)
+ "proxyPassphrase": "myProxyPrivateKeyPassphrase" // (9)
}
}
```
@@ -42,6 +48,11 @@
2. Valid properties are `userPassword` or `password`. Set this for basic authentication
3. Path to private key file on the machine running Chutney
4. Valid properties are `privateKeyPassword` or `privateKeyPassphrase`. Set this for basic authentication
+ 5. Declare a SSH proxy to use (similar to declare a proxy jump for the connection)
+ 6. Proxy user to use
+ 7. Proxy user password to use
+ 8. Proxy private key to use
+ 9. Proxy private key passphrase to use
# SCP
@@ -53,12 +64,12 @@
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:--------------|:-----------------------------------------------------------------|:-------:|
- | * | `target` | String | |
- | * | `source` | String | |
- | * | `destination` | String | |
- | | `timeout` | String ([Duration](/documentation/actions/other.md/#duration-type)) | `5 sec` |
+ | Required | Name | Type | Default |
+ |:--------:|:--------------|:--------------------------------------------------------------------|:-------:|
+ | * | `target` | String | |
+ | * | `source` | String | |
+ | * | `destination` | String | |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | `5 sec` |
SCP download has no outputs
@@ -84,12 +95,12 @@ ScpDownloadAction(
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:--------------|:-----------------------------------------------------------------|:-------:|
- | * | `target` | String | |
- | * | `source` | String | |
- | * | `destination` | String | |
- | | `timeout` | String ([Duration](/documentation/actions/other.md/#duration-type)) | `5 sec` |
+ | Required | Name | Type | Default |
+ |:--------:|:--------------|:--------------------------------------------------------------------|:-------:|
+ | * | `target` | String | |
+ | * | `source` | String | |
+ | * | `destination` | String | |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | `5 sec` |
SCP upload has no outputs
@@ -120,12 +131,12 @@ ScpUploadAction(
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:--------------|:-----------------------------------------------------------------|:-------:|
- | * | `target` | String | |
- | * | `source` | String | |
- | * | `destination` | String | |
- | | `timeout` | String ([Duration](/documentation/actions/other.md/#duration-type)) | `5 sec` |
+ | Required | Name | Type | Default |
+ |:--------:|:--------------|:--------------------------------------------------------------------|:-------:|
+ | * | `target` | String | |
+ | * | `source` | String | |
+ | * | `destination` | String | |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | `5 sec` |
SFTP download has no outputs
@@ -151,11 +162,11 @@ SftpDownloadAction(
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:----------|:-----------------------------------------------------------------|:-------:|
- | * | `target` | String | |
- | * | `file` | String | |
- | | `timeout` | String ([Duration](/documentation/actions/other.md/#duration-type)) | `5 sec` |
+ | Required | Name | Type | Default |
+ |:--------:|:----------|:--------------------------------------------------------------------|:-------:|
+ | * | `target` | String | |
+ | * | `file` | String | |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | `5 sec` |
=== "Outputs"
@@ -187,11 +198,11 @@ SftpFileInfoAction(
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:------------|:-----------------------------------------------------------------|:-------:|
- | * | `target` | String | |
- | * | `directory` | String | |
- | | `timeout` | String ([Duration](/documentation/actions/other.md/#duration-type)) | `5 sec` |
+ | Required | Name | Type | Default |
+ |:--------:|:------------|:--------------------------------------------------------------------|:-------:|
+ | * | `target` | String | |
+ | * | `directory` | String | |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | `5 sec` |
=== "Outputs"
@@ -219,12 +230,12 @@ SftpListDirAction(
=== "Inputs"
- | Required | Name | Type | Default |
- |:--------:|:--------------|:-----------------------------------------------------------------|:-------:|
- | * | `target` | String | |
- | * | `source` | String | |
- | * | `destination` | String | |
- | | `timeout` | String ([Duration](/documentation/actions/other.md/#duration-type)) | `5 sec` |
+ | Required | Name | Type | Default |
+ |:--------:|:--------------|:--------------------------------------------------------------------|:-------:|
+ | * | `target` | String | |
+ | * | `source` | String | |
+ | * | `destination` | String | |
+ | | `timeout` | [Duration](/documentation/actions/introduction.md/#duration-type) (String) | `5 sec` |
SCP upload has no outputs
@@ -279,7 +290,7 @@ SshClientAction(
```
1. Syntax is either a list of String or a List of Command in JSON (ex. {command: "xxx", timeout:"10 s"})
- You can set a timeout for each command, format is a [Duration](/documentation/actions/other.md/#duration-type)
+ You can set a timeout for each command, format is a [Duration](/documentation/actions/introduction.md/#duration-type)
Default timeout value is 5 seconds
### CommandResult
@@ -306,6 +317,6 @@ The following attributes can be used in SpEL :
* `command`: Get the actual command (String)
-> `${#command.command}`
-* `timeout`: Get the command timeout ([Duration](/documentation/actions/other.md/#duration-type))
+* `timeout`: Get the command timeout ([Duration](/documentation/actions/introduction.md/#duration-type))
-> `${#command.timeout}`
diff --git a/docs/docs/documentation/campaign.md b/docs/docs/documentation/campaign.md
new file mode 100644
index 000000000..13dee9088
--- /dev/null
+++ b/docs/docs/documentation/campaign.md
@@ -0,0 +1,8 @@
+
+
+--8<-- "docs/common/coming_soon.md"
diff --git a/docs/docs/documentation/environment.md b/docs/docs/documentation/environment.md
new file mode 100644
index 000000000..13dee9088
--- /dev/null
+++ b/docs/docs/documentation/environment.md
@@ -0,0 +1,8 @@
+
+
+--8<-- "docs/common/coming_soon.md"
diff --git a/docs/docs/documentation/intellij_plugin.md b/docs/docs/documentation/intellij_plugin.md
index e4dc7824b..08ce518fd 100644
--- a/docs/docs/documentation/intellij_plugin.md
+++ b/docs/docs/documentation/intellij_plugin.md
@@ -23,12 +23,12 @@ An environment named `GLOBAL` must be created in `intellij_config_folder/conf/GL
You can get access to this file directly from your IDE
![config file](../img/idea_plugin/config_file.png)
-You can find [here](/getting_started/write.md/#define-your-test-environment-alternative) an example of how to declare an environment using JSON.
+You can find [here](/getting_started/write.md/#define-a-test-environment-alternative) an example of how to declare an environment using JSON.
# Features
!!! important
To be recognized by the plugin, a scenario's json file must be suffixed with `.chutney.json`.
- This file can be generated automatically by the [synchronize](scenario_sync.md) feature.
+ This file can be generated automatically by the [synchronize](synchronize.md) feature.
## Completion
The plugin use custom [Chutney JSON Schemas](https://github.com/Enedis-OSS/chutney/blob/main/idea-plugin/src/main/resources/chutney-v2.schema.json){:target=_blank} to enable code completion and validation in JSON Scenarios files.
@@ -51,7 +51,7 @@ You can run your scenario from the json file by clicking on:
* run icon. Scenario will be executed on the embedded Chutney Instance.
The embedded server will run on a toolWindow where you can see the logs
![embedded Chutney](../img/idea_plugin/local_server.png)
-* run menu item in the contextual menu when right-click:
+* run menu item in the contextual menu when right-clicked:
- on scenario json file.
![run scenario](../img/idea_plugin/run_scenario.png)
diff --git a/docs/docs/documentation/scenario.md b/docs/docs/documentation/scenario.md
new file mode 100644
index 000000000..a7eec38c5
--- /dev/null
+++ b/docs/docs/documentation/scenario.md
@@ -0,0 +1,15 @@
+
+
+A Chutney scenario is a succession of named steps with a simple goal, asserting an expected behavior of a given system.
+
+A Chutney Step could be of two flavors :
+
+* A purely functional step grouping others `child` steps, allowing to abstract business requirements and structure functional clarity.
+* A technical step describing a concrete [action](/documentation/actions/introduction.md).
+
+--8<-- "docs/getting_started/write.md"
diff --git a/docs/docs/documentation/scenario_sync.md b/docs/docs/documentation/synchronize.md
similarity index 93%
rename from docs/docs/documentation/scenario_sync.md
rename to docs/docs/documentation/synchronize.md
index 28746ea7e..9348752e3 100644
--- a/docs/docs/documentation/scenario_sync.md
+++ b/docs/docs/documentation/synchronize.md
@@ -5,12 +5,12 @@
~
-->
-# Synchronize *your* kotlin scenario with a server
+Synchronize a Kotlin scenario with a server
-## Create your Kotlin scenario locally
-Follow [this](/documentation/write/#write-a-scenario) documentation to write your first Kotlin scenario.
+# Create a Kotlin scenario locally
+Follow [this](/documentation/scenario.md/#write-a-scenario) documentation to write your first Kotlin scenario.
-## Create your scenario on chutney server
+# Create a scenario on chutney server
To create your scenario on a Chutney server from your IDE,
@@ -76,7 +76,7 @@ To create your scenario on a Chutney server from your IDE,
Now your scenario is created on the server ! :material-rocket:
-## Update your scenario on chutney server
+# Update a scenario on chutney server
After editing your scenario kotlin code, jut call synchronize function again.
@@ -90,7 +90,7 @@ Now your scenario is updated on Chutney server ! :material-rocket-launch:
* Call synchronize main from an integration server(jenkins, gitlab CI, github actions...) to update scenarios on your remote Chutney instance.
* Synchronize call can be scheduled just before running your test campaigns to have up-to-date scenarios.
-## Configure your environment on the server
+# Configure an environment on the server
Now, the last step before running your scenario from the server is to setup environments and targets.
diff --git a/docs/docs/documentation/write.md b/docs/docs/documentation/write.md
deleted file mode 120000
index 493024ff0..000000000
--- a/docs/docs/documentation/write.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
---8<-- "docs/getting_started/write.md"
diff --git a/docs/docs/getting_started/run.md b/docs/docs/getting_started/run.md
index 3deeeb665..211ea9d07 100644
--- a/docs/docs/getting_started/run.md
+++ b/docs/docs/getting_started/run.md
@@ -5,23 +5,27 @@
~
-->
-Now, in order to run your first scenario, you need to configure your project and build tool according to your preferences.
+Now, in order to run your first scenario **locally**, you need to configure your project and build tool according to your preferences.
+Here, you will see how to run your scenario as an integration test with the maven failsafe plugin.
-Chutney Kotlin DSL provides a JUnit 5 Runner with annotations.
+Chutney provides two ways for doing this
-It provides also a `Launcher` class you can use the way you want. You are free to run your scenarios _when_ and
-_anywhere_ you want (be it in a `main` if you wish).
+ * A JUnit 5 Engine with annotations.
+ * A specific `Launcher` class.
+??? tip "Launcher"
-In the following sections :
+ The specific `Launcher` class could be used anywhere you need it (let it be a `main` for example).
-* you will see how to use the JUnit 5 Runner and annotations.
-* you will see how to use the `Launcher` in a standard test, attached to the `integration` phase and run using the maven failsafe plugin.
+??? note "Other ways to run a scenario"
+ * **Web interface** : After defining an environment and your scenario (via [synchronization](/documentation/synchronize.md)), you could use the web interface to launch an execution.
-# Using Chutney JUnit5 Engine
+ * **IntelliJ plugin** : The [idea plugin](/documentation/intellij_plugin.md) provides a way to [execute](/documentation/intellij_plugin.md/#execution) a scenario from its JSON representation.
-When using the JUnit5 engine, we recommend you to use JSON files to [declare your environments and targets](/getting_started/write.md/#define-your-test-environment-alternative).
+# Chutney JUnit5 Engine
+
+When using the JUnit5 engine, we recommend you to use JSON files to [declare your environments and targets](/getting_started/write.md/#define-a-test-environment-alternative).
Create a Kotlin file (ex. `Junit5SearchFeat.kt`) with the following content :
@@ -41,7 +45,7 @@ class Junit5SearchFeat {
```
-# Using Chutney Launcher
+# Chutney Launcher
Under `src/test/kotlin` create a package (ex. `com.chutneytesting.getstart`) and create a Kotlin file (ex. `SearchFeat.kt`) with the following content :
@@ -59,6 +63,8 @@ class SearchFeat {
}
```
+# Run it !
+
??? note "Configure your build tool"
=== "maven"
@@ -101,9 +107,6 @@ class SearchFeat {
}
```
-
-# Run it !
-
Now you can simply run `mvn verify` or `./gradlew test`.
If you are using Maven, the console will output the resulting execution :
diff --git a/docs/docs/getting_started/write.md b/docs/docs/getting_started/write.md
index 47e66e763..2fcba57fa 100644
--- a/docs/docs/getting_started/write.md
+++ b/docs/docs/getting_started/write.md
@@ -7,7 +7,7 @@
In order to write a scenario, you also need to declare environments and services you want to test.
-# Define your test environment
+# Define a test environment
## Declare a target
@@ -45,7 +45,7 @@ val environment = ChutneyEnvironment(
* The environment `name` and `description` can be anything meaningful to you. The name will be shown in the execution report.
* The variable name `environment` is a reference to set the environment on running tests
-# Define your test environment (alternative)
+# Define a test environment (alternative)
There is another way to declare environments and targets by using JSON files.
@@ -121,7 +121,7 @@ val search_scenario = Scenario(title = "Search documents") {
* The scenario title `Search documents` will be shown in the execution report.
* There are 2 steps `When I visit a search engine` and `Then I am on the front page`
* The first step will execute an HTTP GET call on the target name `search_engine` on the uri `/`
- * It also has one [validation](/documentation/actions/introduction.md/#validation) `request accepted` to check the response code status is 200.
+ * It also has one [validation](/documentation/actions/introduction.md/#validations) `request accepted` to check the response code status is 200.
* The second step does nothing meaningful in this example
!!! tip "Et voilà !"
diff --git a/docs/docs/index.md b/docs/docs/index.md
index 9fa8c7b7e..1a7b7809d 100644
--- a/docs/docs/index.md
+++ b/docs/docs/index.md
@@ -20,12 +20,13 @@ Chutney provides you a set of capabilities for executing your scenario without h
:octicons-book-16: You can find out a comprehensive list of what Chutney can do in the [documentation](/documentation/actions/introduction.md).
----
+
# Why another test tool ?
Chutney is an opinionated test tool based upon the practice of Specification by Example.
Chutney was inspired by Seb Rose blog post in which he revised the test pyramid according to test readability
-[The Testing Iceberg](http://claysnow.co.uk/the-testing-iceberg/)
+[The Testing Iceberg](http://claysnow.co.uk/the-testing-iceberg/){:target="_blank"}
Chutney is not exactly what Seb Rose meant by using this metaphor.
@@ -66,7 +67,7 @@ is also valuable.
# Why Choose Chutney ?
-Chutney stands out for its simple and flexible approach to test automation, focusing on complex scenarios and end-to-end testing. Compared to other similar tools like [Cucumber](https://cucumber.io/) or [Karate](https://karatelabs.github.io/karate/), here are some key points :
+Chutney stands out for its simple and flexible approach to test automation, focusing on complex scenarios and end-to-end testing. Compared to other similar tools like [Cucumber](https://cucumber.io/){:target="_blank"} or [Karate](https://karatelabs.github.io/karate/){:target="_blank"}, here are some key points :
* **Simplified DSL**
Chutney offers a Kotlin-based Domain-Specific Language (DSL) that allows writing readable and easy-to-maintain scenarios for developers. This is an attractive alternative for teams preferring a more structured language than the one used by Cucumber with regexp.
@@ -78,7 +79,7 @@ Chutney stands out for its simple and flexible approach to test automation, focu
Chutney includes an interface specifically designed for non-developers, enabling them to execute tests, plan test campaigns, and analyze reports with ease. This sets it apart from other tools like Cucumber or Karate, which often require technical expertise for these tasks. This accessibility bridges the gap between technical and non-technical teams, fostering collaboration and improving efficiency.
* **Multi-level Gherkin-like language**
- Quoting the [Glacio](https://github.com/fridujo/glacio) project
+ Quoting the [Glacio](https://github.com/fridujo/glacio){:target="_blank"} project
> There is a common problem encountered using BDD tools like Cucumber.
> This is:
@@ -98,6 +99,29 @@ Finally, Chutney is production ready and used in companies by two main types of
* Cross-Application Testing Teams
Dedicated testing teams use Chutney across multiple interconnected applications. These teams focus on validating complex integrations and ensuring that end-to-end scenarios work seamlessly in large systems with various dependencies.
+# Docker
+
+Along each Chutney release, some built docker images are pushed to the [GitHub Chutney repo](https://github.com/orgs/Enedis-OSS/packages?repo_name=chutney){:target="_blank"} :
+
+* [chutney-server](https://github.com/orgs/Enedis-OSS/chutney/pkgs/container/chutney%2Fchutney-server){:target="_blank"}
+ This [image](https://github.com/Enedis-OSS/chutney/blob/main/chutney/.docker/server/Dockerfile){:target="_blank"} contains the Chutney server instance with embedded ui.
+
+* [chutney-ui](https://github.com/orgs/Enedis-OSS/chutney/pkgs/container/chutney%2Fchutney-ui){:target="_blank"}
+ This [image](https://github.com/Enedis-OSS/chutney/blob/main/chutney/.docker/ui/Dockerfile){:target="_blank"} contains only the Chutney ui.
+
+* [chutney-demo](https://github.com/orgs/Enedis-OSS/chutney/pkgs/container/chutney%2Fchutney-demo){:target="_blank"}
+ This [image](https://github.com/Enedis-OSS/chutney/blob/main/example/.docker/demo/Dockerfile){:target="_blank"} contains a Chutney server with some scenarios and campaigns samples.
+ Check [this](/getting_started/demo.md) for more !!
+
+!!! info "Details and compose"
+
+ For more details information, check the server and ui [readme](https://github.com/Enedis-OSS/chutney/blob/main/chutney/.docker/README.md){:target="_blank"} and the demo [one](https://github.com/Enedis-OSS/chutney/blob/main/example/.docker/README.md){:target="_blank"}.
+ Some Docker compose files are also present in source code to play with.
+
+??? tip "Legacy repo before 3.0.0"
+
+ Checkout for this [legacy repo](https://github.com/orgs/chutney-testing/packages){:target="_blank"} for docker images before version 3.0.0.
+
# Front end
Chutney comes with a web application front end to launch and show executions of scenarios and campaigns.
diff --git a/docs/docs/installation/local_dev.md b/docs/docs/installation/local_dev.md
index 95e512a0f..779a1ca54 100644
--- a/docs/docs/installation/local_dev.md
+++ b/docs/docs/installation/local_dev.md
@@ -14,14 +14,21 @@ and allow functional and business analyst to review and be involved in testing t
That's why we provide a server and web UI to help us do all these things.
+
# Start a server
-
+
+
+!!! note "Docker"
+
+ 1. Start Chutney locally with `docker -p 8443:8443 -d run ghcr.io/chutney-testing/chutney/chutney-server` ([Docker run documentation](https://docs.docker.com/reference/cli/docker/container/run/)).
!!! note "Java"
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index c64a8fb33..595c2cd5a 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -16,8 +16,8 @@ nav:
- Getting Started:
- Demo: getting_started/demo.md
- Requirements: getting_started/requirements.md
- - Write your first scenario: getting_started/write.md
- - Run your scenario: getting_started/run.md
+ - Write a scenario: getting_started/write.md
+ - Run a scenario: getting_started/run.md
- Installation:
- Local Development: installation/local_dev.md
- On premise:
@@ -26,44 +26,53 @@ nav:
- Further details: installation/on_premise/details.md
- Advanced topics: installation/advanced_topics.md
- Documentation:
- - Write a scenario: documentation/write.md
- - Synchronize: documentation/scenario_sync.md
+ - Scenario: documentation/scenario.md
+# - Campaign: documentation/campaign.md
- Dataset: documentation/dataset.md
- - Idea Plugin: documentation/intellij_plugin.md
+# - Environment: documentation/environment.md
+ - Synchronize: documentation/synchronize.md
- Actions:
- documentation/actions/introduction.md
- - AMQP: documentation/actions/amqp.md
- - Groovy: documentation/actions/groovy.md
+ - Assertions: documentation/actions/assertions.md
+ - Context: documentation/actions/context.md
- HTTP: documentation/actions/http.md
- - JMS: documentation/actions/jms.md
+ - AMQP: documentation/actions/amqp.md
+ - SQL: documentation/actions/sql.md
+ - JMS / Jakarta: documentation/actions/jms.md
- Kafka: documentation/actions/kafka.md
- - MongoDB: documentation/actions/mongo.md
- - Radius: documentation/actions/radius.md
- Selenium: documentation/actions/selenium.md
- - SOAP: documentation/actions/soap.md
- - SQL: documentation/actions/sql.md
- SCP / FTP / SSH: documentation/actions/ssh.md
- - Assertions: documentation/actions/assertions.md
+ - MongoDB: documentation/actions/mongo.md
- Micrometer: documentation/actions/micrometer.md
- - Other: documentation/actions/other.md
+ - Radius: documentation/actions/radius.md
+ - SOAP: documentation/actions/soap.md
+ - Groovy: documentation/actions/groovy.md
- Functions:
- documentation/functions/introduction.md
- - Classpath: documentation/functions/classpath.md
+ - Random values: documentation/functions/generate.md
- Dates & Time: documentation/functions/datetime.md
+ - JSON: documentation/functions/json.md
+ - XPath: documentation/functions/xpath.md
+ - Network: documentation/functions/network.md
+ - Classpath: documentation/functions/classpath.md
- Escape: documentation/functions/escape.md
- Handling null: documentation/functions/nullable.md
- - JSON: documentation/functions/json.md
- Micrometer: documentation/functions/micrometer.md
- - Network: documentation/functions/network.md
- - Random values: documentation/functions/generate.md
- - SOAP: documentation/functions/soap.md
- String: documentation/functions/string.md
- Wiremock: documentation/functions/wiremock.md
- - XPath: documentation/functions/xpath.md
+ - SOAP: documentation/functions/soap.md
+# - Strategies:
+# - documentation/strategies/introduction.md
+# - Default: documentation/strategies/default.md
+# - Retry: documentation/strategies/retry.md
+# - Soft: documentation/strategies/soft.md
+# - Foreach: documentation/strategies/foreach.md
+# - If: documentation/strategies/if.md
- Extension:
- Action: documentation/extension/action.md
- Function: documentation/extension/function.md
- - Strategy: documentation/extension/strategy.md
+# - Strategy: documentation/extension/strategy.md
+ - Idea Plugin: documentation/intellij_plugin.md
extra_css:
- stylesheets/extra.css