use super::super::super::app::{App, Control};
use super::super::super::keymap::Group;
use super::super::super::theme::Palette;
use super::super::overlay;
use super::keymap_rows::INTERIOR;
use crate::lookout::app::{KeyPress, Msg};
use crate::lookout::frames::render_text;
use crate::lookout::view::fixtures;
use ratatui::Terminal;
use ratatui::backend::TestBackend;
use shep_core::protocol::ProcessInfo;
use shep_core::status::ProcStatus;
pub(super) fn top_border_row() -> String {
format!(
"{}{}{}",
overlay::BOX_TOP_LEFT,
overlay::BOX_TOP.to_string().repeat(usize::from(INTERIOR)),
overlay::BOX_TOP_RIGHT
)
}
pub(super) fn render_overlay(app: &App, width: u16, height: u16) -> String {
let mut terminal = Terminal::new(TestBackend::new(width, height)).expect("terminal");
terminal
.draw(|frame| super::super::draw(app, frame))
.expect("draw");
render_text(terminal.backend().buffer())
}
pub(super) fn assert_every_visible_row_drawn(rendered: &str, context: &str) {
for row in crate::lookout::keymap::rows() {
if row.group == Group::Closing {
continue;
}
assert!(
rendered.contains(row.does),
"{context}, but `{}` is missing: {rendered}",
row.does
);
}
}
fn healthy_app() -> App {
healthy_app_with_palette(fixtures::plain())
}
fn healthy_app_with_palette(palette: Palette) -> App {
let mut app = fixtures::app_with(
vec![
ProcessInfo::builder(1, "web", ProcStatus::Online)
.pid(Some(48_001))
.build(),
],
palette,
);
app.set_control_for_tests(Control::Allowed);
app
}
pub(super) fn app_with_overlay() -> App {
let mut app = healthy_app();
let _ = app.update(Msg::Key(KeyPress::Help));
assert!(app.keymap_open(), "the overlay did not open");
app
}
pub(super) fn coloured_app_with_overlay() -> App {
let mut app = healthy_app_with_palette(fixtures::coloured());
let _ = app.update(Msg::Key(KeyPress::Help));
assert!(app.keymap_open(), "the overlay did not open");
app
}
pub(super) fn read_only_app_with_overlay() -> App {
let mut app = healthy_app();
app.set_control_for_tests(Control::ReadOnly);
let _ = app.update(Msg::Key(KeyPress::Help));
assert!(app.keymap_open(), "the overlay did not open");
app
}
pub(super) fn frozen_app_with_overlay() -> App {
let mut app = healthy_app();
let _ = app.update(Msg::Frozen {
at_local: "2026-08-14 14:32:07".to_string(),
why: fixtures::FROZEN_WHY.to_string(),
});
let _ = app.update(Msg::Key(KeyPress::Help));
assert!(app.keymap_open(), "the overlay did not open");
app
}
pub(super) fn frozen_read_only_app_with_overlay() -> App {
let mut app = healthy_app();
app.set_control_for_tests(Control::ReadOnly);
let _ = app.update(Msg::Frozen {
at_local: "2026-08-14 14:32:07".to_string(),
why: fixtures::FROZEN_WHY.to_string(),
});
let _ = app.update(Msg::Key(KeyPress::Help));
assert!(app.keymap_open(), "the overlay did not open");
app
}