1use thiserror::Error;
4
5use ironflow_core::error::OperationError;
6use ironflow_engine::error::EngineError;
7use ironflow_store::error::StoreError;
8
9#[derive(Debug, Error)]
20pub enum WorkerError {
21 #[error("operation error: {0}")]
23 Operation(#[from] OperationError),
24
25 #[error("engine error: {0}")]
27 Engine(#[from] EngineError),
28
29 #[error("store error: {0}")]
31 Store(#[from] StoreError),
32
33 #[error("shutdown error: {0}")]
35 Shutdown(String),
36
37 #[error("internal error: {0}")]
39 Internal(String),
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn shutdown_error_display() {
48 let err = WorkerError::Shutdown("worker stopped".to_string());
49 let msg = err.to_string();
50 assert!(msg.contains("shutdown error"));
51 assert!(msg.contains("worker stopped"));
52 }
53
54 #[test]
55 fn internal_error_display() {
56 let err = WorkerError::Internal("something went wrong".to_string());
57 let msg = err.to_string();
58 assert!(msg.contains("internal error"));
59 assert!(msg.contains("something went wrong"));
60 }
61
62 #[test]
63 fn shutdown_error_debug() {
64 let err = WorkerError::Shutdown("test".to_string());
65 let debug_str = format!("{:?}", err);
66 assert!(debug_str.contains("Shutdown"));
67 }
68
69 #[test]
70 fn internal_error_debug() {
71 let err = WorkerError::Internal("test".to_string());
72 let debug_str = format!("{:?}", err);
73 assert!(debug_str.contains("Internal"));
74 }
75
76 #[test]
77 fn operation_error_display() {
78 use ironflow_core::error::OperationError;
79 use std::time::Duration;
80
81 let op_err = OperationError::Timeout {
82 step: "shell".to_string(),
83 limit: Duration::from_secs(30),
84 };
85 let err = WorkerError::Operation(op_err);
86 let msg = err.to_string();
87 assert!(msg.contains("operation error"));
88 }
89
90 #[test]
91 fn operation_error_from_impl() {
92 use ironflow_core::error::OperationError;
93 use std::time::Duration;
94
95 let op_err = OperationError::Timeout {
96 step: "agent".to_string(),
97 limit: Duration::from_secs(60),
98 };
99 let err: WorkerError = op_err.into();
100 let msg = err.to_string();
101 assert!(msg.contains("operation error"));
102 }
103
104 #[test]
105 fn engine_error_display() {
106 use ironflow_engine::error::EngineError;
107
108 let engine_err = EngineError::InvalidWorkflow("unknown-handler".to_string());
109 let err = WorkerError::Engine(engine_err);
110 let msg = err.to_string();
111 assert!(msg.contains("engine error"));
112 }
113
114 #[test]
115 fn engine_error_from_impl() {
116 use ironflow_engine::error::EngineError;
117
118 let engine_err = EngineError::StepConfig("bad config".to_string());
119 let err: WorkerError = engine_err.into();
120 let msg = err.to_string();
121 assert!(msg.contains("engine error"));
122 }
123
124 #[test]
125 fn store_error_display() {
126 use ironflow_store::error::StoreError;
127 use uuid::Uuid;
128
129 let store_err = StoreError::RunNotFound(Uuid::nil());
130 let err = WorkerError::Store(store_err);
131 let msg = err.to_string();
132 assert!(msg.contains("store error"));
133 }
134
135 #[test]
136 fn store_error_from_impl() {
137 use ironflow_store::error::StoreError;
138 use uuid::Uuid;
139
140 let store_err = StoreError::StepNotFound(Uuid::nil());
141 let err: WorkerError = store_err.into();
142 let msg = err.to_string();
143 assert!(msg.contains("store error"));
144 }
145
146 #[test]
147 fn operation_error_debug() {
148 use ironflow_core::error::OperationError;
149 use std::time::Duration;
150
151 let op_err = OperationError::Timeout {
152 step: "test".to_string(),
153 limit: Duration::from_secs(30),
154 };
155 let err = WorkerError::Operation(op_err);
156 let debug_str = format!("{:?}", err);
157 assert!(debug_str.contains("Operation"));
158 }
159
160 #[test]
161 fn engine_error_debug() {
162 use ironflow_engine::error::EngineError;
163
164 let engine_err = EngineError::InvalidWorkflow("test".to_string());
165 let err = WorkerError::Engine(engine_err);
166 let debug_str = format!("{:?}", err);
167 assert!(debug_str.contains("Engine"));
168 }
169
170 #[test]
171 fn store_error_debug() {
172 use ironflow_store::error::StoreError;
173 use uuid::Uuid;
174
175 let store_err = StoreError::RunNotFound(Uuid::nil());
176 let err = WorkerError::Store(store_err);
177 let debug_str = format!("{:?}", err);
178 assert!(debug_str.contains("Store"));
179 }
180}