use thiserror::Error;
use uuid::Uuid;
use crate::entities::RunStatus;
#[derive(Debug, Error)]
pub enum StoreError {
#[error("run not found: {0}")]
RunNotFound(Uuid),
#[error("step not found: {0}")]
StepNotFound(Uuid),
#[error("invalid status transition: {from} -> {to}")]
InvalidTransition {
from: RunStatus,
to: RunStatus,
},
#[error("email already exists: {0}")]
DuplicateEmail(String),
#[error("username already exists: {0}")]
DuplicateUsername(String),
#[error("user not found: {0}")]
UserNotFound(Uuid),
#[error("database error: {0}")]
Database(String),
#[error("serialization error: {0}")]
Serialization(#[from] serde_json::Error),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn run_not_found_display() {
let id = Uuid::nil();
let err = StoreError::RunNotFound(id);
assert_eq!(err.to_string(), format!("run not found: {id}"));
}
#[test]
fn step_not_found_display() {
let id = Uuid::nil();
let err = StoreError::StepNotFound(id);
assert_eq!(err.to_string(), format!("step not found: {id}"));
}
#[test]
fn invalid_transition_display() {
let err = StoreError::InvalidTransition {
from: RunStatus::Pending,
to: RunStatus::Completed,
};
assert!(err.to_string().contains("Pending"));
assert!(err.to_string().contains("Completed"));
}
#[test]
fn database_error_display() {
let err = StoreError::Database("connection refused".to_string());
assert!(err.to_string().contains("connection refused"));
}
#[test]
fn serialization_error_from_serde() {
let serde_err = serde_json::from_str::<String>("not json").unwrap_err();
let err = StoreError::from(serde_err);
assert!(err.to_string().contains("serialization error"));
}
}