use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
#[serde(default)]
pub struct JobTailRequest {
pub result_id: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
#[serde(default)]
pub struct JobTailReply {
pub found: bool,
pub running: bool,
pub stdout: String,
pub stderr: String,
pub stdout_truncated: bool,
pub stderr_truncated: bool,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn request_round_trips() {
let req = JobTailRequest {
result_id: "abc-123".into(),
};
let json = serde_json::to_string(&req).unwrap();
let back: JobTailRequest = serde_json::from_str(&json).unwrap();
assert_eq!(back.result_id, "abc-123");
}
#[test]
fn request_missing_field_defaults_empty() {
let req: JobTailRequest = serde_json::from_str("{}").unwrap();
assert_eq!(req.result_id, "");
}
#[test]
fn reply_defaults_are_not_found() {
let reply = JobTailReply::default();
assert!(!reply.found);
assert!(!reply.running);
assert!(reply.stdout.is_empty());
}
#[test]
fn reply_round_trips() {
let reply = JobTailReply {
found: true,
running: true,
stdout: "hello".into(),
stderr: "".into(),
stdout_truncated: true,
stderr_truncated: false,
};
let json = serde_json::to_string(&reply).unwrap();
let back: JobTailReply = serde_json::from_str(&json).unwrap();
assert!(back.found);
assert!(back.running);
assert_eq!(back.stdout, "hello");
assert!(back.stdout_truncated);
}
}