socktop-webterm/tests/terminado_tests.rs
jasonwitty 850cf32b50
All checks were successful
Build and Deploy to K3s / test (push) Successful in 2m40s
Build and Deploy to K3s / lint (push) Successful in 1m33s
Build and Deploy to K3s / build-and-push (push) Successful in 5m17s
Build and Deploy to K3s / deploy (push) Successful in 9s
- add cargo fmt / clippy to actions build. - add common unit tests. -
improved security sanitization - security spcecific unit tests - add
unit tests to workflow build - add unami analytics.
2025-11-30 01:37:07 -08:00

312 lines
9.0 KiB
Rust

// Copyright (c) 2024 Jason Witty <jasonpwitty+socktop@proton.me>.
// All rights reserved.
//
// Unit tests for terminado.rs module
use webterm::event::IO;
use webterm::terminado::TerminadoMessage;
// ============================================================================
// Serialization Tests
// ============================================================================
#[test]
fn test_serialize_resize() {
let msg = TerminadoMessage::Resize { rows: 25, cols: 80 };
let json = serde_json::to_string(&msg).unwrap();
assert_eq!(json, r#"["set_size",25,80]"#);
}
#[test]
fn test_serialize_resize_large_dimensions() {
let msg = TerminadoMessage::Resize {
rows: 200,
cols: 300,
};
let json = serde_json::to_string(&msg).unwrap();
assert_eq!(json, r#"["set_size",200,300]"#);
}
#[test]
fn test_serialize_resize_minimum() {
let msg = TerminadoMessage::Resize { rows: 1, cols: 1 };
let json = serde_json::to_string(&msg).unwrap();
assert_eq!(json, r#"["set_size",1,1]"#);
}
#[test]
fn test_serialize_stdin() {
let msg = TerminadoMessage::Stdin(IO::from("hello world"));
let json = serde_json::to_string(&msg).unwrap();
assert_eq!(json, r#"["stdin","hello world"]"#);
}
#[test]
fn test_serialize_stdin_empty() {
let msg = TerminadoMessage::Stdin(IO::from(""));
let json = serde_json::to_string(&msg).unwrap();
assert_eq!(json, r#"["stdin",""]"#);
}
#[test]
fn test_serialize_stdin_special_chars() {
let msg = TerminadoMessage::Stdin(IO::from("tab\there\nnewline"));
let json = serde_json::to_string(&msg).unwrap();
assert_eq!(json, r#"["stdin","tab\there\nnewline"]"#);
}
#[test]
fn test_serialize_stdin_unicode() {
let msg = TerminadoMessage::Stdin(IO::from("Hello 世界 🚀"));
let json = serde_json::to_string(&msg).unwrap();
assert_eq!(json, r#"["stdin","Hello 世界 🚀"]"#);
}
#[test]
fn test_serialize_stdout() {
let msg = TerminadoMessage::Stdout(IO::from("output text"));
let json = serde_json::to_string(&msg).unwrap();
assert_eq!(json, r#"["stdout","output text"]"#);
}
#[test]
fn test_serialize_stdout_empty() {
let msg = TerminadoMessage::Stdout(IO::from(""));
let json = serde_json::to_string(&msg).unwrap();
assert_eq!(json, r#"["stdout",""]"#);
}
#[test]
fn test_serialize_stdout_multiline() {
let msg = TerminadoMessage::Stdout(IO::from("line1\nline2\nline3"));
let json = serde_json::to_string(&msg).unwrap();
assert_eq!(json, r#"["stdout","line1\nline2\nline3"]"#);
}
// ============================================================================
// Deserialization Tests
// ============================================================================
#[test]
fn test_deserialize_resize() {
let json = r#"["set_size", 25, 80]"#;
let msg = TerminadoMessage::from_json(json).expect("Failed to parse");
assert_eq!(msg, TerminadoMessage::Resize { rows: 25, cols: 80 });
}
#[test]
fn test_deserialize_resize_no_spaces() {
let json = r#"["set_size",25,80]"#;
let msg = TerminadoMessage::from_json(json).expect("Failed to parse");
assert_eq!(msg, TerminadoMessage::Resize { rows: 25, cols: 80 });
}
#[test]
fn test_deserialize_resize_large() {
let json = r#"["set_size", 300, 500]"#;
let msg = TerminadoMessage::from_json(json).expect("Failed to parse");
assert_eq!(
msg,
TerminadoMessage::Resize {
rows: 300,
cols: 500
}
);
}
#[test]
fn test_deserialize_stdin() {
let json = r#"["stdin", "hello world"]"#;
let msg = TerminadoMessage::from_json(json).expect("Failed to parse");
assert_eq!(msg, TerminadoMessage::Stdin(IO::from("hello world")));
}
#[test]
fn test_deserialize_stdin_empty() {
let json = r#"["stdin", ""]"#;
let msg = TerminadoMessage::from_json(json).expect("Failed to parse");
assert_eq!(msg, TerminadoMessage::Stdin(IO::from("")));
}
#[test]
fn test_deserialize_stdin_special_chars() {
let json = r#"["stdin", "tab\there\nnewline"]"#;
let msg = TerminadoMessage::from_json(json).expect("Failed to parse");
assert_eq!(msg, TerminadoMessage::Stdin(IO::from("tab\there\nnewline")));
}
#[test]
fn test_deserialize_stdin_unicode() {
let json = r#"["stdin", "Hello 世界 🚀"]"#;
let msg = TerminadoMessage::from_json(json).expect("Failed to parse");
assert_eq!(msg, TerminadoMessage::Stdin(IO::from("Hello 世界 🚀")));
}
#[test]
fn test_deserialize_stdout() {
let json = r#"["stdout", "output text"]"#;
let msg = TerminadoMessage::from_json(json).expect("Failed to parse");
assert_eq!(msg, TerminadoMessage::Stdout(IO::from("output text")));
}
#[test]
fn test_deserialize_stdout_empty() {
let json = r#"["stdout", ""]"#;
let msg = TerminadoMessage::from_json(json).expect("Failed to parse");
assert_eq!(msg, TerminadoMessage::Stdout(IO::from("")));
}
// ============================================================================
// Round-trip Tests (Serialize then Deserialize)
// ============================================================================
#[test]
fn test_roundtrip_resize() {
let original = TerminadoMessage::Resize {
rows: 40,
cols: 120,
};
let json = serde_json::to_string(&original).unwrap();
let parsed = TerminadoMessage::from_json(&json).expect("Failed to parse");
assert_eq!(original, parsed);
}
#[test]
fn test_roundtrip_stdin() {
let original = TerminadoMessage::Stdin(IO::from("test input"));
let json = serde_json::to_string(&original).unwrap();
let parsed = TerminadoMessage::from_json(&json).expect("Failed to parse");
assert_eq!(original, parsed);
}
#[test]
fn test_roundtrip_stdout() {
let original = TerminadoMessage::Stdout(IO::from("test output"));
let json = serde_json::to_string(&original).unwrap();
let parsed = TerminadoMessage::from_json(&json).expect("Failed to parse");
assert_eq!(original, parsed);
}
// ============================================================================
// Error Cases
// ============================================================================
#[test]
fn test_deserialize_invalid_json() {
let json = r#"not valid json"#;
let result = TerminadoMessage::from_json(json);
assert!(result.is_err());
}
#[test]
fn test_deserialize_not_array() {
let json = r#"{"type": "stdin", "data": "test"}"#;
let result = TerminadoMessage::from_json(json);
assert!(result.is_err());
}
#[test]
fn test_deserialize_empty_array() {
let json = r#"[]"#;
let result = TerminadoMessage::from_json(json);
assert!(result.is_err());
}
#[test]
fn test_deserialize_unknown_type() {
let json = r#"["unknown_type", "data"]"#;
let result = TerminadoMessage::from_json(json);
assert!(result.is_err());
}
#[test]
fn test_deserialize_stdin_wrong_length() {
let json = r#"["stdin"]"#;
let result = TerminadoMessage::from_json(json);
assert!(result.is_err());
}
#[test]
fn test_deserialize_stdin_too_many_elements() {
let json = r#"["stdin", "data", "extra"]"#;
let result = TerminadoMessage::from_json(json);
assert!(result.is_err());
}
#[test]
fn test_deserialize_stdout_wrong_length() {
let json = r#"["stdout"]"#;
let result = TerminadoMessage::from_json(json);
assert!(result.is_err());
}
#[test]
fn test_deserialize_resize_wrong_length() {
let json = r#"["set_size", 25]"#;
let result = TerminadoMessage::from_json(json);
assert!(result.is_err());
}
#[test]
fn test_deserialize_resize_missing_rows() {
let json = r#"["set_size"]"#;
let result = TerminadoMessage::from_json(json);
assert!(result.is_err());
}
#[test]
fn test_deserialize_resize_non_integer() {
let json = r#"["set_size", "25", "80"]"#;
let result = TerminadoMessage::from_json(json);
assert!(result.is_err());
}
#[test]
fn test_deserialize_stdin_non_string() {
let json = r#"["stdin", 123]"#;
let result = TerminadoMessage::from_json(json);
assert!(result.is_err());
}
#[test]
fn test_deserialize_type_not_string() {
let json = r#"[123, "data"]"#;
let result = TerminadoMessage::from_json(json);
assert!(result.is_err());
}
// ============================================================================
// Edge Cases
// ============================================================================
#[test]
fn test_message_equality() {
let msg1 = TerminadoMessage::Stdin(IO::from("same"));
let msg2 = TerminadoMessage::Stdin(IO::from("same"));
let msg3 = TerminadoMessage::Stdin(IO::from("different"));
assert_eq!(msg1, msg2);
assert_ne!(msg1, msg3);
}
#[test]
fn test_message_clone() {
let original = TerminadoMessage::Resize { rows: 30, cols: 90 };
let cloned = original.clone();
assert_eq!(original, cloned);
}
#[test]
fn test_resize_different_values() {
let msg1 = TerminadoMessage::Resize { rows: 25, cols: 80 };
let msg2 = TerminadoMessage::Resize { rows: 30, cols: 90 };
assert_ne!(msg1, msg2);
}
#[test]
fn test_different_message_types_not_equal() {
let stdin = TerminadoMessage::Stdin(IO::from("test"));
let stdout = TerminadoMessage::Stdout(IO::from("test"));
assert_ne!(stdin, stdout);
}