Files
owlen/crates/owlen-tui/tests/message_tests.rs
vikingowl 52efd5f341 test(app): add generation and message unit tests
- New test suite in `crates/owlen-tui/tests` covering generation orchestration, message variant round‑trip, and background worker status updates.
- Extend `model_picker` to filter models by matching keywords against capabilities as well as provider names.
- Update `state_tests` to assert that suggestion lists are non‑empty instead of checking prefix matches.
- Re‑export `background_worker` from `app::mod.rs` for external consumption.
2025-10-16 22:56:00 +02:00

98 lines
3.1 KiB
Rust

use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyEventState, KeyModifiers};
use owlen_core::provider::{GenerateChunk, GenerateRequest, ProviderStatus};
use owlen_tui::app::messages::AppMessage;
use uuid::Uuid;
#[test]
fn message_variants_roundtrip_their_data() {
let request = GenerateRequest::new("demo-model");
let request_id = Uuid::new_v4();
let key_event = KeyEvent {
code: KeyCode::Char('a'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: KeyEventState::NONE,
};
let messages = vec![
AppMessage::KeyPress(key_event),
AppMessage::Resize {
width: 120,
height: 40,
},
AppMessage::Tick,
AppMessage::GenerateStart {
request_id,
provider_id: "mock".into(),
request: request.clone(),
},
AppMessage::GenerateChunk {
request_id,
chunk: GenerateChunk::from_text("hi"),
},
AppMessage::GenerateComplete { request_id },
AppMessage::GenerateError {
request_id: Some(request_id),
message: "oops".into(),
},
AppMessage::ModelsRefresh,
AppMessage::ModelsUpdated,
AppMessage::ProviderStatus {
provider_id: "mock".into(),
status: ProviderStatus::Available,
},
];
for message in messages {
match message {
AppMessage::KeyPress(event) => {
assert_eq!(event.code, KeyCode::Char('a'));
assert!(event.modifiers.contains(KeyModifiers::CONTROL));
}
AppMessage::Resize { width, height } => {
assert_eq!(width, 120);
assert_eq!(height, 40);
}
AppMessage::Tick => {}
AppMessage::GenerateStart {
request_id: id,
provider_id,
request,
} => {
assert_eq!(id, request_id);
assert_eq!(provider_id, "mock");
assert_eq!(request.model, "demo-model");
}
AppMessage::GenerateChunk {
request_id: id,
chunk,
} => {
assert_eq!(id, request_id);
assert_eq!(chunk.text.as_deref(), Some("hi"));
}
AppMessage::GenerateComplete { request_id: id } => {
assert_eq!(id, request_id);
}
AppMessage::GenerateError {
request_id: Some(id),
message,
} => {
assert_eq!(id, request_id);
assert_eq!(message, "oops");
}
AppMessage::ModelsRefresh => {}
AppMessage::ModelsUpdated => {}
AppMessage::ProviderStatus {
provider_id,
status,
} => {
assert_eq!(provider_id, "mock");
assert!(matches!(status, ProviderStatus::Available));
}
AppMessage::GenerateError {
request_id: None, ..
} => panic!("missing request id"),
}
}
}