Skip to main content

CSV Plugin prototype

Source Code

https://github.com/pact-foundation/pact-plugins/tree/main/plugins

This is an example plugin supporting creating and matching comma-separated value text payloads.

Building the plugin

The plugin is built with Rust. Just run cargo build --release. This will create the plugin binary file pact-plugin-csv in the target/release/ directory.

Installing the plugin

The plugin binary and manifest file pact-plugin.json need to be copied into the $HOME/.pact/plugins/csv-0.0.1 directory. You can download those from the release for the plugin.

Running with a development version of the plugin

If you build the plugin without the --release, this will create a debug version in the target/debug directory. Copy the manifest file pact-plugin.json into the $HOME/.pact/plugins/csv-0.0.1 directory. If you then edit that file, and set the entryPoint to the absolute path of the pact-plugin-csv binary in target/debug, you can then make changes to the plugin, build it, and then all test projects will use that version.

Example Projects

There are three example projects in examples/csv that use this plugin:

  • csv-consumer-jvm - consumer written in Java
  • csv-consumer-rust - consumer written in Rust
  • csv-provider - provider written in Rust

CSV matching definitions

The plugin matches the columns of the CSV data using matching rule definitions. The columns can be specified by header (if the CSV has a header row) or by index (starting with 1).

Using the CSV from the example projects, it has 3 columns: Name, Number and Date. The matching rules can be specified by (in pseudo config)

If using headers:

"response.contents": {
"pact:content-type": "text/csv", // Set the content type to CSV
"csvHeaders": true, // We have a header row
"column:Name": "matching(type,'Name')", // Column with header Name must match by type (which is actually useless with CSV)
"column:Number", "matching(number,100)", // Column with header Number must match a number format
"column:Date", "matching(datetime, 'yyyy-MM-dd','2000-01-01')" // Column with header Date must match an ISO format yyyy-MM-dd
}

Without headers:

"response.contents": {
"pact:content-type": "text/csv",
"csvHeaders": false,
"column:1": "matching(type,'Name')",
"column:2": "matching(number,100)",
"column:3": "matching(datetime, 'yyyy-MM-dd','2000-01-01')"
}