Run docker containers in your Rust integration tests.
This crate provides the following features for your docker testing needs:
WaitFor
strategy.
RunningContainer
in the test body through its ip
address.The canonical example and motivation for this crate can be expressed with the following use-case example - host a database used by your test in a container, which is fresh between each test.
```rust use diesel::pg::PgConnection; use diesel::prelude::*; use dockertest::waitfor::{MessageSource, MessageWait}; use dockertest::{Composition, DockerTest, PullPolicy, Source}; use std::rc::Rc;
// Define our test let source = Source::DockerHub(PullPolicy::IfNotPresent); let mut test = DockerTest::new().withdefaultsource(source);
// Define our Composition - the Image we will start and end up as our RunningContainer let postgres = Composition::withrepository("postgres").withwaitfor(Rc::new(MessageWait { message: "database system is ready to accept connections".tostring(), source: MessageSource::Stderr, timeout: 20, })); test.add_composition(postgres);
// Run the test body test.run(|ops| { let container = ops.handle("postgres").expect("retrieve postgres container"); let ip = container.ip(); // This is the default postgres serve port let port = "5432"; let connstring = format!("postgres://postgres:postgres@{}:{}", ip, port); let pgconn = PgConnection::establish(&connstring);
// Perform your database operations here
assert!(
pgconn.is_ok(),
"failed to establish connection to postgres docker"
);
}); ```
This library is in its initial inception. Breaking changes are to be expected.
Testing this library requires the following:
* docker daemon available on localhost.
* Capable of compiling diesel
with the postgres feature.
Run the tests with the following command:
cargo test -- --test-threads=1
Caveats that may fail tests:
* Exited hello-world
containers on the system. This will currently make removing
old images fail and many tests will fail.