diff --git a/crates/cdk-sqlite/src/mint/error.rs b/crates/cdk-sqlite/src/mint/error.rs index eea510a5..ad521063 100644 --- a/crates/cdk-sqlite/src/mint/error.rs +++ b/crates/cdk-sqlite/src/mint/error.rs @@ -92,6 +92,9 @@ pub enum Error { /// Unknown quote TTL #[error("Unknown quote TTL")] UnknownQuoteTTL, + /// Unknown config key + #[error("Unknown config key: {0}")] + UnknownConfigKey(String), /// Proof not found #[error("Proof not found")] ProofNotFound, diff --git a/crates/cdk-sqlite/src/mint/mod.rs b/crates/cdk-sqlite/src/mint/mod.rs index f4cf3e92..6f6cd03c 100644 --- a/crates/cdk-sqlite/src/mint/mod.rs +++ b/crates/cdk-sqlite/src/mint/mod.rs @@ -130,7 +130,11 @@ impl MintSqliteDatabase { .bind(":id", id.to_owned()) .pluck(&self.pool) .await? - .ok_or::(Error::UnknownQuoteTTL)?); + .ok_or_else(|| match id { + "mint_info" => Error::UnknownMintInfo, + "quote_ttl" => Error::UnknownQuoteTTL, + unknown => Error::UnknownConfigKey(unknown.to_string()), + })?); Ok(serde_json::from_str(&value)?) } @@ -1651,4 +1655,96 @@ mod tests { let _ = remove_file(&file); } + + #[tokio::test] + async fn test_fetch_from_config_error_handling() { + use cdk_common::common::QuoteTTL; + use cdk_common::MintInfo; + + let db = memory::empty().await.unwrap(); + + // Test 1: Unknown mint_info should return UnknownMintInfo error + let result: Result = db.fetch_from_config("mint_info").await; + assert!(result.is_err()); + assert!(matches!(result.unwrap_err(), Error::UnknownMintInfo)); + + // Test 2: Unknown quote_ttl should return UnknownQuoteTTL error + let result: Result = db.fetch_from_config("quote_ttl").await; + assert!(result.is_err()); + assert!(matches!(result.unwrap_err(), Error::UnknownQuoteTTL)); + + // Test 3: Unknown config key should return UnknownConfigKey error + let result: Result = db.fetch_from_config("unknown_config_key").await; + assert!(result.is_err()); + match result.unwrap_err() { + Error::UnknownConfigKey(key) => { + assert_eq!(key, "unknown_config_key"); + } + other => panic!("Expected UnknownConfigKey error, got: {:?}", other), + } + + // Test 4: Another unknown config key with different name + let result: Result = db.fetch_from_config("some_other_key").await; + assert!(result.is_err()); + match result.unwrap_err() { + Error::UnknownConfigKey(key) => { + assert_eq!(key, "some_other_key"); + } + other => panic!("Expected UnknownConfigKey error, got: {:?}", other), + } + } + + #[tokio::test] + async fn test_config_round_trip() { + use cdk_common::common::QuoteTTL; + use cdk_common::{MintInfo, Nuts}; + + let db = memory::empty().await.unwrap(); + + // Test mint_info round trip + let mint_info = MintInfo { + name: Some("Test Mint".to_string()), + description: Some("A test mint".to_string()), + pubkey: None, + version: None, + description_long: None, + contact: None, + nuts: Nuts::default(), + icon_url: None, + urls: None, + motd: None, + time: None, + tos_url: None, + }; + + // Store mint_info + let mut tx = cdk_common::database::MintDatabase::begin_transaction(&db) + .await + .unwrap(); + tx.set_mint_info(mint_info.clone()).await.unwrap(); + tx.commit().await.unwrap(); + + // Retrieve mint_info + let retrieved_mint_info: MintInfo = db.fetch_from_config("mint_info").await.unwrap(); + assert_eq!(mint_info.name, retrieved_mint_info.name); + assert_eq!(mint_info.description, retrieved_mint_info.description); + + // Test quote_ttl round trip + let quote_ttl = QuoteTTL { + mint_ttl: 3600, + melt_ttl: 1800, + }; + + // Store quote_ttl + let mut tx = cdk_common::database::MintDatabase::begin_transaction(&db) + .await + .unwrap(); + tx.set_quote_ttl(quote_ttl.clone()).await.unwrap(); + tx.commit().await.unwrap(); + + // Retrieve quote_ttl + let retrieved_quote_ttl: QuoteTTL = db.fetch_from_config("quote_ttl").await.unwrap(); + assert_eq!(quote_ttl.mint_ttl, retrieved_quote_ttl.mint_ttl); + assert_eq!(quote_ttl.melt_ttl, retrieved_quote_ttl.melt_ttl); + } }