lmn-core 0.1.3

Core engine for the lmn HTTP load testing CLI
Documentation
use lmn_core::request_template::{
    definition::{FloatDef, FloatStrategy, ObjectDef, TemplateDef},
    generator::GeneratorContext,
};
use serde_json::Value;
use std::collections::HashMap;

fn float_exact(v: f64) -> TemplateDef {
    TemplateDef::Float(FloatDef {
        strategy: FloatStrategy::Exact(v),
        decimals: 0,
    })
}

#[test]
fn resolve_returns_once_value_when_set() {
    let ctx = GeneratorContext::new(HashMap::new()).with_once_values(
        [("x".to_string(), Value::String("fixed".to_string()))]
            .into_iter()
            .collect(),
    );
    let val = ctx.resolve("x", &mut rand::rng());
    assert_eq!(val, Value::String("fixed".to_string()));
}

#[test]
fn resolve_generates_fresh_when_no_once_value() {
    let mut defs = HashMap::new();
    defs.insert("price".to_string(), float_exact(99.0));
    let ctx = GeneratorContext::new(defs);
    let val = ctx.resolve("price", &mut rand::rng());
    assert!(val.is_number());
}

#[test]
fn generate_def_produces_float() {
    let ctx = GeneratorContext::new(HashMap::new());
    let def = float_exact(5.0);
    let val = ctx.generate_def(&def, &mut rand::rng());
    assert_eq!(val.as_f64().unwrap() as i64, 5);
}

#[test]
fn generate_def_produces_object_with_composed_fields() {
    let mut defs = HashMap::new();
    defs.insert("price".to_string(), float_exact(10.0));
    let ctx = GeneratorContext::new(defs);
    let def = TemplateDef::Object(ObjectDef {
        composition: [("amount".to_string(), "price".to_string())]
            .into_iter()
            .collect(),
    });
    let val = ctx.generate_def(&def, &mut rand::rng());
    assert!(val["amount"].is_number());
}