Pact test DSL for writing consumer pact tests in Rust
This library provides a test DSL for writing consumer pact tests in Rust. It is based on the V3 pact specification.
To use it
To use it, add it to your dev-dependencies in your cargo manifest:
[dev-dependencies]
pact_consumer = "0.6.3"
You can now write a pact test using the consumer DSL.
use pact_consumer::prelude::*;
use pact_consumer::*;
#[test]
fn a_service_consumer_side_of_a_pact_goes_a_little_something_like_this() {
// Define the Pact for the test (you can setup multiple interactions by chaining the given or upon_receiving calls)
let pact_runner = ConsumerPactBuilder::consumer(s!("Consumer")) // Define the service consumer by name
.has_pact_with(s!("Alice Service")) // Define the service provider that it has a pact with
.given("there is some good mallory".to_string()) // defines a provider state. It is optional.
.upon_receiving("a retrieve Mallory request".to_string()) // upon_receiving starts a new interaction
.path(s!("/mallory")) // define the request, a GET (default) request to '/mallory'
.will_respond_with() // define the response we want returned
.status(200)
.headers(hashmap!{ s!("Content-Type") => s!("text/html") })
.body(OptionalBody::Present(s!("That is some good Mallory.")))
.build();
// Execute the run method to have the mock server run (the URL to the mock server will be passed in).
// It takes a closure to execute your requests and returns a Pact VerificationResult.
let result = pact_runner.run(&|url| {
let client = Client { url: url.clone(), .. Client::default() }; // You would use your actual client code here
let result = client.fetch("/mallory"); // we get our client code to execute the request
expect!(result).to(be_ok().value("That is some good Mallory."));
Ok(())
});
expect!(result).to(be_equal_to(VerificationResult::PactVerified)); // This means it is all good
}
Changing the output directory
By default, the pact files will be written to target/pacts
. To change this, set the environment variable PACT_OUTPUT_DIR
.