use wiremock::{
matchers::{method, path},
Mock, MockServer, ResponseTemplate,
};
use mock_error::setup_error_handler;
use octocrab::models::checks::{AutoTriggerCheck, CheckSuite, CheckSuitePreferences};
use octocrab::models::{AppId, CheckRunId, CheckSuiteId};
use octocrab::params::repos::Commitish;
use octocrab::Octocrab;
mod mock_error;
const OWNER: &str = "XAMPPRocky";
const REPO: &str = "octocrab";
async fn setup_api(template: ResponseTemplate) -> MockServer {
let mock_server = MockServer::start().await;
Mock::given(method("POST"))
.and(path(format!("/repos/{OWNER}/{REPO}/check-suites")))
.respond_with(template)
.mount(&mock_server)
.await;
setup_error_handler(
&mock_server,
"POST on /repos/OWNER/REPO/check-suites not called",
)
.await;
mock_server
}
fn setup_octocrab(uri: &str) -> Octocrab {
Octocrab::builder().base_uri(uri).unwrap().build().unwrap()
}
#[tokio::test]
async fn should_create_check_suite() {
let check_suite_response: CheckSuite =
serde_json::from_str(include_str!("resources/check_suite.json")).unwrap();
let template = ResponseTemplate::new(200).set_body_json(&check_suite_response);
let mock_server = setup_api(template).await;
let client = setup_octocrab(&mock_server.uri());
let head_sha = "d6fde92930d4715a2b49857d24b940956b26d2d3";
let result = client
.checks(OWNER, REPO)
.create_check_suite(head_sha)
.send()
.await;
assert!(
result.is_ok(),
"expected successful result, got error: {:#?}",
result
);
let check_suite = result.unwrap();
assert_eq!(check_suite.head_sha, head_sha);
}
#[tokio::test]
async fn should_patch_check_suite_preferences() {
let mock_server = MockServer::start().await;
let check_suite_response: CheckSuitePreferences =
serde_json::from_str(include_str!("resources/check_suite_preferences.json")).unwrap();
let response = ResponseTemplate::new(200).set_body_json(&check_suite_response);
let mock = Mock::given(method("PATCH"))
.and(path(format!(
"/repos/{OWNER}/{REPO}/check-suites/preferences"
)))
.respond_with(response.clone());
mock_server.register(mock).await;
let client = setup_octocrab(&mock_server.uri());
let check_suite_patches = vec![AutoTriggerCheck {
app_id: AppId(42),
setting: true,
}];
let result = client
.checks(OWNER, REPO) .update_preferences(check_suite_patches)
.send()
.await;
assert!(
result.is_ok(),
"expected successful result, got error: {:#?}",
result
);
let upd_pref_result = result.unwrap();
assert_eq!(upd_pref_result.preferences.auto_trigger_checks.len(), 2);
}
#[tokio::test]
async fn should_get_check_suite() {
let mock_server = MockServer::start().await;
let check_suite_response: CheckSuite =
serde_json::from_str(include_str!("resources/check_suite.json")).unwrap();
let response = ResponseTemplate::new(200).set_body_json(&check_suite_response);
const CHECK_SUITE_ID: i32 = 5;
let mock = Mock::given(method("GET"))
.and(path(format!(
"/repos/{OWNER}/{REPO}/check-suites/{CHECK_SUITE_ID}"
)))
.respond_with(response.clone());
mock_server.register(mock).await;
let client = setup_octocrab(&mock_server.uri());
let result = client
.checks(OWNER, REPO)
.get_check_suite(CheckSuiteId(5))
.send()
.await;
assert!(
result.is_ok(),
"expected successful result, got error: {:#?}",
result
);
let get_cs_result = result.unwrap();
assert_eq!(get_cs_result.id, CheckSuiteId(5));
}
#[tokio::test]
async fn should_trigger_rerequest_check_suite() {
let mock_server = MockServer::start().await;
let response = ResponseTemplate::new(201);
const CHECK_SUITE_ID: i32 = 42;
let mock = Mock::given(method("POST"))
.and(path(format!(
"/repos/{OWNER}/{REPO}/check-suites/{CHECK_SUITE_ID}/rerequest"
)))
.respond_with(response.clone());
mock_server.register(mock).await;
let client = setup_octocrab(&mock_server.uri());
let result = client
.checks(OWNER, REPO)
.rerequest_check_suite(CheckSuiteId(42))
.send()
.await;
assert!(
result.is_ok(),
"expected successful result, got error: {:#?}",
result
);
}
#[tokio::test]
async fn should_trigger_rerequest_check_run() {
let mock_server = MockServer::start().await;
let response = ResponseTemplate::new(201).set_body_string("");
const CHECK_RUN_ID: i32 = 42;
let mock = Mock::given(method("POST"))
.and(path(format!(
"/repos/{OWNER}/{REPO}/check-runs/{CHECK_RUN_ID}/rerequest"
)))
.respond_with(response.clone());
mock_server.register(mock).await;
let client = setup_octocrab(&mock_server.uri());
let result = client
.checks(OWNER, REPO)
.rerequest_check_run(CheckRunId(42))
.send()
.await;
assert!(
result.is_ok(),
"expected successful result, got error: {:#?}",
result
);
}
#[tokio::test]
async fn should_list_annotations() {
let mock_server = MockServer::start().await;
let response = ResponseTemplate::new(200)
.set_body_string(include_str!("resources/check_run_annotations.json"));
const CHECK_RUN_ID: i32 = 42;
let mock = Mock::given(method("GET"))
.and(path(format!(
"/repos/{OWNER}/{REPO}/check-runs/{CHECK_RUN_ID}/annotations"
)))
.respond_with(response.clone());
mock_server.register(mock).await;
let client = setup_octocrab(&mock_server.uri());
let result = client
.checks(OWNER, REPO)
.list_annotations(CheckRunId(42))
.send()
.await;
assert!(
result.is_ok(),
"expected successful result, got error: {:#?}",
result
);
let list_annotations_result = result.unwrap();
assert_eq!(list_annotations_result.len(), 1);
}
#[tokio::test]
async fn should_list_check_suites_for_ref() {
let mock_server = MockServer::start().await;
let response = ResponseTemplate::new(200)
.set_body_string(include_str!("resources/list_check_suites_for_ref.json"));
const COMMIT: &str = "42";
let mock = Mock::given(method("GET"))
.and(path(format!(
"/repos/{OWNER}/{REPO}/commits/{COMMIT}/check-suites"
)))
.respond_with(response.clone());
mock_server.register(mock).await;
let client = setup_octocrab(&mock_server.uri());
let result = client
.checks(OWNER, REPO)
.list_check_suites_for_git_ref(Commitish(String::from("42")))
.send()
.await;
assert!(
result.is_ok(),
"expected successful result, got error: {:#?}",
result
);
let list_check_suites_for_ref_result = result.unwrap();
assert_eq!(
list_check_suites_for_ref_result.total_count as u32,
list_check_suites_for_ref_result.check_suites.len() as u32
);
assert_eq!(
list_check_suites_for_ref_result.check_suites[0].id,
CheckSuiteId(5)
);
}