summaryrefslogtreecommitdiff
path: root/tests/cli.rs
blob: 6ace1516b4d20faef0634a3d2f3959a9ebf019fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
use anyhow::Result;
use assert_cmd::{cargo::cargo_bin, Command};
use rexpect::session::{spawn_command, PtySession};
use tempfile::TempDir;

struct TestContext {
    p: PtySession,
    workdir: TempDir,
}

fn spawn_interactive_process() -> Result<TestContext> {
    let workdir = tempfile::tempdir()?;

    let path = cargo_bin(env!("CARGO_PKG_NAME"));
    let mut command = std::process::Command::new(&path);
    command.current_dir(&workdir);
    let mut p = spawn_command(command, Some(3000))?;
    expect_prompt(&mut p)?;
    Ok(TestContext { p, workdir })
}

fn run_batch_command(batch_command: &str) -> Result<TestContext> {
    let workdir = tempfile::tempdir()?;

    let path = cargo_bin(env!("CARGO_PKG_NAME"));
    let mut command = std::process::Command::new(&path);
    command.current_dir(&workdir);
    command.args(["-c", batch_command]);
    let p = spawn_command(command, Some(3000))?;

    Ok(TestContext { p, workdir })
}

fn expect_prompt(p: &mut PtySession) -> Result<()> {
    p.exp_string("> ")?;
    Ok(())
}

#[test]
fn shows_a_prompt() -> Result<()> {
    spawn_interactive_process()?;
    Ok(())
}

#[test]
fn does_nothing_after_receiving_whitespace_input() -> Result<()> {
    let mut c = spawn_interactive_process()?;
    c.p.send_line("")?;
    expect_prompt(&mut c.p)?;
    c.p.send_line("  ")?;
    expect_prompt(&mut c.p)?;
    Ok(())
}

#[test]
fn quits_when_eof_is_sent() -> Result<()> {
    let mut c = spawn_interactive_process()?;
    c.p.send_control('d')?;
    c.p.exp_eof()?;
    Ok(())
}

#[test]
fn quits_when_exit_command_is_sent() -> Result<()> {
    let mut c = spawn_interactive_process()?;
    c.p.send_line("exit")?;
    c.p.exp_eof()?;
    Ok(())
}

#[test]
fn reports_error_with_unsupported_shell_commands() -> Result<()> {
    let mut c = spawn_interactive_process()?;
    c.p.send_line("ls")?;
    c.p.exp_string("error: unrecognized subcommand 'ls'")?;
    expect_prompt(&mut c.p)?;
    Ok(())
}

#[test]
fn reports_error_with_nonsense_input() -> Result<()> {
    let mut c = spawn_interactive_process()?;
    c.p.send_line(" asd fg  ")?;
    c.p.exp_string("error: unrecognized subcommand 'asd'")?;
    expect_prompt(&mut c.p)?;
    Ok(())
}

#[test]
fn can_init_a_new_git_repo() -> Result<()> {
    let mut c = spawn_interactive_process()?;
    c.p.send_line("git-init my-new-repo")?;
    c.p.exp_string("Successfully created my-new-repo.git")?;
    expect_prompt(&mut c.p)?;

    Command::new("git")
        .arg("rev-list")
        .arg("--all")
        .current_dir(c.workdir.as_ref().join("git").join("my-new-repo.git"))
        .assert()
        .success()
        .stdout("");
    Ok(())
}

#[test]
fn runs_a_single_command_and_exit_with_cli_flag() -> Result<()> {
    let mut c = run_batch_command("git-init another-new-repo")?;
    c.p.exp_string("Successfully created another-new-repo.git")?;
    c.p.exp_eof()?;
    Ok(())
}