quinjet 0.0.71

A fast, live, keyboard-first Git source-control interface for the terminal
use super::*;

#[test]
fn a_remote_session_copies_a_clicked_link_instead_of_opening_it() {
    let mut app = app_with_changes();
    app.local_browser = false;
    app.geometry.link_hits = vec![LinkHit {
        area: Rect::new(30, 4, 7, 1),
        target: OpenTarget::Browser("https://github.com/acme/widget/commit/abc".to_owned()),
    }];

    let effects = app.handle_mouse(
        MouseEvent {
            kind: MouseEventKind::Down(MouseButton::Left),
            column: 32,
            row: 4,
            modifiers: KeyModifiers::NONE,
        },
        Instant::now(),
    );

    assert!(matches!(
        effects.as_slice(),
        [AppEffect::Copy(url)] if url == "https://github.com/acme/widget/commit/abc"
    ));
    assert!(app.toast.as_ref().is_some_and(|toast| {
        toast
            .message
            .contains("https://github.com/acme/widget/commit/abc")
            && toast.message.contains("Cmd-click or Ctrl-click")
    }));
}

#[test]
fn a_local_session_opens_a_clicked_link_and_says_so() {
    let mut app = app_with_changes();
    app.geometry.link_hits = vec![LinkHit {
        area: Rect::new(30, 4, 7, 1),
        target: OpenTarget::Browser("https://github.com/acme/widget/commit/abc".to_owned()),
    }];

    let effects = app.handle_mouse(
        MouseEvent {
            kind: MouseEventKind::Down(MouseButton::Left),
            column: 32,
            row: 4,
            modifiers: KeyModifiers::NONE,
        },
        Instant::now(),
    );

    assert!(app.local_browser);
    assert!(matches!(
        effects.as_slice(),
        [AppEffect::Open(OpenTarget::Browser(url))]
            if url == "https://github.com/acme/widget/commit/abc"
    ));
    assert!(
        app.toast.as_ref().is_some_and(
            |toast| toast.message == "Opening https://github.com/acme/widget/commit/abc"
        )
    );
}

#[test]
fn the_keyboard_open_action_follows_the_same_local_and_remote_split() {
    let now = Instant::now();
    let mut app = app_with_changes();
    app.status.branch.head = "feature/link".to_owned();
    app.local_github_repository = Some(GitHubRepository {
        name_with_owner: "acme/widget".to_owned(),
        url: "https://github.com/acme/widget".to_owned(),
        remotes: vec!["origin".to_owned()],
    });

    let effects = app.handle_key(KeyEvent::new(KeyCode::Char('O'), KeyModifiers::NONE), now);
    assert!(matches!(
        effects.as_slice(),
        [AppEffect::Open(OpenTarget::Browser(url))]
            if url == "https://github.com/acme/widget/tree/feature/link"
    ));
    assert!(
        app.toast
            .as_ref()
            .is_some_and(|toast| toast.message.starts_with("Opening "))
    );

    app.local_browser = false;
    let effects = app.handle_key(KeyEvent::new(KeyCode::Char('O'), KeyModifiers::NONE), now);
    assert!(matches!(
        effects.as_slice(),
        [AppEffect::Copy(url)] if url == "https://github.com/acme/widget/tree/feature/link"
    ));
    assert!(
        app.toast
            .as_ref()
            .is_some_and(|toast| toast.message.contains("Cmd-click or Ctrl-click"))
    );
}