fabro/lib/crates/fabro-config/tests/resolve_root.rs
Bryan Helmkamp 8014f61054 chore(lint): fix all clippy warnings including --tests
Resolve every clippy warning across the workspace when running with
--tests enabled. Previously only library code was lint-clean; test
code had accumulated issues that were invisible without --tests.

Fixes:
- redundant_closure_for_method_calls: |s| s.as_source() -> InterpString::as_source
  (effective_settings, resolve_cli/root/server/features, run_event/record_serde,
  materialize_run) — add InterpString imports where needed
- absolute_paths: inline fabro_types::settings::* paths -> use imports;
  add #![allow(clippy::absolute_paths)] to fabro-cli and fabro-server
  IT test harnesses (matching the existing pattern in integration.rs)
- bool_assert_comparison: assert_eq!(x, true) -> assert!(x)
- needless_raw_string_hashes: r#"..."# -> r"..." where no inner quotes
- field_reassign_with_default: mut + field assign -> struct literal with ..Default
- match_same_arms: merge Timeout | Disconnected arms in attach.rs
- needless_pass_by_value: signal_rx by ref in attach.rs
- unreadable_literal: 9999999999 -> 9_999_999_999
- default_trait_access: Default::default() -> BTreeMap::default()
- items_after_statements: move use to function top
- large_futures: allow in integration.rs test module (test-only, not prod)
- filter_map_bool_then: .filter_map(bool::then) -> .filter().map()

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 10:16:24 -04:00

115 lines
2.7 KiB
Rust

use fabro_config::effective_settings::{EffectiveSettingsLayers, EffectiveSettingsMode};
use fabro_config::parse_settings_layer;
use fabro_types::settings::{InterpString, SettingsLayer};
fn parse(source: &str) -> SettingsLayer {
parse_settings_layer(source).expect("fixture should parse")
}
#[test]
fn resolves_root_settings_defaults() {
let settings =
fabro_config::resolve(&SettingsLayer::default()).expect("empty settings should resolve");
assert_eq!(settings.project.directory, "fabro/");
assert_eq!(settings.workflow.graph, "workflow.fabro");
assert!(settings.run.execution.retros);
assert!(settings.cli.updates.check);
assert_eq!(settings.server.scheduler.max_concurrent_runs, 5);
assert!(!settings.features.session_sandboxes);
}
#[test]
fn resolve_accumulates_errors_across_namespaces() {
let settings = parse(
r#"
_version = 1
[server.listen]
type = "tcp"
address = "127.0.0.1:3000"
[server.listen.tls]
cert = "/tmp/server.pem"
[server.auth.api.mtls]
enabled = true
[run.sandbox]
provider = "not-a-provider"
"#,
);
let errors = fabro_config::resolve(&settings).expect_err("invalid shape should fail");
let rendered = errors
.into_iter()
.map(|error| error.to_string())
.collect::<Vec<_>>()
.join("\n");
assert!(rendered.contains("server.listen.tls.key"));
assert!(rendered.contains("server.listen.tls.ca"));
assert!(rendered.contains("run.sandbox.provider"));
}
#[test]
fn load_and_resolve_merges_layers_before_resolution() {
let settings = fabro_config::load_and_resolve(
EffectiveSettingsLayers::new(
SettingsLayer::default(),
parse(
r#"
_version = 1
[workflow]
graph = "graphs/workflow.dot"
"#,
),
parse(
r#"
_version = 1
[project]
directory = ".fabro"
"#,
),
parse(
r#"
_version = 1
[server.storage]
root = "/srv/fabro"
[run.model]
provider = "openai"
name = "gpt-5"
"#,
),
),
None,
EffectiveSettingsMode::LocalOnly,
)
.expect("layers should load and resolve");
assert_eq!(settings.project.directory, ".fabro");
assert_eq!(settings.workflow.graph, "graphs/workflow.dot");
assert_eq!(settings.server.storage.root.as_source(), "/srv/fabro");
assert_eq!(
settings
.run
.model
.provider
.as_ref()
.map(InterpString::as_source),
Some("openai".to_string())
);
assert_eq!(
settings
.run
.model
.name
.as_ref()
.map(InterpString::as_source),
Some("gpt-5".to_string())
);
}