git-brws 0.9.1

Command line tool to open a repository, file, commit or diff in your web browser from command line
use crate::argv::*;
use std::env;
use std::fs;

#[test]
fn no_option() {
    match parse_options(&["git-brws"]).unwrap() {
        ParsedArgv::Parsed(o) => {
            println!("FOO! {:?}", o);
            assert!(vec![
                "https://github.com/rhysd/git-brws.git",
                "ssh://git@github.com:22/rhysd/git-brws.git",
                "git@github.com:rhysd/git-brws.git",
            ]
            .iter()
            .any(|u| o.repo == u.to_string()));
            assert_eq!(o.branch, None);
            assert!(o.git_dir.ends_with(".git"));
            assert!(o.args.is_empty());
            assert!(!o.stdout);
        }
        r => assert!(false, "Failed to parse args with no option: {:?}", r),
    };

    match parse_options(&["git-brws", "foo", "bar"]).unwrap() {
        ParsedArgv::Parsed(o) => {
            assert_eq!(o.args.len(), 2);
        }
        _ => assert!(false),
    };
}

#[test]
fn with_options() {
    match parse_options(&[
        "git-brws", "foo", "-u", "-r", "foo/bar", "--dir", ".", "bar", "-b", "dev",
    ])
    .unwrap()
    {
        ParsedArgv::Parsed(o) => {
            assert_eq!(o.repo, "https://github.com/foo/bar.git");
            assert_eq!(o.branch, Some("dev".to_string()));
            assert!(o.git_dir.ends_with(".git"));
            assert_eq!(o.args.len(), 2);
            assert!(o.stdout);
        }
        _ => assert!(false),
    };
}

#[test]
fn ssh_conversion_with_option() {
    match parse_options(&["git-brws", "-r", "git@github.com:user/repo.git"]).unwrap() {
        ParsedArgv::Parsed(o) => {
            assert_eq!(o.repo, "ssh://git@github.com:22/user/repo.git");
        }
        p => assert!(
            false,
            "Parse must be succeeded but actually results in {:?}",
            p
        ),
    };
}

#[test]
fn repo_formatting() {
    let p = |r| parse_options(&["git-brws", "-r", r]).unwrap();
    match p("bitbucket.org/foo/bar") {
        ParsedArgv::Parsed(o) => assert_eq!(o.repo, "https://bitbucket.org/foo/bar.git"),
        _ => assert!(false),
    }
    match p("https://gitlab.com/foo/bar") {
        ParsedArgv::Parsed(o) => assert_eq!(o.repo, "https://gitlab.com/foo/bar.git"),
        _ => assert!(false),
    }
}

#[test]
fn help_option() {
    match parse_options(&["git-brws", "-h"]).unwrap() {
        ParsedArgv::Help(s) => {
            assert!(s.starts_with("Usage:"));
        }
        _ => assert!(false),
    }
}

#[test]
fn version_option() {
    match parse_options(&["git-brws", "-v"]).unwrap() {
        ParsedArgv::Version(s) => {
            assert!(!s.is_empty());
        }
        _ => assert!(false),
    }
}

#[test]
fn unknown_options() {
    assert!(parse_options(&["git-brws", "--unknown"]).is_err());
}

#[test]
fn detect_git_dir() {
    let current = fs::canonicalize(env::current_dir().unwrap()).unwrap();
    let p = current.join("src").join("test");
    match parse_options(&["git-brws", "-d", p.to_str().unwrap()]).unwrap() {
        ParsedArgv::Parsed(o) => {
            let expected = current.join(".git");
            assert_eq!(o.git_dir, expected);
        }
        p => assert!(false, "{:?}", p),
    }
}