git-url-parse 0.6.0

A parser for urls used by git
Documentation
use git_url_parse::types::provider::{
    AzureDevOpsProvider, GenericProvider, GitLabProvider, GitProvider,
};
use git_url_parse::{GitUrl, GitUrlParseError};
use log::debug;

#[test]
fn http_generic_git() {
    let _ = env_logger::try_init();
    let test_url = "https://github.com/tjtelan/git-url-parse-rs.git";
    let parsed = GitUrl::parse(test_url).expect("URL parse failed");
    debug!("{:#?}", parsed);

    let provider_info: GenericProvider = parsed.provider_info().unwrap();
    debug!("{:#?}", provider_info);

    let owner = "tjtelan";
    let repo = "git-url-parse-rs";
    let full = format!("{owner}/{repo}");

    assert_eq!(provider_info.owner(), owner);
    assert_eq!(provider_info.repo(), repo);
    assert_eq!(provider_info.fullname(), full);
}

#[test]
fn ssh_generic_git() {
    let _ = env_logger::try_init();
    let test_url = "git@github.com:tjtelan/git-url-parse-rs.git";
    let parsed = GitUrl::parse(test_url).expect("URL parse failed");
    debug!("{:#?}", parsed);

    let provider_info: GenericProvider = parsed.provider_info().unwrap();
    debug!("{:#?}", provider_info);

    let owner = "tjtelan";
    let repo = "git-url-parse-rs";
    let full = format!("{owner}/{repo}");

    assert_eq!(provider_info.owner(), owner);
    assert_eq!(provider_info.repo(), repo);
    assert_eq!(provider_info.fullname(), full);
}

#[test]
fn custom_provider() {
    #[derive(Debug, Clone, PartialEq, Eq)]
    struct TestProvider;
    impl GitProvider<GitUrl, GitUrlParseError> for TestProvider {
        fn from_git_url(_url: &GitUrl) -> Result<Self, GitUrlParseError> {
            Ok(Self)
        }
    }

    let _ = env_logger::try_init();
    let test_url = "git@github.com:tjtelan/git-url-parse-rs.git";
    let parsed = GitUrl::parse(test_url).expect("URL parse failed");
    debug!("{:#?}", parsed);

    let provider_info: TestProvider = parsed.provider_info().unwrap();
    debug!("{:#?}", provider_info);

    let expected = TestProvider;
    assert_eq!(provider_info, expected)
}

#[test]
fn self_host() {
    let _ = env_logger::try_init();
    let test_url = "http://git.example.com:3000/user/repo.git";
    let parsed = GitUrl::parse(test_url).expect("URL parse failed");
    debug!("{:#?}", parsed);

    let provider_info: GenericProvider = parsed.provider_info().unwrap();
    debug!("{:#?}", provider_info);

    let owner = "user";
    let repo = "repo";
    let full = format!("{owner}/{repo}");

    assert_eq!(provider_info.owner(), owner);
    assert_eq!(provider_info.repo(), repo);
    assert_eq!(provider_info.fullname(), full);
}

#[test]
fn http_azure_devops() {
    let _ = env_logger::try_init();
    let test_url = "https://CompanyName@dev.azure.com/CompanyName/ProjectName/_git/RepoName";
    let parsed = GitUrl::parse(test_url).expect("URL parse failed");
    debug!("{:#?}", parsed);

    let provider_info: AzureDevOpsProvider = parsed.provider_info().unwrap();
    debug!("{:#?}", provider_info);

    let org = "CompanyName";
    let project = "ProjectName";
    let repo = "RepoName";
    let full = format!("{org}/{project}/{repo}");

    assert_eq!(provider_info.org(), org);
    assert_eq!(provider_info.project(), project);
    assert_eq!(provider_info.repo(), repo);
    assert_eq!(provider_info.fullname(), full);
}

#[test]
fn ssh_azure_devops() {
    let _ = env_logger::try_init();
    let test_url = "git@ssh.dev.azure.com:v3/CompanyName/ProjectName/RepoName.git";
    let parsed = GitUrl::parse(test_url).expect("URL parse failed");
    debug!("{:#?}", parsed);

    let provider_info: AzureDevOpsProvider = parsed.provider_info().unwrap();
    debug!("{:#?}", provider_info);

    let org = "CompanyName";
    let project = "ProjectName";
    let repo = "RepoName";
    let full = format!("{org}/{project}/{repo}");

    assert_eq!(provider_info.org(), org);
    assert_eq!(provider_info.project(), project);
    assert_eq!(provider_info.repo(), repo);
    assert_eq!(provider_info.fullname(), full);
}

#[test]
fn http_gitlab() {
    let _ = env_logger::try_init();
    let test_url = "https://gitlab.com/gitlab-org/gitlab.git";
    let parsed = GitUrl::parse(test_url).expect("URL parse failed");
    debug!("{:#?}", parsed);

    let provider_info: GitLabProvider = parsed.provider_info().unwrap();
    debug!("{:#?}", provider_info);

    let owner = "gitlab-org";
    let subgroup = None;
    let repo = "gitlab";
    let full = format!("{owner}/{repo}");

    assert_eq!(provider_info.owner(), owner);
    assert_eq!(provider_info.subgroup(), subgroup);
    assert_eq!(provider_info.repo(), repo);
    assert_eq!(provider_info.fullname(), full);
}

#[test]
fn ssh_gitlab() {
    let _ = env_logger::try_init();
    let test_url = "git@gitlab.com:gitlab-org/gitlab.git";
    let parsed = GitUrl::parse(test_url).expect("URL parse failed");
    debug!("{:#?}", parsed);

    let provider_info: GitLabProvider = parsed.provider_info().unwrap();
    debug!("{:#?}", provider_info);

    let owner = "gitlab-org";
    let subgroup = None;
    let repo = "gitlab";
    let full = format!("{owner}/{repo}");

    assert_eq!(provider_info.owner(), owner);
    assert_eq!(provider_info.subgroup(), subgroup);
    assert_eq!(provider_info.repo(), repo);
    assert_eq!(provider_info.fullname(), full);
}

#[test]
fn http_gitlab_subgroups() {
    let _ = env_logger::try_init();
    let test_url = "https://gitlab.com/gitlab-org/sbom/systems/gitlab-core.git";
    let parsed = GitUrl::parse(test_url).expect("URL parse failed");
    debug!("{:#?}", parsed);

    let provider_info: GitLabProvider = parsed.provider_info().unwrap();
    debug!("{:#?}", provider_info);

    let owner = "gitlab-org";
    let subgroup = Some(vec!["sbom", "systems"]);
    let repo = "gitlab-core";
    let full = format!("{owner}/{}/{repo}", "sbom/systems");

    assert_eq!(provider_info.owner(), owner);
    assert_eq!(provider_info.subgroup(), subgroup);
    assert_eq!(provider_info.repo(), repo);
    assert_eq!(provider_info.fullname(), full);
}

#[test]
fn ssh_gitlab_subgroups() {
    let _ = env_logger::try_init();
    let test_url = "git@gitlab.com:gitlab-org/sbom/systems/gitlab-core.git";
    let parsed = GitUrl::parse(test_url).expect("URL parse failed");
    debug!("{:#?}", parsed);

    let provider_info: GitLabProvider = parsed.provider_info().unwrap();
    debug!("{:#?}", provider_info);

    let owner = "gitlab-org";
    let subgroup = Some(vec!["sbom", "systems"]);
    let repo = "gitlab-core";
    let full = format!("{owner}/{}/{repo}", "sbom/systems");

    assert_eq!(provider_info.owner(), owner);
    assert_eq!(provider_info.subgroup(), subgroup);
    assert_eq!(provider_info.repo(), repo);
    assert_eq!(provider_info.fullname(), full);
}

#[test]
fn url_without_git_suffix() {
    let _ = env_logger::try_init();
    let test_url = "http://git.example.com:3000/user/repo";
    let parsed = GitUrl::parse(test_url).expect("URL parse failed");
    debug!("{:#?}", parsed);

    let provider_info: GenericProvider = parsed.provider_info().unwrap();
    debug!("{:#?}", provider_info);

    let owner = "user";
    let repo = "repo";
    let full = format!("{owner}/{repo}");

    assert_eq!(provider_info.owner(), owner);
    assert_eq!(provider_info.repo(), repo);
    assert_eq!(provider_info.fullname(), full);
}

#[test]
fn filepath() {
    let _ = env_logger::try_init();
    let test_url = "file:///home/user/Documents/";
    let parsed = GitUrl::parse(test_url).expect("URL parse failed");
    debug!("{:#?}", parsed);

    let provider_info: Result<GenericProvider, GitUrlParseError> = parsed.provider_info();
    debug!("{:#?}", provider_info);

    assert!(provider_info.is_err());
    if let Err(e) = provider_info {
        assert_eq!(e, GitUrlParseError::ProviderUnsupported)
    }
}