Skip to content

Commit 8b6ac8c

Browse files
committed
test: add tests for intercative mode
1 parent bb6b9e0 commit 8b6ac8c

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

src/interactive.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::io;
66

77
use super::variables::get_variables;
88
use crossterm::event::{self, Event, KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
9-
use ratatui::{DefaultTerminal, Frame};
9+
use ratatui::{Frame, Terminal};
1010

1111
#[derive(Clone)]
1212
pub enum Mode {
@@ -53,7 +53,10 @@ impl InteractiveMode {
5353
}
5454

5555
/// Run TUI interface for interactive mode
56-
pub fn run(&mut self, terminal: &mut DefaultTerminal) -> io::Result<()> {
56+
pub fn run<B>(&mut self, terminal: &mut Terminal<B>) -> io::Result<()>
57+
where
58+
B: ratatui::backend::Backend,
59+
{
5760
while !self.exit {
5861
terminal.draw(|frame| self.draw(frame))?;
5962
self.handle_events()?;

src/interactive/tests.rs

+56
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use crate::interactive::{InteractiveMode, Mode};
44
use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
55
#[cfg(test)]
66
use ratatui::{Terminal, backend::TestBackend, buffer::Buffer, layout::Rect, widgets::Widget};
7+
#[cfg(test)]
8+
use std::io;
79

810
#[cfg(test)]
911
fn create_test_terminal() -> Terminal<TestBackend> {
@@ -395,3 +397,57 @@ fn test_value_truncation_and_name_padding() {
395397
// Test name padding (line 134)
396398
assert!(content.contains(&format!("{:38}", "very_long_name")));
397399
}
400+
401+
#[test]
402+
fn test_handle_events_with_non_key_event() -> io::Result<()> {
403+
let mut mode = InteractiveMode::default();
404+
let result = mode.handle_events();
405+
assert!(result.is_ok());
406+
assert!(!mode.exit);
407+
Ok(())
408+
}
409+
410+
#[test]
411+
fn test_run_until_exit() -> io::Result<()> {
412+
let mut mode = InteractiveMode::default();
413+
let mut terminal = create_test_terminal();
414+
415+
// Simulate exit command
416+
mode.handle_key_event(create_key_event(KeyCode::Char('q'), KeyModifiers::CONTROL));
417+
418+
let result = mode.run(&mut terminal);
419+
assert!(result.is_ok());
420+
assert!(mode.exit);
421+
Ok(())
422+
}
423+
424+
#[test]
425+
fn test_run_with_multiple_events() -> io::Result<()> {
426+
let mut mode = InteractiveMode::default();
427+
let mut terminal = create_test_terminal();
428+
429+
// Simulate some navigation before exit
430+
mode.handle_key_event(create_key_event(KeyCode::Down, KeyModifiers::NONE));
431+
mode.handle_key_event(create_key_event(KeyCode::Up, KeyModifiers::NONE));
432+
mode.handle_key_event(create_key_event(KeyCode::Char('q'), KeyModifiers::CONTROL));
433+
434+
let result = mode.run(&mut terminal);
435+
assert!(result.is_ok());
436+
assert!(mode.exit);
437+
Ok(())
438+
}
439+
440+
#[test]
441+
fn test_run_with_terminal_draw_error() -> io::Result<()> {
442+
let mut mode = InteractiveMode::default();
443+
let backend = TestBackend::new(0, 0); // Invalid size to force error
444+
let mut terminal = Terminal::new(backend).unwrap();
445+
446+
mode.handle_key_event(create_key_event(KeyCode::Char('q'), KeyModifiers::CONTROL));
447+
let result = mode.run(&mut terminal);
448+
449+
// Even with drawing errors, the run should complete when exit is true
450+
assert!(result.is_ok());
451+
assert!(mode.exit);
452+
Ok(())
453+
}

0 commit comments

Comments
 (0)