use super::{
CLOSE, ELSEWHERE, HEADING, LOOPBACK, NO_PROVIDERS, NOT_ANSWERED, NOT_OFFERED, OFFERS,
OFFERS_NOTHING, OPEN, SIGN_IN, render,
};
use crate::paint_probe::frame::Window;
use crate::test_support::window::{click, pane, provider, seated, signing};
use crate::ui::{Login, Model};
use serde_json::json;
#[test]
fn a_shut_pane_paints_nothing_and_reports_it() {
let mut model = seated();
let mut stood = true;
let painted = pane(|ui| stood = render(ui, &mut model));
assert!(!stood, "a shut pane reports that it painted nothing");
assert!(!painted.contains(HEADING), "{painted}");
}
#[test]
fn an_unanswered_wall_and_a_wall_with_no_provider_say_different_things() {
for (providers, expected) in [
(None, NOT_ANSWERED),
(Some(Vec::new()), NO_PROVIDERS),
(Some(vec![provider("housevendor")]), "housevendor"),
] {
let mut model = Model {
providers,
login: Some(Login::default()),
..seated()
};
let painted = pane(|ui| {
render(ui, &mut model);
});
assert!(
painted.lines().any(|line| line == expected),
"{expected:?}:\n{painted}"
);
}
}
#[test]
fn a_row_paints_its_credential_fact_and_offers_both_controls() {
let mut model = signing();
let painted = pane(|ui| {
render(ui, &mut model);
});
for word in [
"housevendor",
"credential present",
"takes effort and priority",
SIGN_IN,
OFFERS,
] {
assert!(painted.contains(word), "{word:?}:\n{painted}");
}
}
#[test]
fn a_blocked_row_states_the_reason_and_its_control_is_not_live() {
let mut model = signing();
let painted = pane(|ui| {
render(ui, &mut model);
});
assert!(painted.contains("no login flow"), "{painted}");
let blocked = model
.providers
.clone()
.expect("the table")
.into_iter()
.find(|row| row.name == "otherhouse")
.expect("the blocked row");
assert!(!blocked.signable());
}
#[test]
fn an_offering_is_painted_under_the_row_that_asked_for_it() {
let mut model = signing();
let painted = pane(|ui| {
render(ui, &mut model);
});
assert!(painted.contains("house-model-1"), "{painted}");
for (offered, expected) in [(None, NOT_OFFERED), (Some(Vec::new()), OFFERS_NOTHING)] {
let mut model = Model {
offered,
..signing()
};
let painted = pane(|ui| {
render(ui, &mut model);
});
assert!(
painted.lines().any(|line| line == expected),
"{expected:?}:\n{painted}"
);
}
let mut unasked = Model {
login: Some(Login::default()),
..signing()
};
let painted = pane(|ui| {
render(ui, &mut unasked);
});
assert!(
!painted.contains("house-model-1"),
"nothing was asked, so nothing is attributed:\n{painted}"
);
}
#[test]
fn a_wall_held_elsewhere_says_where_the_sign_in_runs_and_states_the_remedy() {
let mut here = signing();
let painted = pane(|ui| {
render(ui, &mut here);
});
assert!(!painted.contains(ELSEWHERE), "{painted}");
let mut model = signing();
model.roster[0].channel.named_there = Some("theirs".to_owned());
let painted = pane(|ui| {
render(ui, &mut model);
});
for said in [ELSEWHERE, LOOPBACK] {
assert!(painted.contains(said), "{said:?}:\n{painted}");
}
}
#[test]
fn clicking_the_two_row_controls_composes_the_act_and_the_read() {
for (label, expected) in [
(
SIGN_IN,
crate::ui::Posted::act(
json!({"op": "login", "workspace": "home", "provider": "housevendor"}),
),
),
(
OFFERS,
crate::ui::Posted::read(
json!({"op": "models", "workspace": "home", "provider": "housevendor"}),
),
),
] {
let mut model = Model {
providers: Some(vec![provider("housevendor")]),
login: Some(Login::default()),
..seated()
};
let window = Window::new();
click(&window, label, |ctx| {
egui::CentralPanel::default().show(ctx, |ui| {
render(ui, &mut model);
});
});
assert_eq!(model.outbox, vec![expected], "{label}");
}
}
#[test]
fn the_done_control_closes_the_pane() {
let mut model = signing();
let window = Window::new();
click(&window, CLOSE, |ctx| {
egui::CentralPanel::default().show(ctx, |ui| {
render(ui, &mut model);
});
});
assert_eq!(model.login, None);
}
#[test]
fn the_roster_control_opens_the_pane_and_the_pane_covers_the_conversation() {
let mut model = seated();
let window = Window::new();
click(&window, OPEN, |ctx| crate::ui::render(ctx, &mut model));
assert_eq!(model.login, Some(Login::default()));
let painted = window.text(|ctx| crate::ui::render(ctx, &mut model));
assert!(painted.lines().any(|line| line == HEADING), "{painted}");
assert!(
!painted.contains(crate::ui::composer::SEND),
"the composer stands down under it:\n{painted}"
);
}