mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-10-07 03:00:29 +00:00
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>
115 lines
2.7 KiB
Rust
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())
|
|
);
|
|
}
|