From cef74cbc8ccfac2b371db2cc9e99dda3c1fce166 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 17 Nov 2017 00:47:26 +0100 Subject: pull_request.rs: Add `pull_request_opened_or_synchronized()` A new function that, given the parsed JSON from a pull request webhook, tells us whether the pull request was "opened" or "synchronize"d with a boolean. This will enable us to only update commit statuses when actions on the pull request result in new commits being available. Otherwise, we don't want to set a commit status that we've already set before. --- src/pull_request.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'src/pull_request.rs') diff --git a/src/pull_request.rs b/src/pull_request.rs index fb06544..c4081f4 100644 --- a/src/pull_request.rs +++ b/src/pull_request.rs @@ -42,6 +42,18 @@ impl CommitRef { } } +pub fn pull_request_opened_or_synchronized( + mut github_push_event: json::JsonValue +) -> bool { + let action = github_push_event["action"].take_string().unwrap_or_default(); + + if action == "opened" || action == "synchronize" { + return true + } + + false +} + #[cfg(test)] mod tests { @@ -473,4 +485,52 @@ mod tests { assert_eq!(commit_ref.sha, "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"); assert_eq!(commit_ref.branch, "changes"); } + + #[test] + fn pull_request_opened_or_synchronized_returns_true_when_opened() { + let payload = r#"{ + "action": "opened" + }"#; + + let json = json::parse(payload) + .expect("Failed to parse payload."); + + assert_eq!( + pull_request_opened_or_synchronized(json), + true + ); + } + + #[test] + fn pull_request_opened_or_synchronized_returns_true_when_synchronized() { + let payload = r#"{ + "action": "synchronize" + }"#; + + let json = json::parse(payload) + .expect("Failed to parse payload."); + + assert_eq!( + pull_request_opened_or_synchronized(json), + true + ); + } + + #[test] + fn pull_request_opened_or_synchronized_returns_false_when_not_opened_or_synchronized() { + // "assigned", "unassigned", "review_requested", + // "review_request_removed", "labeled", "unlabeled", "opened", + // "edited", "closed", or "reopened" + let payload = r#"{ + "action": "review_requested" + }"#; + + let json = json::parse(payload) + .expect("Failed to parse payload."); + + assert_eq!( + pull_request_opened_or_synchronized(json), + false + ); + } } -- cgit v1.2.3 From 205fc3b71bd44067685c8517e7d126e3574827e1 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 17 Nov 2017 00:54:27 +0100 Subject: CommitRef::new(): Take a `JsonValue` instead of an `&str` We expect to have pre-parsed the JSON as this function will get called after `pull_request_opened_or_synchronized()`. To avoid doing the same JSON parsing work twice, take a `JsonValue` argument in both functions. --- src/pull_request.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src/pull_request.rs') diff --git a/src/pull_request.rs b/src/pull_request.rs index c4081f4..b110ea4 100644 --- a/src/pull_request.rs +++ b/src/pull_request.rs @@ -28,9 +28,9 @@ pub struct CommitRef { } impl CommitRef { - pub fn new(json_str: &str) -> Result> { - let mut github_push_event = json::parse(json_str)?; - + pub fn new( + mut github_push_event: json::JsonValue + ) -> Result> { Ok( CommitRef { owner: github_push_event["pull_request"]["head"]["repo"]["owner"]["login"].take_string().unwrap_or_default(), @@ -477,7 +477,10 @@ mod tests { } }"#; - let commit_ref = CommitRef::new(payload) + let json = json::parse(payload) + .expect("Failed to parse payload."); + + let commit_ref = CommitRef::new(json) .expect("Failed to create CommitRef from payload"); assert_eq!(commit_ref.owner, "baxterthehacker"); -- cgit v1.2.3