- 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.
98 lines
3.1 KiB
Rust
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"),
|
|
}
|
|
}
|
|
}
|