#![warn(missing_docs)]
#![warn(clippy::missing_docs_in_private_items)]
pub use anyhow::{anyhow, Context, Error, Result};
pub use doco_derive::{main, test};
use getset::Getters;
#[doc(hidden)]
pub use inventory;
pub use testcontainers::core::{AccessMode, Mount, WaitFor};
pub use thirtyfour::By;
use typed_builder::TypedBuilder;
pub use crate::client::Client;
pub use crate::server::Server;
pub use crate::service::Service;
pub use crate::session::Session;
pub use crate::test_runner::TestRunner;
pub use crate::viewport::Viewport;
mod client;
mod environment;
mod server;
mod service;
mod session;
mod test_runner;
mod viewport;
#[cfg(test)]
mod test_utils;
pub struct TestCase {
pub name: &'static str,
pub function: fn(Client) -> Result<()>,
}
inventory::collect!(TestCase);
#[derive(Clone, Debug, Getters, TypedBuilder)]
pub struct Doco {
#[getset(get = "pub")]
server: Server,
#[builder(via_mutators(init = Vec::new()), mutators(
pub fn service(mut self, service: Service) {
self.services.push(service);
}
))]
#[getset(get = "pub")]
services: Vec<Service>,
#[builder(default = std::env::var("CI").is_ok())]
#[getset(get = "pub")]
headless: bool,
#[builder(default, setter(strip_option))]
#[getset(get = "pub")]
viewport: Option<Viewport>,
}
impl Doco {
pub async fn connect(&self) -> Result<Session> {
Session::connect(self).await
}
}
#[cfg(test)]
mod tests {
use crate::test_utils::*;
use super::{Doco, Server, Service};
#[test]
fn service_collects_services() {
let server = Server::builder()
.image("crccheck/hello-world")
.tag("v1.0.0")
.port(8000)
.build();
let doco = Doco::builder()
.server(server)
.service(Service::builder().image("first").tag("latest").build())
.service(Service::builder().image("second").tag("latest").build())
.build();
assert_eq!(doco.services().len(), 2);
}
#[test]
fn trait_send() {
assert_send::<Doco>();
}
#[test]
fn trait_sync() {
assert_sync::<Doco>();
}
#[test]
fn trait_unpin() {
assert_unpin::<Doco>();
}
}