use std::time::Duration;
use common::{FLAGD_CONFIG, FLAGD_SYNC_PORT, Flagd};
use open_feature::provider::FeatureProvider;
use open_feature::{EvaluationContext, Value};
use open_feature_flagd::{FlagdOptions, FlagdProvider, ResolverType};
use test_log::test;
use testcontainers::runners::AsyncRunner;
mod common;
#[test(tokio::test)]
async fn test_in_process_bool_resolution() {
let flagd = Flagd::new()
.with_config(FLAGD_CONFIG)
.start()
.await
.unwrap();
let port = flagd.get_host_port_ipv4(FLAGD_SYNC_PORT).await.unwrap();
let provider = FlagdProvider::new(FlagdOptions {
host: "localhost".to_string(),
port,
resolver_type: ResolverType::InProcess,
..Default::default()
})
.await
.unwrap();
let context = EvaluationContext::default().with_targeting_key("test-user");
let bool_result = provider
.resolve_bool_value("bool-flag", &context)
.await
.unwrap();
assert_eq!(bool_result.value, true);
}
#[test(tokio::test)]
async fn test_in_process_sync_bool_resolution() {
let initial_config = r#"{
"flags": {
"sync-test-flag": {
"state": "ENABLED",
"variants": {
"on": true,
"off": false
},
"defaultVariant": "on"
}
}
}"#;
let flagd = Flagd::new().with_config(initial_config);
let flagd_instance = flagd.clone();
let container = flagd.start().await.unwrap();
let port = container.get_host_port_ipv4(FLAGD_SYNC_PORT).await.unwrap();
let provider = FlagdProvider::new(FlagdOptions {
host: "localhost".to_string(),
port,
resolver_type: ResolverType::InProcess,
cache_settings: None,
..Default::default()
})
.await
.unwrap();
let context = EvaluationContext::default();
let initial_result = provider
.resolve_bool_value("sync-test-flag", &context)
.await
.unwrap();
assert_eq!(initial_result.value, true);
let updated_config = r#"{
"flags": {
"sync-test-flag": {
"state": "ENABLED",
"variants": {
"on": true,
"off": false
},
"defaultVariant": "off"
}
}
}"#;
flagd_instance.update_config(updated_config.to_string());
tokio::time::sleep(Duration::from_secs(3)).await;
let updated_result = provider
.resolve_bool_value("sync-test-flag", &context)
.await
.unwrap();
assert_eq!(updated_result.value, false);
}
#[test(tokio::test)]
async fn test_in_process_resolver_all_types() {
let flagd = Flagd::new()
.with_config(FLAGD_CONFIG)
.start()
.await
.unwrap();
let port = flagd.get_host_port_ipv4(FLAGD_SYNC_PORT).await.unwrap();
let provider = FlagdProvider::new(FlagdOptions {
host: "localhost".to_string(),
port,
resolver_type: ResolverType::InProcess,
..Default::default()
})
.await
.unwrap();
let context = EvaluationContext::default();
let string_result = provider
.resolve_string_value("string-flag", &context)
.await
.unwrap();
assert_eq!(string_result.value, "hello");
let int_result = provider
.resolve_int_value("int-flag", &context)
.await
.unwrap();
assert_eq!(int_result.value, 42);
let float_result = provider
.resolve_float_value("float-flag", &context)
.await
.unwrap();
assert_eq!(float_result.value, 3.14);
let struct_result = provider
.resolve_struct_value("struct-flag", &context)
.await
.unwrap();
assert_eq!(
struct_result.value.fields["key"],
Value::String("value".to_string())
);
assert_eq!(struct_result.value.fields["number"], Value::Int(42));
}