Skip to content

Commit 6da5a4f

Browse files
test: edit pr event
1 parent 6779c7e commit 6da5a4f

File tree

4 files changed

+179
-2
lines changed

4 files changed

+179
-2
lines changed

src/bors/handlers/review.rs

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ mod tests {
183183
use crate::{
184184
github::PullRequestNumber,
185185
tests::mocks::{
186-
default_pr_number, default_repo_name, BorsBuilder, BorsTester, Permissions, User, World,
186+
default_pr_number, default_repo_name, BorsBuilder, BorsTester, Permissions,
187+
PullRequestChangeEvent, User, World,
187188
},
188189
};
189190

@@ -306,6 +307,118 @@ approve = ["+approved"]
306307
.await;
307308
}
308309

310+
#[sqlx::test]
311+
async fn unapprove_on_base_edited(pool: sqlx::PgPool) {
312+
let world = World::default();
313+
world.default_repo().lock().set_config(
314+
r#"
315+
[labels]
316+
approve = ["+approved"]
317+
"#,
318+
);
319+
BorsBuilder::new(pool)
320+
.world(world)
321+
.run_test(|mut tester| async {
322+
tester.post_comment("@bors r+").await?;
323+
assert_eq!(
324+
tester.get_comment().await?,
325+
format!(
326+
"Commit pr-{}-sha has been approved by `{}`",
327+
default_pr_number(),
328+
User::default_user().name
329+
),
330+
);
331+
tester
332+
.edit_pull_request(
333+
default_pr_number(),
334+
PullRequestChangeEvent {
335+
from_base_sha: Some("main-sha".to_string()),
336+
},
337+
)
338+
.await?;
339+
340+
assert_eq!(
341+
tester.get_comment().await?,
342+
format!(
343+
r#":warning: The base branch changed to `pr-{}-sha`, and the
344+
PR will need to be re-approved."#,
345+
default_pr_number()
346+
)
347+
);
348+
check_pr_unapproved(&tester, default_pr_number().into()).await;
349+
Ok(tester)
350+
})
351+
.await;
352+
}
353+
354+
#[sqlx::test]
355+
async fn edit_pr_do_nothing_when_base_not_edited(pool: sqlx::PgPool) {
356+
let world = World::default();
357+
world.default_repo().lock().set_config(
358+
r#"
359+
[labels]
360+
approve = ["+approved"]
361+
"#,
362+
);
363+
BorsBuilder::new(pool)
364+
.world(world)
365+
.run_test(|mut tester| async {
366+
tester.post_comment("@bors r+").await?;
367+
assert_eq!(
368+
tester.get_comment().await?,
369+
format!(
370+
"Commit pr-{}-sha has been approved by `{}`",
371+
default_pr_number(),
372+
User::default_user().name
373+
),
374+
);
375+
tester
376+
.edit_pull_request(
377+
default_pr_number(),
378+
PullRequestChangeEvent {
379+
from_base_sha: None,
380+
},
381+
)
382+
.await?;
383+
384+
check_pr_approved_by(
385+
&tester,
386+
default_pr_number().into(),
387+
&User::default_user().name,
388+
)
389+
.await;
390+
Ok(tester)
391+
})
392+
.await;
393+
}
394+
395+
#[sqlx::test]
396+
async fn edit_pr_do_nothing_when_not_approved(pool: sqlx::PgPool) {
397+
let world = World::default();
398+
world.default_repo().lock().set_config(
399+
r#"
400+
[labels]
401+
approve = ["+approved"]
402+
"#,
403+
);
404+
BorsBuilder::new(pool)
405+
.world(world)
406+
.run_test(|mut tester| async {
407+
tester
408+
.edit_pull_request(
409+
default_pr_number(),
410+
PullRequestChangeEvent {
411+
from_base_sha: Some("main-sha".to_string()),
412+
},
413+
)
414+
.await?;
415+
416+
// No comment should be posted
417+
Ok(tester)
418+
})
419+
.await;
420+
}
421+
309422
async fn check_pr_approved_by(
310423
tester: &BorsTester,
311424
pr_number: PullRequestNumber,

src/tests/mocks/bors.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ use crate::{
2828
ServerState, WebhookSecret,
2929
};
3030

31+
use super::pull_request::{GitHubPullRequestEventPayload, PullRequestChangeEvent};
32+
3133
pub struct BorsBuilder {
3234
world: World,
3335
pool: PgPool,
@@ -266,6 +268,18 @@ impl BorsTester {
266268
self.webhook_check_suite(check_suite.into()).await
267269
}
268270

271+
pub async fn edit_pull_request(
272+
&mut self,
273+
pr_number: u64,
274+
changes: PullRequestChangeEvent,
275+
) -> anyhow::Result<()> {
276+
self.send_webhook(
277+
"pull_request",
278+
GitHubPullRequestEventPayload::new(pr_number, "edited".to_string(), Some(changes)),
279+
)
280+
.await
281+
}
282+
269283
async fn webhook_comment(&mut self, comment: Comment) -> anyhow::Result<()> {
270284
self.send_webhook(
271285
"issue_comment",

src/tests/mocks/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub use bors::BorsTester;
1818
pub use comment::Comment;
1919
pub use permissions::Permissions;
2020
pub use pull_request::default_pr_number;
21+
pub use pull_request::PullRequestChangeEvent;
2122
pub use repository::default_repo_name;
2223
pub use repository::Branch;
2324
pub use repository::Repo;

src/tests/mocks/pull_request.rs

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ use wiremock::{
1212

1313
use super::{
1414
comment::{Comment, GitHubComment},
15-
dynamic_mock_req,
15+
default_repo_name, dynamic_mock_req,
16+
repository::GitHubRepository,
1617
user::GitHubUser,
1718
Repo, User,
1819
};
@@ -210,3 +211,51 @@ struct GitHubLabel {
210211
color: String,
211212
default: bool,
212213
}
214+
215+
#[derive(Serialize)]
216+
pub(super) struct GitHubPullRequestEventPayload {
217+
action: String,
218+
pull_request: GitHubPullRequest,
219+
changes: Option<GitHubPullRequestChanges>,
220+
repository: GitHubRepository,
221+
}
222+
223+
impl GitHubPullRequestEventPayload {
224+
pub fn new(pr_number: u64, action: String, changes: Option<PullRequestChangeEvent>) -> Self {
225+
GitHubPullRequestEventPayload {
226+
action,
227+
pull_request: GitHubPullRequest::new(pr_number),
228+
changes: changes.map(Into::into),
229+
repository: default_repo_name().into(),
230+
}
231+
}
232+
}
233+
234+
#[derive(Serialize)]
235+
struct GitHubPullRequestChanges {
236+
base: Option<GitHubPullRequestBaseChanges>,
237+
}
238+
239+
#[derive(Serialize)]
240+
struct GitHubPullRequestBaseChanges {
241+
sha: Option<PullRequestEventChangesFrom>,
242+
}
243+
244+
#[derive(Serialize)]
245+
struct PullRequestEventChangesFrom {
246+
pub from: String,
247+
}
248+
249+
impl From<PullRequestChangeEvent> for GitHubPullRequestChanges {
250+
fn from(value: PullRequestChangeEvent) -> Self {
251+
GitHubPullRequestChanges {
252+
base: value.from_base_sha.map(|sha| GitHubPullRequestBaseChanges {
253+
sha: Some(PullRequestEventChangesFrom { from: sha }),
254+
}),
255+
}
256+
}
257+
}
258+
259+
pub struct PullRequestChangeEvent {
260+
pub from_base_sha: Option<String>,
261+
}

0 commit comments

Comments
 (0)