configcat 0.1.5

ConfigCat Rust SDK
Documentation
#![allow(dead_code)]

use crate::utils::rand_sdk_key;
use configcat::OverrideBehavior::LocalOnly;
use configcat::{Client, ClientBuilder, FileDataSource, PollingMode, User};

mod utils;

#[tokio::test]
async fn default_user_flag() {
    let client = client_builder().default_user(User::new("id1")).build().unwrap();
    let details_without_user = client.get_flag_details("disabledFeature", None).await;

    assert_eq!("id1", details_without_user.user.unwrap()[User::IDENTIFIER].to_string().as_str());

    let details = client.get_flag_details("disabledFeature", Some(User::new("id2"))).await;

    assert_eq!("id2", details.user.unwrap()[User::IDENTIFIER].to_string().as_str());
}

#[tokio::test]
async fn default_user_value() {
    let client = client_builder().default_user(User::new("id1")).build().unwrap();
    let details_without_user = client.get_value_details("disabledFeature", false, None).await;

    assert_eq!("id1", details_without_user.user.unwrap()[User::IDENTIFIER].to_string().as_str());

    let details = client.get_value_details("disabledFeature", false, Some(User::new("id2"))).await;

    assert_eq!("id2", details.user.unwrap()[User::IDENTIFIER].to_string().as_str());
}

#[tokio::test]
async fn default_user_set_clear() {
    let mut client = client_builder().default_user(User::new("id1")).build().unwrap();
    let details_without_user = client.get_value_details("disabledFeature", false, None).await;

    assert_eq!("id1", details_without_user.user.unwrap()[User::IDENTIFIER].to_string().as_str());

    client.set_default_user(User::new("id2"));
    let details_without_user = client.get_value_details("disabledFeature", false, None).await;

    assert_eq!("id2", details_without_user.user.unwrap()[User::IDENTIFIER].to_string().as_str());

    client.clear_default_user();

    let details_without_user = client.get_value_details("disabledFeature", false, None).await;

    assert!(details_without_user.user.is_none());

    let details = client.get_value_details("disabledFeature", false, Some(User::new("id3"))).await;

    assert_eq!("id3", details.user.unwrap()[User::IDENTIFIER].to_string().as_str());
}

#[tokio::test]
async fn default_value_type_mismatch() {
    let client = client_builder().build().unwrap();
    let value = client.get_value("disabledFeature", "def".to_owned(), None).await;

    assert_eq!(value, "def");
}

#[tokio::test]
async fn get_all_keys() {
    let client = client_builder().build().unwrap();
    let mut keys = client.get_all_keys().await;
    keys.sort();
    let mut exp = vec!["stringSetting", "intSetting", "doubleSetting", "disabledFeature", "enabledFeature"];
    exp.sort();

    assert_eq!(keys, exp);
}

#[tokio::test]
async fn get_all_keys_empty() {
    let client = Client::builder(rand_sdk_key().as_str()).polling_mode(PollingMode::Manual).build().unwrap();
    let keys = client.get_all_keys().await;

    assert!(keys.is_empty());
}

#[tokio::test]
async fn get_all_values() {
    let client = client_builder().build().unwrap();
    let values = client.get_all_values(None).await;

    assert!(!values["disabledFeature"].as_bool().unwrap());
    assert!(values["enabledFeature"].as_bool().unwrap());
    assert_eq!(values["stringSetting"].as_str().unwrap(), "test");
    assert_eq!(values["intSetting"].as_int().unwrap(), 5);
    assert_eq!(values["doubleSetting"].as_float().unwrap(), 1.2);
}

#[tokio::test]
async fn get_all_values_with_user() {
    let client = client_builder().build().unwrap();
    let values = client.get_all_values(Some(User::new("a@matching.com"))).await;

    assert!(values["disabledFeature"].as_bool().unwrap());
}

#[tokio::test]
async fn dbg() {
    let client = client_builder().build().unwrap();

    let exp = r#"Client { options: Options { sdk_key: "local", offline: false, base_url: None, data_governance: Global, http_timeout: 30s, overrides: Some(FlagOverrides { behavior: LocalOnly, .. }), polling_mode: AutoPoll(60s), default_user: None, .. }, default_user: Mutex { data: None, poisoned: false, .. }, .. }"#;
    assert_eq!(format!("{client:?}"), exp);
}

fn client_builder() -> ClientBuilder {
    Client::builder("local").overrides(Box::new(FileDataSource::new("tests/data/test_json_complex.json").unwrap()), LocalOnly)
}