#[cfg(test)]
pub mod test_helpers {
use crate::app::App;
use crate::config::Config;
use crate::history::HistoryState;
use crate::input::FileLoader;
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
pub const TEST_JSON: &str = r#"{
"name": "test",
"age": 30,
"city": "NYC",
"services": [{"name": "svc1", "serviceArn": "arn1"}],
"items": [{"tags": [{"name": "tag1"}]}]
}"#;
pub fn create_test_loader(json: String) -> FileLoader {
use crate::input::loader::LoadingState;
use std::sync::mpsc::channel;
let (tx, rx) = channel();
let _ = tx.send(Ok(json));
FileLoader {
state: LoadingState::Loading,
rx: Some(rx),
}
}
pub fn test_app(json: &str) -> App {
let loader = create_test_loader(json.to_string());
let mut app = App::new_with_loader(loader, &Config::default());
app.poll_file_loader();
app.history = HistoryState::empty();
app
}
pub fn key(code: KeyCode) -> KeyEvent {
KeyEvent::new(code, KeyModifiers::empty())
}
pub fn key_with_mods(code: KeyCode, modifiers: KeyModifiers) -> KeyEvent {
KeyEvent::new(code, modifiers)
}
pub fn app_with_query(query: &str) -> App {
let mut app = test_app(TEST_JSON);
app.input.textarea.insert_str(query);
if let Some(query_state) = &mut app.query {
query_state.execute(query);
}
app.history = HistoryState::empty();
app
}
pub fn wait_for_query_completion(app: &mut App, timeout_ms: u64) -> bool {
let start = std::time::Instant::now();
let timeout = std::time::Duration::from_millis(timeout_ms);
while start.elapsed() < timeout {
if let Some(query_state) = &mut app.query {
if !query_state.is_pending() {
return true;
}
let _ = query_state.poll_response();
}
std::thread::sleep(std::time::Duration::from_millis(10));
}
false
}
pub fn execute_query_and_wait(app: &mut App) {
if let Some(query_state) = &mut app.query {
let query = app.input.textarea.lines()[0].as_ref();
query_state.execute_async(query);
}
assert!(
wait_for_query_completion(app, 2000),
"Query did not complete within timeout"
);
}
}