From bb5506c6810583a13a60839276234c5d4a8972df Mon Sep 17 00:00:00 2001 From: Favour Sabo Date: Fri, 28 Aug 2026 00:43:26 +0100 Subject: [PATCH 1/4] test: add dedicated get_admin_before_initialize_fails test to attestation-registry (#185) --- contracts/attestation-registry/src/test.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/contracts/attestation-registry/src/test.rs b/contracts/attestation-registry/src/test.rs index fa714d8..8fa93cb 100644 --- a/contracts/attestation-registry/src/test.rs +++ b/contracts/attestation-registry/src/test.rs @@ -48,6 +48,16 @@ fn configuration_getters_before_initialize_fail() { ); } +#[test] +fn get_admin_before_initialize_fails() { + let env = Env::default(); + let contract_id = env.register(AttestationRegistry, ()); + let client = AttestationRegistryClient::new(&env, &contract_id); + + let result = client.try_get_admin(); + assert_eq!(result, Err(Ok(Error::NotInitialized))); +} + #[test] fn attest_by_allowlisted_attester_succeeds() { let (env, client, attester_registry, _admin) = setup(); From cee43bf8e234a8181aef72393f0b1c6436b5a83e Mon Sep 17 00:00:00 2001 From: Favour Sabo Date: Fri, 28 Aug 2026 00:43:35 +0100 Subject: [PATCH 2/4] test: add dedicated get_attester_registry_before_initialize_fails test to attestation-registry (#186) --- contracts/attestation-registry/src/test.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/contracts/attestation-registry/src/test.rs b/contracts/attestation-registry/src/test.rs index 8fa93cb..de92fea 100644 --- a/contracts/attestation-registry/src/test.rs +++ b/contracts/attestation-registry/src/test.rs @@ -58,6 +58,16 @@ fn get_admin_before_initialize_fails() { assert_eq!(result, Err(Ok(Error::NotInitialized))); } +#[test] +fn get_attester_registry_before_initialize_fails() { + let env = Env::default(); + let contract_id = env.register(AttestationRegistry, ()); + let client = AttestationRegistryClient::new(&env, &contract_id); + + let result = client.try_get_attester_registry(); + assert_eq!(result, Err(Ok(Error::NotInitialized))); +} + #[test] fn attest_by_allowlisted_attester_succeeds() { let (env, client, attester_registry, _admin) = setup(); From fe098c097740be4d18bbb1573ab249bd37d5d422 Mon Sep 17 00:00:00 2001 From: Favour Sabo Date: Fri, 28 Aug 2026 00:44:19 +0100 Subject: [PATCH 3/4] test: add first unit tests for lafiya-cli argument parsing (#187) --- crates/lafiya-cli/src/main.rs | 43 ++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/crates/lafiya-cli/src/main.rs b/crates/lafiya-cli/src/main.rs index 2b160a5..a7e37a9 100644 --- a/crates/lafiya-cli/src/main.rs +++ b/crates/lafiya-cli/src/main.rs @@ -357,7 +357,6 @@ fn main() -> anyhow::Result<()> { Ok(()) } -// Tiny which implementation to avoid extra dep if not available, but we add which crate feature? We'll implement simple check mod which { use std::path::Path; @@ -386,3 +385,45 @@ mod which { Err(()) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_config_list_succeeds() { + let args = vec!["lafiya-cli", "config", "list"]; + let result = Cli::try_parse_from(args); + + assert!(result.is_ok()); + let cli = result.unwrap(); + assert_eq!(cli.network, "testnet"); + assert!(cli.config.is_none()); + match cli.command { + Commands::Config { sub: ConfigSub::List } => {} + _ => panic!("Expected Config List command"), + } + } + + #[test] + fn parse_config_list_with_explicit_network_succeeds() { + let args = vec!["lafiya-cli", "--network", "mainnet", "config", "list"]; + let result = Cli::try_parse_from(args); + + assert!(result.is_ok()); + let cli = result.unwrap(); + assert_eq!(cli.network, "mainnet"); + match cli.command { + Commands::Config { sub: ConfigSub::List } => {} + _ => panic!("Expected Config List command"), + } + } + + #[test] + fn parse_missing_subcommand_fails() { + let args = vec!["lafiya-cli"]; + let result = Cli::try_parse_from(args); + + assert!(result.is_err()); + } +} From c6cc8ff48af6e6d3cd58ccb95147b563ed660aff Mon Sep 17 00:00:00 2001 From: Favour Sabo Date: Fri, 28 Aug 2026 00:45:10 +0100 Subject: [PATCH 4/4] test: add lafiya-cli config-loading error-path tests for missing/malformed config (#188) --- crates/lafiya-cli/Cargo.toml | 3 +++ crates/lafiya-cli/src/main.rs | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/crates/lafiya-cli/Cargo.toml b/crates/lafiya-cli/Cargo.toml index f3151c3..c91f0b8 100644 --- a/crates/lafiya-cli/Cargo.toml +++ b/crates/lafiya-cli/Cargo.toml @@ -16,3 +16,6 @@ clap = { version = "4.5", features = ["derive"] } serde = { version = "1.0", features = ["derive"] } toml = "1.1" anyhow = "1.0" + +[dev-dependencies] +tempfile = "3.10" diff --git a/crates/lafiya-cli/src/main.rs b/crates/lafiya-cli/src/main.rs index a7e37a9..9ff5f3e 100644 --- a/crates/lafiya-cli/src/main.rs +++ b/crates/lafiya-cli/src/main.rs @@ -389,6 +389,8 @@ mod which { #[cfg(test)] mod tests { use super::*; + use std::io::Write; + use tempfile::NamedTempFile; #[test] fn parse_config_list_succeeds() { @@ -426,4 +428,35 @@ mod tests { assert!(result.is_err()); } + + #[test] + fn load_networks_from_missing_file_returns_handled_error() { + let nonexistent_path = std::path::PathBuf::from("/nonexistent/path/networks.toml"); + let result = load_networks(Some(&nonexistent_path)); + + assert!(result.is_err()); + match result { + Err(lafiya_config::ConfigError::NotFound(path)) => { + assert_eq!(path, nonexistent_path); + } + other => panic!("Expected ConfigError::NotFound, got: {:?}", other), + } + } + + #[test] + fn load_networks_from_malformed_toml_returns_handled_error() { + let mut file = NamedTempFile::new().unwrap(); + file.write_all(b"[invalid\nthis is not valid toml").unwrap(); + file.flush().unwrap(); + + let result = load_networks(Some(file.path())); + + assert!(result.is_err()); + match result { + Err(lafiya_config::ConfigError::ParseError { path, .. }) => { + assert_eq!(path, file.path()); + } + other => panic!("Expected ConfigError::ParseError, got: {:?}", other), + } + } }