diff --git a/src/config.rs b/src/config.rs index 02506b7..bf91ba3 100644 --- a/src/config.rs +++ b/src/config.rs @@ -104,6 +104,7 @@ pub struct MountSpec { pub enum MountProvider { Icloud, GoogleDrive, + #[serde(rename = "onedrive", alias = "one-drive")] OneDrive, } @@ -812,4 +813,32 @@ windows = "none" let decoded: Config = toml::from_str(&encoded).unwrap(); assert_eq!(decoded, config); } + + #[test] + fn onedrive_accepts_legacy_spelling_and_serializes_canonical_name() { + for provider in ["onedrive", "one-drive"] { + let config: Config = toml::from_str(&format!( + "[mounts.work]\nprovider = \"{provider}\"\naccount = \"business\"\n" + )) + .unwrap(); + assert_eq!(config.validate(), Ok(())); + assert_eq!( + config.mounts["work"].provider, + Some(MountProvider::OneDrive) + ); + assert_eq!( + config.mounts["work"].account, + Some(OneDriveAccount::Business) + ); + + let encoded = toml::to_string_pretty(&config).unwrap(); + let document: toml::Value = toml::from_str(&encoded).unwrap(); + assert_eq!( + document["mounts"]["work"]["provider"].as_str(), + Some("onedrive") + ); + let decoded: Config = toml::from_str(&encoded).unwrap(); + assert_eq!(decoded, config); + } + } } diff --git a/tests/config_mounts_integration.rs b/tests/config_mounts_integration.rs index fdea92c..02809b4 100644 --- a/tests/config_mounts_integration.rs +++ b/tests/config_mounts_integration.rs @@ -93,6 +93,34 @@ impl Fixture { } } +#[test] +fn completions_accept_documented_and_legacy_onedrive_configs() { + let temp = TempDir::new("onedrive-config"); + let config = temp.path().join("config.toml"); + for provider in ["onedrive", "one-drive"] { + fs::write( + &config, + format!( + "[mounts]\nonedrive-work = {{ provider = \"{provider}\", account = \"business\" }}\n" + ), + ) + .unwrap(); + let output = cj(temp.path(), temp.path()) + .arg("-C") + .arg(&config) + .args(["completions", "bash"]) + .output() + .unwrap(); + assert_success(&output); + assert!(output.stderr.is_empty()); + assert!( + String::from_utf8(output.stdout) + .unwrap() + .contains("'onedrive-work'") + ); + } +} + #[test] fn resolves_aliases_and_explicit_mounts_with_resolver_controls() { let fixture = Fixture::new("configured-destinations");