use faucet_conformance::assert_config_schema_valid_value;
use faucet_source_mongodb::{MongoSource, MongoSourceConfig};
use mongodb::Client;
use mongodb::bson::{Document, doc};
use testcontainers::{ContainerAsync, runners::AsyncRunner};
use testcontainers_modules::mongo::Mongo;
#[test]
fn conformance_config_schema_valid() {
let schema = serde_json::to_value(schemars::schema_for!(MongoSourceConfig)).unwrap();
assert_config_schema_valid_value(&schema, "faucet-source-mongodb");
}
async fn start_mongo() -> (ContainerAsync<Mongo>, String) {
let container: ContainerAsync<Mongo> = Mongo::default()
.start()
.await
.expect("mongo container start");
let port = container
.get_host_port_ipv4(27017)
.await
.expect("mongo port");
let uri = format!("mongodb://127.0.0.1:{port}");
(container, uri)
}
async fn seed_docs(uri: &str, db: &str, collection: &str, n: i64) {
let client = Client::with_uri_str(uri).await.expect("client");
let coll = client.database(db).collection::<Document>(collection);
let docs: Vec<Document> = (1..=n).map(|i| doc! { "id": i }).collect();
coll.insert_many(docs).await.expect("insert_many");
}
#[tokio::test(flavor = "multi_thread")]
async fn conformance_bounded_memory() {
let (_container, uri) = start_mongo().await;
seed_docs(&uri, "testdb", "events", 5_000).await;
let config = MongoSourceConfig::new(uri, "testdb", "events").with_batch_size(250);
let source = MongoSource::new(config).await.expect("source new");
faucet_conformance::assert_bounded_memory(&source, 250, 5_000).await;
}
#[tokio::test(flavor = "multi_thread")]
async fn conformance_errors_not_panics() {
let uri = "mongodb://127.0.0.1:1/?serverSelectionTimeoutMS=2000";
let config = MongoSourceConfig::new(uri, "testdb", "events");
let source = MongoSource::new(config)
.await
.expect("builds lazily; read fails");
faucet_conformance::assert_errors_not_panics(&source).await;
}