#![cfg(test)]
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
use crate::state::{AppState, PackageItem, Source};
use super::{handle_confirm_install, handle_confirm_remove};
fn create_test_package(name: &str, source: Source) -> PackageItem {
PackageItem {
name: name.into(),
version: "1.0.0".into(),
description: String::new(),
source,
popularity: None,
out_of_date: None,
orphaned: false,
}
}
#[test]
fn confirm_install_esc_closes_modal() {
let mut app = AppState::default();
let items = vec![create_test_package("test-pkg", Source::Aur)];
app.modal = crate::state::Modal::ConfirmInstall {
items: items.clone(),
};
let ke = KeyEvent::new(KeyCode::Esc, KeyModifiers::empty());
let _ = handle_confirm_install(ke, &mut app, &items);
match app.modal {
crate::state::Modal::None => {}
_ => panic!("Expected modal to be closed"),
}
}
#[test]
fn confirm_remove_esc_cancels() {
let mut app = AppState::default();
let items = vec![create_test_package(
"test-pkg",
Source::Official {
repo: "extra".into(),
arch: "x86_64".into(),
},
)];
app.modal = crate::state::Modal::ConfirmRemove {
items: items.clone(),
};
let ke = KeyEvent::new(KeyCode::Esc, KeyModifiers::empty());
let _ = handle_confirm_remove(ke, &mut app, &items);
match app.modal {
crate::state::Modal::None => {}
_ => panic!("Expected modal to be closed"),
}
}
#[test]
fn confirm_remove_enter_defaults_to_no() {
let mut app = AppState::default();
let items = vec![create_test_package(
"test-pkg",
Source::Official {
repo: "extra".into(),
arch: "x86_64".into(),
},
)];
app.modal = crate::state::Modal::ConfirmRemove {
items: items.clone(),
};
let ke = KeyEvent::new(KeyCode::Enter, KeyModifiers::empty());
let _ = handle_confirm_remove(ke, &mut app, &items);
match app.modal {
crate::state::Modal::None => {}
_ => panic!("Expected modal to be closed (Enter defaults to No)"),
}
}
#[test]
fn confirm_remove_y_confirms() {
let mut app = AppState::default();
let items = vec![create_test_package(
"test-pkg",
Source::Official {
repo: "extra".into(),
arch: "x86_64".into(),
},
)];
app.modal = crate::state::Modal::ConfirmRemove {
items: items.clone(),
};
app.remove_cascade_mode = crate::state::modal::CascadeMode::Basic;
let ke = KeyEvent::new(KeyCode::Char('y'), KeyModifiers::empty());
let _ = handle_confirm_remove(ke, &mut app, &items);
match app.modal {
crate::state::Modal::None => {}
_ => panic!("Expected modal to be closed after removal"),
}
assert!(app.remove_list.is_empty());
}
#[test]
fn confirm_install_enter_triggers_install() {
let mut app = AppState::default();
let items = vec![create_test_package("test-pkg", Source::Aur)];
app.modal = crate::state::Modal::ConfirmInstall {
items: items.clone(),
};
let ke = KeyEvent::new(KeyCode::Enter, KeyModifiers::empty());
let _ = handle_confirm_install(ke, &mut app, &items);
match app.modal {
crate::state::Modal::None => {}
_ => panic!("Expected modal to be closed after install"),
}
}
#[test]
fn confirm_install_s_opens_scan_config() {
let mut app = AppState::default();
let items = vec![create_test_package("test-pkg", Source::Aur)];
app.modal = crate::state::Modal::ConfirmInstall {
items: items.clone(),
};
let ke = KeyEvent::new(KeyCode::Char('s'), KeyModifiers::empty());
let _ = handle_confirm_install(ke, &mut app, &items);
match app.modal {
crate::state::Modal::ScanConfig { .. } => {}
_ => panic!("Expected ScanConfig modal"),
}
}
#[test]
fn confirm_install_s_no_aur_shows_alert() {
let mut app = AppState::default();
let items = vec![create_test_package(
"test-pkg",
Source::Official {
repo: "extra".into(),
arch: "x86_64".into(),
},
)];
app.modal = crate::state::Modal::ConfirmInstall {
items: items.clone(),
};
let ke = KeyEvent::new(KeyCode::Char('s'), KeyModifiers::empty());
let _ = handle_confirm_install(ke, &mut app, &items);
match app.modal {
crate::state::Modal::Alert { .. } => {}
_ => panic!("Expected Alert modal for non-AUR packages"),
}
}