use std::sync::Arc;
use std::time::Duration;
use rightsize::{Container, Network, Wait};
#[tokio::main]
async fn main() {
rightsize_modules::register_default_backends();
let net = Arc::new(Network::new_network());
let server = Container::new("wiremock/wiremock:3.13.2")
.with_exposed_ports(&[8080])
.with_network(&net)
.with_network_aliases(&["config-stub"])
.waiting_for(
Wait::for_http("/__admin/health")
.for_port(8080)
.with_startup_timeout(Duration::from_secs(180)),
);
let server_guard = server.start().await.expect("server must start");
let mapping = r#"{"request":{"method":"GET","urlPath":"/config"},
"response":{"status":200,"body":"feature-flags: []"}}"#;
let admin_url = format!(
"http://{}:{}/__admin/mappings",
server_guard.host(),
server_guard.get_mapped_port(8080).unwrap()
);
let response = ureq::post(&admin_url)
.header("Content-Type", "application/json")
.send(mapping.as_bytes())
.expect("must register WireMock stub");
assert_eq!(
response.status().as_u16(),
201,
"unexpected WireMock admin status"
);
let consumer = Container::new("alpine:3.19")
.with_network(&net)
.with_command(&["sleep", "300"])
.waiting_for(Wait::for_log_message(".*", 0));
let consumer_guard = consumer.start().await.expect("consumer must start");
let target = net
.resolve("config-stub", 8080)
.expect("alias must resolve");
let result = consumer_guard
.exec(&[
"wget",
"-qO-",
"-T",
"10",
&format!("http://{target}/config"),
])
.await
.expect("exec must run");
assert_eq!(result.exit_code, 0, "wget failed: {}", result.stderr);
println!(
"Consumer fetched config via alias 'config-stub' -> {}",
result.stdout.trim()
);
assert!(result.stdout.contains("feature-flags"));
consumer_guard
.stop()
.await
.expect("consumer must stop cleanly");
server_guard.stop().await.expect("server must stop cleanly");
}