git-iris 2.0.8

AI-powered Git workflow assistant for smart commits, code reviews, changelogs, and release notes
Documentation
use crate::config::Config;
use crate::studio::components::{DiffViewState, FileDiff, FileTreeState};
use crate::studio::events::SideEffect;
use crate::studio::handlers::handle_commit_key;
use crate::studio::state::{Mode, PanelId, StudioState};
use crossterm::event::{KeyCode, KeyEvent};
use std::path::PathBuf;

fn test_state() -> StudioState {
    let mut state = StudioState::new(Config::default(), None);
    state.active_mode = Mode::Commit;
    state
}

fn set_commit_diffs(state: &mut StudioState, paths: &[&str]) {
    let diffs = paths.iter().map(FileDiff::new).collect();
    state.modes.commit.diff_view = DiffViewState::new();
    state.modes.commit.diff_view.set_diffs(diffs);
    let tree_paths = paths.iter().map(PathBuf::from).collect::<Vec<_>>();
    state.modes.commit.file_tree = FileTreeState::from_paths(&tree_paths, &[]);
    state.modes.commit.file_tree.expand_all();
}

#[test]
fn diff_panel_stage_shortcut_uses_current_diff_path() {
    let mut state = test_state();
    state.focused_panel = PanelId::Right;
    set_commit_diffs(&mut state, &["src/lib.rs"]);

    let effects = handle_commit_key(&mut state, KeyEvent::from(KeyCode::Char('s')));

    assert!(effects.iter().any(|effect| matches!(
        effect,
        SideEffect::GitStage(path) if path == &PathBuf::from("src/lib.rs")
    )));
}

#[test]
fn diff_panel_unstage_shortcut_uses_current_diff_path() {
    let mut state = test_state();
    state.focused_panel = PanelId::Right;
    set_commit_diffs(&mut state, &["src/main.rs"]);

    let effects = handle_commit_key(&mut state, KeyEvent::from(KeyCode::Char('u')));

    assert!(effects.iter().any(|effect| matches!(
        effect,
        SideEffect::GitUnstage(path) if path == &PathBuf::from("src/main.rs")
    )));
}

#[test]
fn diff_panel_file_navigation_syncs_file_tree_selection() {
    let mut state = test_state();
    state.focused_panel = PanelId::Right;
    set_commit_diffs(&mut state, &["src/lib.rs", "src/main.rs"]);

    let effects = handle_commit_key(&mut state, KeyEvent::from(KeyCode::Char('n')));

    assert!(effects.is_empty());
    assert_eq!(
        state
            .modes
            .commit
            .diff_view
            .current_diff()
            .map(|diff| diff.path.clone()),
        Some(PathBuf::from("src/main.rs"))
    );
    assert_eq!(
        state.modes.commit.file_tree.selected_path(),
        Some(PathBuf::from("src/main.rs"))
    );
}