gitee-cli-rs 0.1.4

A gh-like command-line client for Gitee
Documentation
use gitee_cli_rs::api::client::Client;
use gitee_cli_rs::api::users::UserIssueFilter;

const ISSUE_JSON: &str = include_str!("fixtures/issue.json");

fn client(server: &mockito::ServerGuard) -> Client {
    Client::new(format!("{}/api/v5", server.url()), "fake-token".into())
}

fn api_path(path: &str) -> String {
    format!("/api/v5{path}")
}

#[test]
fn me_hits_user_path_and_deserializes_login() {
    let mut server = mockito::Server::new();

    let mock = server
        .mock("GET", api_path("/user").as_str())
        .with_status(200)
        .with_header("content-type", "application/json")
        .with_body(r#"{"id": 42, "login": "dev1", "name": "Developer One"}"#)
        .create();

    let me = client(&server).users().me().expect("me should succeed");

    mock.assert();
    assert_eq!(me.login, "dev1");
    assert_eq!(me.name.as_deref(), Some("Developer One"));
}

#[test]
fn user_issues_sends_filter_and_state_single_page() {
    let mut server = mockito::Server::new();

    let mock = server
        .mock("GET", api_path("/user/issues").as_str())
        .match_query(mockito::Matcher::AllOf(vec![
            mockito::Matcher::UrlEncoded("page".into(), "1".into()),
            mockito::Matcher::UrlEncoded("per_page".into(), "100".into()),
            mockito::Matcher::UrlEncoded("filter".into(), "assigned".into()),
            mockito::Matcher::UrlEncoded("state".into(), "open".into()),
        ]))
        .with_status(200)
        .with_header("content-type", "application/json")
        .with_body(format!("[{ISSUE_JSON}]"))
        .create();

    let items = client(&server)
        .users()
        .issues(&UserIssueFilter {
            filter: "assigned",
            state: Some("open"),
            limit: 50,
        })
        .expect("user issues should succeed");

    mock.assert();
    assert_eq!(items.len(), 1);
    assert_eq!(items[0].number, "88");
    assert_eq!(items[0].title, "Login fails with expired token");
}

#[test]
fn user_issues_sends_created_filter_and_parses_empty_page() {
    let mut server = mockito::Server::new();

    let mock = server
        .mock("GET", api_path("/user/issues").as_str())
        .match_query(mockito::Matcher::AllOf(vec![mockito::Matcher::UrlEncoded(
            "filter".into(),
            "created".into(),
        )]))
        .with_status(200)
        .with_header("content-type", "application/json")
        .with_body("[]")
        .create();

    let items = client(&server)
        .users()
        .issues(&UserIssueFilter {
            filter: "created",
            state: None,
            limit: 50,
        })
        .expect("user issues should succeed");

    mock.assert();
    assert!(items.is_empty());
}