gitee-cli-rs 0.2.2

A gh-like command-line client for Gitee
Documentation
use gitee_cli_rs::models::{FileDiff, Issue, IssueState, PrState, PullRequest, Release, RepoDetails};

const PULL_REQUEST_JSON: &str = include_str!("fixtures/pull_request.json");
const PR_FILE_DIFF_JSON: &str = include_str!("fixtures/pr_file_diff.json");
const ISSUE_JSON: &str = include_str!("fixtures/issue.json");
const REPO_LIST_JSON: &str = include_str!("fixtures/repo_list.json");
const RELEASE_JSON: &str = include_str!("fixtures/release.json");

#[test]
fn fixture_pull_request_deserializes() {
    let pr: PullRequest = serde_json::from_str(PULL_REQUEST_JSON).expect("pull request json");
    assert_eq!(pr.number, 12);
    assert_eq!(pr.title, "Add pagination helpers");
    assert_eq!(pr.state, PrState::Open);
    assert_eq!(pr.head.git_ref, "feature/paging");
    assert_eq!(pr.base.git_ref, "master");
    assert_eq!(pr.user.as_ref().expect("user").login, "dev1");
    assert_eq!(pr.labels.as_ref().expect("labels").len(), 1);
}

#[test]
fn fixture_pr_file_diff_deserializes() {
    let files: Vec<FileDiff> = serde_json::from_str(PR_FILE_DIFF_JSON).expect("file diff json");
    assert_eq!(files.len(), 2);
    assert_eq!(files[0].path, "pom.xml");
    assert_eq!(files[0].additions.as_deref(), Some("5"));
    assert_eq!(files[0].deletions.as_deref(), Some("6"));
    assert!(files[0].patch.as_ref().expect("patch").contains("3.5.15"));
    assert_eq!(files[1].path, "logo.png");
    assert!(files[1].patch.is_none());
}

#[test]
fn fixture_issue_deserializes() {
    let issue: Issue = serde_json::from_str(ISSUE_JSON).expect("issue json");
    assert_eq!(issue.number, "88");
    assert_eq!(issue.title, "Login fails with expired token");
    assert_eq!(issue.state, IssueState::Open);
    assert_eq!(issue.user.as_ref().expect("user").login, "reporter");
    assert_eq!(issue.assignee.as_ref().expect("assignee").login, "dev1");
    assert_eq!(issue.labels.as_ref().expect("labels").len(), 2);
    assert_eq!(issue.comments, Some(7));
}

#[test]
fn fixture_repo_list_deserializes() {
    let repos: Vec<RepoDetails> = serde_json::from_str(REPO_LIST_JSON).expect("repo list json");
    assert_eq!(repos.len(), 2);
    assert_eq!(repos[0].full_name, "oschina/gitee-cli");
    assert_eq!(repos[0].stargazers_count, Some(128));
    assert_eq!(repos[1].full_name, "oschina/docs");
    assert_eq!(repos[1].private, Some(true));
    assert!(repos[1].parent.is_some());
}

#[test]
fn fixture_release_deserializes() {
    let release: Release = serde_json::from_str(RELEASE_JSON).expect("release json");
    assert_eq!(release.id, 12345);
    assert_eq!(release.tag_name, "v1.2.0");
    assert_eq!(release.target_commitish.as_deref(), Some("master"));
    assert_eq!(release.name.as_deref(), Some("v1.2.0"));
    assert_eq!(release.prerelease, Some(false));
    assert_eq!(release.author.as_ref().expect("author").login, "dev1");
    assert_eq!(release.assets.as_ref().expect("assets").len(), 2);
    assert_eq!(
        release.assets.as_ref().expect("assets")[0].name,
        "gitee-linux-amd64.tar.xz"
    );
}