use super::*; use crate::config_toml::ConfigToml; use crate::diagnostics::TextPosition; use crate::diagnostics::TextRange; use pretty_assertions::assert_eq; use std::path::PathBuf; #[test] fn ignored_toml_field_errors_accept_non_file_source_names() { let source_name = "com.openai.codex:config_toml_base64"; let contents = r#" model = "gpt-5" unknown_key = true"#; let value = toml::from_str::(contents).expect("valid TOML"); let error = config_error_from_ignored_toml_value_fields_for_source_name::( source_name, contents, value, ) .expect("unknown field error"); assert_eq!( error, ConfigError::new( PathBuf::from(source_name), TextRange { start: TextPosition { line: 3, column: 1 }, end: TextPosition { line: 3, column: 11, }, }, "unknown configuration field `unknown_key`", ) ); } #[test] fn type_errors_take_precedence_over_ignored_fields() { let path = Path::new("/tmp/config.toml"); let contents = r#" model_context_window = "wide" unknown_key = true"#; let error = config_error_from_ignored_toml_fields::(path, contents).expect("type error"); assert_eq!( error, ConfigError::new( path.to_path_buf(), TextRange { start: TextPosition { line: 2, column: 24, }, end: TextPosition { line: 2, column: 29, }, }, "invalid type: string \"wide\", expected i64", ) ); } #[test] fn strict_config_rejects_unknown_feature_key() { let path = Path::new("/tmp/config.toml"); let contents = r#" [features] foo = true"#; let error = config_error_from_ignored_toml_fields::(path, contents) .expect("unknown feature error"); assert_eq!( error, ConfigError::new( path.to_path_buf(), TextRange { start: TextPosition { line: 3, column: 1 }, end: TextPosition { line: 3, column: 3 }, }, "unknown configuration field `features.foo`", ) ); } #[test] fn strict_config_rejects_unknown_profile_feature_key() { let path = Path::new("/tmp/config.toml"); let contents = r#" [profiles.work.features] foo = true"#; let error = config_error_from_ignored_toml_fields::(path, contents) .expect("unknown feature error"); assert_eq!( error, ConfigError::new( path.to_path_buf(), TextRange { start: TextPosition { line: 3, column: 1 }, end: TextPosition { line: 3, column: 3 }, }, "unknown configuration field `profiles.work.features.foo`", ) ); } #[test] fn strict_config_accepts_opaque_desktop_keys() { let path = Path::new("/tmp/config.toml"); let contents = r#" [desktop] appearanceTheme = "dark" [desktop.workspace] collapsed = true"#; let error = config_error_from_ignored_toml_fields::(path, contents); assert_eq!(error, None); }