#[cfg(test)]
use fallow_api::{CombinedOutput, FallowOutput};
#[cfg(test)]
use fallow_output::{CombinedMeta, RootEnvelopeMode};
#[cfg(test)]
fn serialize_root_output_with_mode(
output: FallowOutput,
mode: RootEnvelopeMode,
) -> Result<serde_json::Value, serde_json::Error> {
let mut value = fallow_output::serialize_json_root_output(output, mode)?;
fallow_output::attach_telemetry_meta(
&mut value,
crate::output_runtime::telemetry_analysis_run_id().as_deref(),
);
Ok(value)
}
#[cfg(test)]
mod tests {
use fallow_types::envelope::{ElapsedMs, Meta, SchemaVersion, ToolVersion};
use super::*;
static TEST_TELEMETRY_RUN_ID_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
struct TelemetryRunIdGuard {
_lock: std::sync::MutexGuard<'static, ()>,
}
impl TelemetryRunIdGuard {
fn set(run_id: Option<&str>) -> Self {
let lock = TEST_TELEMETRY_RUN_ID_LOCK
.lock()
.unwrap_or_else(|poisoned| poisoned.into_inner());
crate::output_runtime::set_telemetry_analysis_run_id(run_id.map(str::to_owned));
Self { _lock: lock }
}
}
impl Drop for TelemetryRunIdGuard {
fn drop(&mut self) {
crate::output_runtime::set_telemetry_analysis_run_id(None);
}
}
fn combined_output() -> CombinedOutput {
CombinedOutput {
schema_version: SchemaVersion(crate::report::SCHEMA_VERSION),
version: ToolVersion("test".to_string()),
elapsed_ms: ElapsedMs(0),
meta: None,
check: None,
dupes: None,
health: None,
next_steps: Vec::new(),
}
}
#[test]
fn root_output_serializes_kind_by_default() {
let _guard = TelemetryRunIdGuard::set(None);
let value = serialize_root_output_with_mode(
FallowOutput::Combined(combined_output()),
RootEnvelopeMode::Tagged,
)
.expect("combined root should serialize");
assert_eq!(value["kind"], serde_json::Value::String("combined".into()));
assert_eq!(value["schema_version"], crate::report::SCHEMA_VERSION);
}
#[test]
fn root_output_attaches_telemetry_meta() {
let _guard = TelemetryRunIdGuard::set(Some("run_test123"));
let value = serialize_root_output_with_mode(
FallowOutput::Combined(combined_output()),
RootEnvelopeMode::Tagged,
)
.expect("combined root should serialize");
assert_eq!(
value["_meta"]["telemetry"]["analysis_run_id"].as_str(),
Some("run_test123")
);
}
#[test]
fn telemetry_meta_preserves_existing_meta_sections() {
let mut output = combined_output();
output.meta = Some(CombinedMeta {
check: Some(Meta {
docs: Some("https://example.com/check".to_string()),
..Meta::default()
}),
dupes: None,
health: None,
telemetry: None,
});
let _guard = TelemetryRunIdGuard::set(Some("run_test123"));
let value = serialize_root_output_with_mode(
FallowOutput::Combined(output),
RootEnvelopeMode::Tagged,
)
.expect("combined root should serialize");
assert_eq!(
value["_meta"]["check"]["docs"].as_str(),
Some("https://example.com/check")
);
assert_eq!(
value["_meta"]["telemetry"]["analysis_run_id"].as_str(),
Some("run_test123")
);
}
}