use super::*;
pub(super) use crate::lookout::edits::EditKey;
pub(super) use crate::lookout::view::fixtures;
pub(super) fn sheep(id: u32, name: &str, status: ProcStatus) -> ProcessInfo {
ProcessInfo::builder(id, name, status)
.pid(Some(1000 + id))
.uptime_ms(60_000)
.build()
}
pub(super) fn started() -> (App, Instant) {
let t0 = Instant::now();
let mut app = App::new(
Palette::detect(None, None, None),
Control::ReadOnly,
"/home/ada/.shep".to_string(),
t0,
);
app.update(Msg::Snapshot {
rows: vec![
sheep(1, "web", ProcStatus::Online),
sheep(2, "api", ProcStatus::Errored),
sheep(3, "worker", ProcStatus::Online),
],
at: t0,
});
(app, t0)
}
pub(super) fn allowed() -> App {
let t0 = Instant::now();
let mut app = App::new(
Palette::detect(None, None, None),
Control::Allowed,
"/home/ada/.shep".to_string(),
t0,
);
app.update(Msg::Snapshot {
rows: vec![
sheep(1, "web", ProcStatus::Online),
sheep(2, "api", ProcStatus::Online),
sheep(3, "worker", ProcStatus::Online),
],
at: t0,
});
app.update(Msg::Tick { now: t0 });
app.update(Msg::Key(KeyPress::SelectDown));
app
}
pub(super) fn allowed_with_instances() -> App {
let t0 = Instant::now();
let mut app = App::new(
Palette::detect(None, None, None),
Control::Allowed,
"/home/ada/.shep".to_string(),
t0,
);
app.update(Msg::Snapshot {
rows: instanced_rows(),
at: t0,
});
app
}
pub(super) fn instanced_rows() -> Vec<ProcessInfo> {
(0..3)
.map(|slot| {
ProcessInfo::builder(slot + 1, "web", ProcStatus::Online)
.instance(Some(slot))
.build()
})
.collect()
}
pub(super) fn wire(effect: Effect) -> Request {
match effect {
Effect::Send(sent) => sent.request(),
other => panic!("expected a request, got {other:?}"),
}
}
pub(super) fn filtered(query: &str) -> App {
let t0 = Instant::now();
let mut app = App::new(
Palette::detect(None, None, None),
Control::ReadOnly,
"/home/ada/.shep".to_string(),
t0,
);
app.update(Msg::Snapshot {
rows: vec![
sheep(1, "api-web", ProcStatus::Online),
sheep(2, "cron", ProcStatus::Online),
sheep(3, "queue", ProcStatus::Online),
sheep(4, "web-worker", ProcStatus::Online),
],
at: t0,
});
app.set_filter(query.to_string());
app
}
pub(super) fn pane_to(app: &mut App, key: &str) {
fixtures::select_field(app, key);
}
pub(super) fn refresh_config(app: &mut App, env_keys: &[&str]) {
let mut config = shep_core::config::AppConfig {
name: "web".to_string(),
..Default::default()
};
for key in env_keys {
config.env.insert((*key).to_string(), "x".to_string());
}
app.update(Msg::Replied {
sent: Sent::SheepConfig {
name: "web".to_string(),
},
result: Ok(Response::SheepConfig(Box::new(
shep_core::protocol::SheepConfigView::new(config, Vec::new(), Vec::new()),
))),
});
}
pub(super) fn close_writing(app: &mut App) -> Effect {
let effect = app.update(Msg::Key(KeyPress::Escape));
if app.close_dialog().is_some() {
app.update(Msg::Key(KeyPress::Continue))
} else {
effect
}
}
pub(super) fn wire_all(effect: Effect) -> Vec<Request> {
match effect {
Effect::SendAll(batch) => batch.iter().map(Sent::request).collect(),
other => panic!("expected a batch, got {other:?}"),
}
}
pub(super) fn wire_batch(effect: Effect) -> Vec<Sent> {
match effect {
Effect::SendAll(batch) => batch,
other => panic!("expected a batch, got {other:?}"),
}
}
pub(super) fn one_wire(effect: Effect) -> Request {
let mut requests = wire_all(effect);
assert_eq!(requests.len(), 1, "{requests:?}");
requests.remove(0)
}
pub(super) fn filed_value(app: &App, key: &str) -> serde_json::Value {
let entry = app
.config_pane()
.expect("the pane is open")
.edits()
.get(&EditKey::Field(key.to_owned()))
.unwrap_or_else(|| panic!("nothing filed for {key}"));
match entry.edit() {
PaneEdit::Set { value, .. } => value.as_value().clone(),
other => panic!("expected a field set, got {other:?}"),
}
}