From 261ec0bb6d73acc3a79160cd09422aa70d546061 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 15 Sep 2025 10:24:17 -0600 Subject: [PATCH] test: Fixed Windows CLI tests (forgot to add unix cfg check) --- src/bin/gman/main.rs | 4 +- src/config.rs | 28 ++++++------- src/providers/git_sync.rs | 12 +++--- tests/bin/cli_tests.rs | 85 ++++++++++++++++++++------------------- tests/config_tests.rs | 16 ++++---- 5 files changed, 73 insertions(+), 72 deletions(-) diff --git a/src/bin/gman/main.rs b/src/bin/gman/main.rs index 97c4552..1511332 100644 --- a/src/bin/gman/main.rs +++ b/src/bin/gman/main.rs @@ -11,11 +11,11 @@ use std::io::{self, IsTerminal, Read, Write}; use std::panic::PanicHookInfo; use crate::cli::wrap_and_run_command; +use crate::utils::persist_config_file; use dialoguer::Editor; use std::panic; use std::process::exit; use validator::Validate; -use crate::utils::persist_config_file; mod cli; mod command; @@ -242,7 +242,7 @@ async fn main() -> Result<()> { new_config .validate() .with_context(|| "updated configuration is invalid")?; - persist_config_file(&new_config)?; + persist_config_file(&new_config)?; println!("✓ Configuration updated successfully"); } Commands::Sync {} => { diff --git a/src/config.rs b/src/config.rs index 81a7201..5c403e0 100644 --- a/src/config.rs +++ b/src/config.rs @@ -20,10 +20,10 @@ //! rc.validate().unwrap(); //! ``` -use collections::HashSet; use crate::providers::local::LocalProvider; use crate::providers::{SecretProvider, SupportedProvider}; use anyhow::{Context, Result}; +use collections::HashSet; use log::debug; use serde::{Deserialize, Serialize}; use serde_with::serde_as; @@ -215,19 +215,19 @@ fn default_provider_exists(config: &Config) -> Result<(), ValidationError> { } fn providers_names_are_unique(config: &Config) -> Result<(), ValidationError> { - let mut names = HashSet::new(); - for provider in &config.providers { - if let Some(name) = &provider.name { - if !names.insert(name) { - let mut err = ValidationError::new("duplicate_provider_name"); - err.message = Some(Cow::Borrowed( - "Provider names must be unique; duplicate found", - )); - return Err(err); - } - } - } - Ok(()) + let mut names = HashSet::new(); + for provider in &config.providers { + if let Some(name) = &provider.name + && !names.insert(name) + { + let mut err = ValidationError::new("duplicate_provider_name"); + err.message = Some(Cow::Borrowed( + "Provider names must be unique; duplicate found", + )); + return Err(err); + } + } + Ok(()) } impl Default for Config { diff --git a/src/providers/git_sync.rs b/src/providers/git_sync.rs index 441ae4d..68647ea 100644 --- a/src/providers/git_sync.rs +++ b/src/providers/git_sync.rs @@ -140,15 +140,15 @@ pub(in crate::providers) fn resolve_git(override_path: Option<&PathBuf>) -> Resu } pub(in crate::providers) fn default_git_username(git: &Path) -> Result { - debug!("Checking for default git username"); - run_git_config_capture(git, &["config", "user.name"]) - .with_context(|| "unable to determine git user name") + debug!("Checking for default git username"); + run_git_config_capture(git, &["config", "user.name"]) + .with_context(|| "unable to determine git user name") } pub(in crate::providers) fn default_git_email(git: &Path) -> Result { - debug!("Checking for default git username"); - run_git_config_capture(git, &["config", "user.email"]) - .with_context(|| "unable to determine git user email") + debug!("Checking for default git username"); + run_git_config_capture(git, &["config", "user.email"]) + .with_context(|| "unable to determine git user email") } pub(in crate::providers) fn ensure_git_available(git: &Path) -> Result<()> { diff --git a/tests/bin/cli_tests.rs b/tests/bin/cli_tests.rs index 32e92d1..ff42b5d 100644 --- a/tests/bin/cli_tests.rs +++ b/tests/bin/cli_tests.rs @@ -1,6 +1,7 @@ use assert_cmd::prelude::*; use predicates::prelude::*; use std::fs; +#[cfg(unix)] use std::os::unix::fs::PermissionsExt; use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; @@ -53,40 +54,40 @@ providers: #[test] #[cfg(unix)] fn cli_config_no_changes() { - let (td, xdg_cfg, xdg_cache) = setup_env(); - let pw_file = td.path().join("pw.txt"); - fs::write(&pw_file, b"pw\n").unwrap(); - write_yaml_config(&xdg_cfg, &pw_file, None); + let (td, xdg_cfg, xdg_cache) = setup_env(); + let pw_file = td.path().join("pw.txt"); + fs::write(&pw_file, b"pw\n").unwrap(); + write_yaml_config(&xdg_cfg, &pw_file, None); - // Create a no-op editor script that exits successfully without modifying the file - let editor = td.path().join("noop-editor.sh"); - fs::write(&editor, b"#!/bin/sh\nexit 0\n").unwrap(); - let mut perms = fs::metadata(&editor).unwrap().permissions(); - perms.set_mode(0o755); - fs::set_permissions(&editor, perms).unwrap(); + // Create a no-op editor script that exits successfully without modifying the file + let editor = td.path().join("noop-editor.sh"); + fs::write(&editor, b"#!/bin/sh\nexit 0\n").unwrap(); + let mut perms = fs::metadata(&editor).unwrap().permissions(); + perms.set_mode(0o755); + fs::set_permissions(&editor, perms).unwrap(); - let mut cmd = Command::cargo_bin("gman").unwrap(); - cmd.env("XDG_CONFIG_HOME", &xdg_cfg) - .env("XDG_CACHE_HOME", &xdg_cache) - .env("EDITOR", &editor) - .arg("config"); + let mut cmd = Command::cargo_bin("gman").unwrap(); + cmd.env("XDG_CONFIG_HOME", &xdg_cfg) + .env("XDG_CACHE_HOME", &xdg_cache) + .env("EDITOR", &editor) + .arg("config"); - cmd.assert() - .success() - .stdout(predicate::str::contains("No changes made to configuration")); + cmd.assert() + .success() + .stdout(predicate::str::contains("No changes made to configuration")); } #[test] #[cfg(unix)] fn cli_config_updates_and_persists() { - let (td, xdg_cfg, xdg_cache) = setup_env(); - let pw_file = td.path().join("pw.txt"); - fs::write(&pw_file, b"pw\n").unwrap(); - write_yaml_config(&xdg_cfg, &pw_file, None); + let (td, xdg_cfg, xdg_cache) = setup_env(); + let pw_file = td.path().join("pw.txt"); + fs::write(&pw_file, b"pw\n").unwrap(); + write_yaml_config(&xdg_cfg, &pw_file, None); - // Editor script appends a valid run_configs section to the YAML file - let editor = td.path().join("append-run-config.sh"); - let script = r#"#!/bin/sh + // Editor script appends a valid run_configs section to the YAML file + let editor = td.path().join("append-run-config.sh"); + let script = r#"#!/bin/sh FILE="$1" cat >> "$FILE" <<'EOF' run_configs: @@ -95,26 +96,26 @@ run_configs: EOF exit 0 "#; - fs::write(&editor, script.as_bytes()).unwrap(); - let mut perms = fs::metadata(&editor).unwrap().permissions(); - perms.set_mode(0o755); - fs::set_permissions(&editor, perms).unwrap(); + fs::write(&editor, script.as_bytes()).unwrap(); + let mut perms = fs::metadata(&editor).unwrap().permissions(); + perms.set_mode(0o755); + fs::set_permissions(&editor, perms).unwrap(); - let mut cmd = Command::cargo_bin("gman").unwrap(); - cmd.env("XDG_CONFIG_HOME", &xdg_cfg) - .env("XDG_CACHE_HOME", &xdg_cache) - .env("EDITOR", &editor) - .arg("config"); + let mut cmd = Command::cargo_bin("gman").unwrap(); + cmd.env("XDG_CONFIG_HOME", &xdg_cfg) + .env("XDG_CACHE_HOME", &xdg_cache) + .env("EDITOR", &editor) + .arg("config"); - cmd.assert() - .success() - .stdout(predicate::str::contains("Configuration updated successfully")); + cmd.assert().success().stdout(predicate::str::contains( + "Configuration updated successfully", + )); - // Verify that the config file now contains the run_configs key - let cfg_path = xdg_cfg.join("gman").join("config.yml"); - let written = fs::read_to_string(&cfg_path).expect("config file readable"); - assert!(written.contains("run_configs:")); - assert!(written.contains("name: echo")); + // Verify that the config file now contains the run_configs key + let cfg_path = xdg_cfg.join("gman").join("config.yml"); + let written = fs::read_to_string(&cfg_path).expect("config file readable"); + assert!(written.contains("run_configs:")); + assert!(written.contains("name: echo")); } #[test] diff --git a/tests/config_tests.rs b/tests/config_tests.rs index 61fc2c7..a14b354 100644 --- a/tests/config_tests.rs +++ b/tests/config_tests.rs @@ -1,6 +1,6 @@ #[cfg(test)] mod tests { - use gman::config::{Config, ProviderConfig, RunConfig}; + use gman::config::{Config, ProviderConfig, RunConfig}; use pretty_assertions::assert_eq; use validator::Validate; @@ -255,15 +255,15 @@ mod tests { #[test] fn test_config_duplicate_provider_names_is_invalid() { - let name = Some("dup".into()); + let name = Some("dup".into()); let p1 = ProviderConfig { - name: name.clone(), - ..Default::default() - }; + name: name.clone(), + ..Default::default() + }; let p2 = ProviderConfig { - name, - ..Default::default() - }; + name, + ..Default::default() + }; let cfg = Config { default_provider: Some("dup".into()),