use crate::state::AppState;
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
use super::handle_system_update;
#[test]
fn system_update_esc_closes_modal() {
let mut app = AppState {
modal: crate::state::Modal::SystemUpdate {
do_mirrors: false,
do_pacman: false,
force_sync: false,
do_aur: false,
do_cache: false,
country_idx: 0,
countries: vec!["Worldwide".to_string()],
mirror_count: 10,
cursor: 0,
},
..Default::default()
};
let mut do_mirrors = false;
let mut do_pacman = false;
let mut force_sync = false;
let mut do_aur = false;
let mut do_cache = false;
let mut country_idx = 0;
let countries = vec!["Worldwide".to_string()];
let mut mirror_count = 10;
let mut cursor = 0;
let ke = KeyEvent::new(KeyCode::Esc, KeyModifiers::empty());
let _ = handle_system_update(
ke,
&mut app,
&mut do_mirrors,
&mut do_pacman,
&mut force_sync,
&mut do_aur,
&mut do_cache,
&mut country_idx,
&countries,
&mut mirror_count,
&mut cursor,
);
match app.modal {
crate::state::Modal::None => {}
_ => panic!("Expected modal to be closed"),
}
}
#[test]
fn system_update_navigation() {
let mut app = AppState {
modal: crate::state::Modal::SystemUpdate {
do_mirrors: false,
do_pacman: false,
force_sync: false,
do_aur: false,
do_cache: false,
country_idx: 0,
countries: vec!["Worldwide".to_string()],
mirror_count: 10,
cursor: 0,
},
..Default::default()
};
let mut do_mirrors = false;
let mut do_pacman = false;
let mut force_sync = false;
let mut do_aur = false;
let mut do_cache = false;
let mut country_idx = 0;
let countries = vec!["Worldwide".to_string()];
let mut mirror_count = 10;
let mut cursor = 0;
let ke = KeyEvent::new(KeyCode::Down, KeyModifiers::empty());
let _ = handle_system_update(
ke,
&mut app,
&mut do_mirrors,
&mut do_pacman,
&mut force_sync,
&mut do_aur,
&mut do_cache,
&mut country_idx,
&countries,
&mut mirror_count,
&mut cursor,
);
assert_eq!(cursor, 1, "Cursor should move down");
}
#[test]
fn system_update_toggle() {
let mut app = AppState {
modal: crate::state::Modal::SystemUpdate {
do_mirrors: false,
do_pacman: false,
force_sync: false,
do_aur: false,
do_cache: false,
country_idx: 0,
countries: vec!["Worldwide".to_string()],
mirror_count: 10,
cursor: 0,
},
..Default::default()
};
let mut do_mirrors = false;
let mut do_pacman = false;
let mut force_sync = false;
let mut do_aur = false;
let mut do_cache = false;
let mut country_idx = 0;
let countries = vec!["Worldwide".to_string()];
let mut mirror_count = 10;
let mut cursor = 0;
let ke = KeyEvent::new(KeyCode::Char(' '), KeyModifiers::empty());
let _ = handle_system_update(
ke,
&mut app,
&mut do_mirrors,
&mut do_pacman,
&mut force_sync,
&mut do_aur,
&mut do_cache,
&mut country_idx,
&countries,
&mut mirror_count,
&mut cursor,
);
assert!(do_mirrors, "do_mirrors should be toggled to true");
}
#[test]
fn system_update_enter_executes() {
let mut app = AppState {
modal: crate::state::Modal::SystemUpdate {
do_mirrors: false,
do_pacman: true,
force_sync: false,
do_aur: false,
do_cache: false,
country_idx: 0,
countries: vec!["Worldwide".to_string()],
mirror_count: 10,
cursor: 0,
},
..Default::default()
};
let mut do_mirrors = false;
let mut do_pacman = true;
let mut force_sync = false;
let mut do_aur = false;
let mut do_cache = false;
let mut country_idx = 0;
let countries = vec!["Worldwide".to_string()];
let mut mirror_count = 10;
let mut cursor = 0;
let ke = KeyEvent::new(KeyCode::Enter, KeyModifiers::empty());
let result = handle_system_update(
ke,
&mut app,
&mut do_mirrors,
&mut do_pacman,
&mut force_sync,
&mut do_aur,
&mut do_cache,
&mut country_idx,
&countries,
&mut mirror_count,
&mut cursor,
);
assert_eq!(result, Some(true));
match &app.modal {
crate::state::Modal::PasswordPrompt { purpose, .. } => {
assert!(
matches!(purpose, crate::state::modal::PasswordPurpose::Update),
"Password purpose should be Update"
);
}
_ => panic!("Expected modal to transition to PasswordPrompt"),
}
assert!(
app.pending_update_commands.is_some(),
"System update should set pending_update_commands"
);
let commands = app
.pending_update_commands
.as_ref()
.expect("pending_update_commands should be set");
assert!(
commands.iter().any(|c| c.contains("pacman -Syu")),
"Commands should include pacman -Syu for normal sync"
);
}
#[test]
fn system_update_force_sync_uses_syyu() {
let mut app = AppState {
modal: crate::state::Modal::SystemUpdate {
do_mirrors: false,
do_pacman: true,
force_sync: true,
do_aur: false,
do_cache: false,
country_idx: 0,
countries: vec!["Worldwide".to_string()],
mirror_count: 10,
cursor: 0,
},
..Default::default()
};
let mut do_mirrors = false;
let mut do_pacman = true;
let mut force_sync = true;
let mut do_aur = false;
let mut do_cache = false;
let mut country_idx = 0;
let countries = vec!["Worldwide".to_string()];
let mut mirror_count = 10;
let mut cursor = 0;
let ke = KeyEvent::new(KeyCode::Enter, KeyModifiers::empty());
let _ = handle_system_update(
ke,
&mut app,
&mut do_mirrors,
&mut do_pacman,
&mut force_sync,
&mut do_aur,
&mut do_cache,
&mut country_idx,
&countries,
&mut mirror_count,
&mut cursor,
);
let commands = app
.pending_update_commands
.as_ref()
.expect("pending_update_commands should be set");
assert!(
commands.iter().any(|c| c.contains("-Syyu")),
"Commands should include -Syyu for force sync"
);
assert!(
!commands
.iter()
.any(|c| c.contains("-Syu --noconfirm") && !c.contains("-Syyu")),
"Commands should not include plain -Syu when force sync is enabled"
);
}
#[test]
fn system_update_aur_uses_sua_when_pacman_selected() {
let mut app = AppState {
modal: crate::state::Modal::SystemUpdate {
do_mirrors: false,
do_pacman: true,
force_sync: false,
do_aur: true,
do_cache: false,
country_idx: 0,
countries: vec!["Worldwide".to_string()],
mirror_count: 10,
cursor: 0,
},
..Default::default()
};
let mut do_mirrors = false;
let mut do_pacman = true;
let mut force_sync = false;
let mut do_aur = true;
let mut do_cache = false;
let mut country_idx = 0;
let countries = vec!["Worldwide".to_string()];
let mut mirror_count = 10;
let mut cursor = 0;
let ke = KeyEvent::new(KeyCode::Enter, KeyModifiers::empty());
let _ = handle_system_update(
ke,
&mut app,
&mut do_mirrors,
&mut do_pacman,
&mut force_sync,
&mut do_aur,
&mut do_cache,
&mut country_idx,
&countries,
&mut mirror_count,
&mut cursor,
);
let commands = app
.pending_update_commands
.as_ref()
.expect("pending_update_commands should be set");
assert!(
commands.iter().any(|c| c.contains("pacman -Syu")),
"Commands should include pacman -Syu"
);
let aur_command = app
.pending_aur_update_command
.as_ref()
.expect("pending_aur_update_command should be set when both pacman and AUR are selected");
assert!(
aur_command.contains("paru -Sua") || aur_command.contains("yay -Sua"),
"AUR command should use -Sua when pacman is also selected"
);
assert!(
!aur_command.contains("paru -Syu") && !aur_command.contains("yay -Syu"),
"AUR command should not use -Syu when pacman is also selected"
);
assert!(
!commands
.iter()
.any(|c| c.contains("paru") || c.contains("yay")),
"AUR command should not be in pending_update_commands when pacman is also selected"
);
}
#[test]
fn system_update_aur_uses_sua_when_only_aur_selected() {
let mut app = AppState {
modal: crate::state::Modal::SystemUpdate {
do_mirrors: false,
do_pacman: false,
force_sync: false,
do_aur: true,
do_cache: false,
country_idx: 0,
countries: vec!["Worldwide".to_string()],
mirror_count: 10,
cursor: 0,
},
..Default::default()
};
let mut do_mirrors = false;
let mut do_pacman = false;
let mut force_sync = false;
let mut do_aur = true;
let mut do_cache = false;
let mut country_idx = 0;
let countries = vec!["Worldwide".to_string()];
let mut mirror_count = 10;
let mut cursor = 0;
let ke = KeyEvent::new(KeyCode::Enter, KeyModifiers::empty());
let _ = handle_system_update(
ke,
&mut app,
&mut do_mirrors,
&mut do_pacman,
&mut force_sync,
&mut do_aur,
&mut do_cache,
&mut country_idx,
&countries,
&mut mirror_count,
&mut cursor,
);
let commands = app
.pending_update_commands
.as_ref()
.expect("pending_update_commands should be set");
assert!(
commands
.iter()
.any(|c| c.contains("paru -Sua") || c.contains("yay -Sua")),
"AUR command should use -Sua when only AUR is selected"
);
assert!(
commands
.iter()
.all(|c| !c.contains("-Syu") || c.contains("-Sua")),
"AUR command should not use -Syu when only AUR is selected (must use -Sua if -Syu is present)"
);
}
#[test]
fn system_update_left_right_toggles_force_sync() {
let mut app = AppState {
modal: crate::state::Modal::SystemUpdate {
do_mirrors: false,
do_pacman: true,
force_sync: false,
do_aur: false,
do_cache: false,
country_idx: 0,
countries: vec!["Worldwide".to_string()],
mirror_count: 10,
cursor: 1, },
..Default::default()
};
let mut do_mirrors = false;
let mut do_pacman = true;
let mut force_sync = false;
let mut do_aur = false;
let mut do_cache = false;
let mut country_idx = 0;
let countries = vec!["Worldwide".to_string()];
let mut mirror_count = 10;
let mut cursor = 1;
let ke = KeyEvent::new(KeyCode::Right, KeyModifiers::empty());
let _ = handle_system_update(
ke,
&mut app,
&mut do_mirrors,
&mut do_pacman,
&mut force_sync,
&mut do_aur,
&mut do_cache,
&mut country_idx,
&countries,
&mut mirror_count,
&mut cursor,
);
assert!(
force_sync,
"force_sync should be toggled to true with Right"
);
let ke = KeyEvent::new(KeyCode::Left, KeyModifiers::empty());
let _ = handle_system_update(
ke,
&mut app,
&mut do_mirrors,
&mut do_pacman,
&mut force_sync,
&mut do_aur,
&mut do_cache,
&mut country_idx,
&countries,
&mut mirror_count,
&mut cursor,
);
assert!(
!force_sync,
"force_sync should be toggled back to false with Left"
);
let ke = KeyEvent::new(KeyCode::Tab, KeyModifiers::empty());
let _ = handle_system_update(
ke,
&mut app,
&mut do_mirrors,
&mut do_pacman,
&mut force_sync,
&mut do_aur,
&mut do_cache,
&mut country_idx,
&countries,
&mut mirror_count,
&mut cursor,
);
assert!(force_sync, "force_sync should be toggled to true with Tab");
}