use error_forge::{AppError, ForgeError};
use std::error::Error;
use std::io;
#[derive(Debug)]
pub enum DbError {
ConnectionFailed(String),
QueryFailed(String),
}
impl std::fmt::Display for DbError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::ConnectionFailed(msg) => write!(f, "Connection failed: {}", msg),
Self::QueryFailed(msg) => write!(f, "Query failed: {}", msg),
}
}
}
impl std::error::Error for DbError {}
mod tests {
use super::*;
#[test]
fn test_error_display() {
let error = AppError::config("Missing database URL");
assert_eq!(error.kind(), "Config");
assert_eq!(error.caption(), "⚙️ Configuration");
assert!(!error.is_retryable());
let display = format!("{}", error);
assert!(display.contains("⚙️ Configuration Error"));
assert!(display.contains("Missing database URL"));
}
#[test]
fn test_source_error() {
let io_error = io::Error::new(io::ErrorKind::NotFound, "File not found");
let error = AppError::filesystem("config.json", io_error);
assert_eq!(error.kind(), "Filesystem");
assert!(error.status_code() >= 500);
let display = format!("{}", error);
assert!(display.contains("💾 Filesystem Error"));
assert!(display.contains("config.json"));
let source = error.source().unwrap();
assert!(source.to_string().contains("File not found"));
}
#[test]
fn test_error_conversion() {
let db_err = DbError::ConnectionFailed("Failed to connect to database".to_string());
let app_err = AppError::other(db_err.to_string());
assert!(app_err
.to_string()
.contains("Failed to connect to database"));
}
#[test]
fn test_themed_errors() {
let error = AppError::network("https://api.example.com", None);
let themed_output = format!("{}", error);
assert!(themed_output.contains("🌐 Network Error"));
assert!(themed_output.contains("https://api.example.com"));
}
#[test]
fn test_error_chain() {
let io_err = io::Error::new(io::ErrorKind::PermissionDenied, "Permission denied");
let fs_err = AppError::filesystem("data/config.json", io_err);
let fs_display = format!("{}", fs_err);
assert!(fs_display.contains("Filesystem Error"));
assert!(fs_display.contains("data/config.json"));
let source = fs_err.source().unwrap();
assert!(source.to_string().contains("Permission denied"));
let wrapped_err = AppError::other(format!("Wrapped error: {}", fs_err));
assert!(wrapped_err.to_string().contains("Wrapped error"));
assert!(wrapped_err.to_string().contains("Filesystem Error"));
}
}