2023-01-05 11:41:14 +01:00
import { Args } from "@bp/service/args/args.types" ;
import { Configs } from "@bp/service/configs/configs.types" ;
import PullRequestConfigsParser from "@bp/service/configs/pullrequest/pr-configs-parser" ;
import GitServiceFactory from "@bp/service/git/git-service-factory" ;
import { GitServiceType } from "@bp/service/git/git.types" ;
import { setupMoctokit } from "../../../support/moctokit/moctokit-support" ;
import { mergedPullRequestFixture , openPullRequestFixture , notMergedPullRequestFixture , repo , targetOwner } from "../../../support/moctokit/moctokit-data" ;
describe ( "pull request config parser" , ( ) = > {
const mergedPRUrl = ` https://github.com/ ${ targetOwner } / ${ repo } /pull/ ${ mergedPullRequestFixture . number } ` ;
const openPRUrl = ` https://github.com/ ${ targetOwner } / ${ repo } /pull/ ${ openPullRequestFixture . number } ` ;
const notMergedPRUrl = ` https://github.com/ ${ targetOwner } / ${ repo } /pull/ ${ notMergedPullRequestFixture . number } ` ;
let parser : PullRequestConfigsParser ;
beforeAll ( ( ) = > {
GitServiceFactory . init ( GitServiceType . GITHUB , "whatever" ) ;
} ) ;
beforeEach ( ( ) = > {
setupMoctokit ( ) ;
parser = new PullRequestConfigsParser ( ) ;
} ) ;
afterEach ( ( ) = > {
jest . clearAllMocks ( ) ;
} ) ;
test ( "parse configs from pull request" , async ( ) = > {
const args : Args = {
dryRun : false ,
auth : "" ,
pullRequest : mergedPRUrl ,
2023-06-22 17:44:14 +02:00
targetBranch : "prod" ,
gitUser : "GitHub" ,
gitEmail : "noreply@github.com" ,
reviewers : [ ] ,
assignees : [ ] ,
inheritReviewers : true ,
2023-01-05 11:41:14 +01:00
} ;
const configs : Configs = await parser . parseAndValidate ( args ) ;
expect ( configs . dryRun ) . toEqual ( false ) ;
2023-06-22 17:44:14 +02:00
expect ( configs . git ) . toEqual ( {
user : "GitHub" ,
email : "noreply@github.com"
} ) ;
2023-01-05 11:41:14 +01:00
expect ( configs . auth ) . toEqual ( "" ) ;
expect ( configs . targetBranch ) . toEqual ( "prod" ) ;
expect ( configs . folder ) . toEqual ( process . cwd ( ) + "/bp" ) ;
expect ( configs . originalPullRequest ) . toEqual ( {
number : 2368 ,
author : "gh-user" ,
url : "https://api.github.com/repos/owner/reponame/pulls/2368" ,
htmlUrl : "https://github.com/owner/reponame/pull/2368" ,
state : "closed" ,
merged : true ,
mergedBy : "that-s-a-user" ,
title : "PR Title" ,
body : "Please review and merge" ,
reviewers : [ "requested-gh-user" , "gh-user" ] ,
2023-06-22 17:44:14 +02:00
assignees : [ ] ,
2023-01-05 11:41:14 +01:00
targetRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
sourceRepo : {
owner : "fork" ,
project : "reponame" ,
cloneUrl : "https://github.com/fork/reponame.git"
} ,
nCommits : 2 ,
commits : [ "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc" ]
} ) ;
expect ( configs . backportPullRequest ) . toEqual ( {
2023-06-22 17:44:14 +02:00
author : "GitHub" ,
2023-01-05 11:41:14 +01:00
url : undefined ,
htmlUrl : undefined ,
title : "[prod] PR Title" ,
body : "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge\r\n\r\nPowered by [BPer](https://github.com/lampajr/backporting)." ,
reviewers : [ "gh-user" , "that-s-a-user" ] ,
2023-06-22 17:44:14 +02:00
assignees : [ ] ,
2023-01-05 11:41:14 +01:00
targetRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
sourceRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
2023-06-20 22:29:52 +02:00
bpBranchName : undefined ,
2023-01-05 11:41:14 +01:00
nCommits : 0 ,
commits : [ ]
} ) ;
} ) ;
test ( "override folder" , async ( ) = > {
const args : Args = {
dryRun : true ,
auth : "whatever" ,
pullRequest : mergedPRUrl ,
targetBranch : "prod" ,
2023-06-22 17:44:14 +02:00
folder : "/tmp/test" ,
gitUser : "GitHub" ,
gitEmail : "noreply@github.com" ,
reviewers : [ ] ,
assignees : [ ] ,
inheritReviewers : true ,
2023-01-05 11:41:14 +01:00
} ;
const configs : Configs = await parser . parseAndValidate ( args ) ;
expect ( configs . dryRun ) . toEqual ( true ) ;
expect ( configs . auth ) . toEqual ( "whatever" ) ;
expect ( configs . targetBranch ) . toEqual ( "prod" ) ;
expect ( configs . folder ) . toEqual ( "/tmp/test" ) ;
2023-06-22 17:44:14 +02:00
expect ( configs . git ) . toEqual ( {
user : "GitHub" ,
email : "noreply@github.com"
} ) ;
2023-01-05 11:41:14 +01:00
} ) ;
test ( "override author" , async ( ) = > {
const args : Args = {
dryRun : true ,
auth : "whatever" ,
pullRequest : mergedPRUrl ,
targetBranch : "prod" ,
2023-06-22 17:44:14 +02:00
gitUser : "GitHub" ,
gitEmail : "noreply@github.com" ,
reviewers : [ ] ,
assignees : [ ] ,
inheritReviewers : true ,
2023-01-05 11:41:14 +01:00
} ;
const configs : Configs = await parser . parseAndValidate ( args ) ;
expect ( configs . dryRun ) . toEqual ( true ) ;
expect ( configs . auth ) . toEqual ( "whatever" ) ;
expect ( configs . targetBranch ) . toEqual ( "prod" ) ;
2023-06-22 17:44:14 +02:00
expect ( configs . git ) . toEqual ( {
user : "GitHub" ,
email : "noreply@github.com"
} ) ;
2023-01-05 11:41:14 +01:00
} ) ;
test ( "still open pull request" , async ( ) = > {
const args : Args = {
dryRun : true ,
auth : "whatever" ,
pullRequest : openPRUrl ,
2023-06-22 17:44:14 +02:00
targetBranch : "prod" ,
gitUser : "GitHub" ,
gitEmail : "noreply@github.com" ,
reviewers : [ ] ,
assignees : [ ] ,
inheritReviewers : true ,
2023-01-05 11:41:14 +01:00
} ;
const configs : Configs = await parser . parseAndValidate ( args ) ;
expect ( configs . dryRun ) . toEqual ( true ) ;
expect ( configs . auth ) . toEqual ( "whatever" ) ;
expect ( configs . targetBranch ) . toEqual ( "prod" ) ;
2023-06-22 17:44:14 +02:00
expect ( configs . git ) . toEqual ( {
user : "GitHub" ,
email : "noreply@github.com"
} ) ;
2023-01-05 11:41:14 +01:00
expect ( configs . originalPullRequest ) . toEqual ( {
number : 4444 ,
author : "gh-user" ,
url : "https://api.github.com/repos/owner/reponame/pulls/4444" ,
htmlUrl : "https://github.com/owner/reponame/pull/4444" ,
state : "open" ,
merged : false ,
mergedBy : "that-s-a-user" ,
title : "PR Title" ,
body : "Please review and merge" ,
reviewers : [ "gh-user" ] ,
2023-06-22 17:44:14 +02:00
assignees : [ ] ,
2023-01-05 11:41:14 +01:00
targetRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
sourceRepo : {
owner : "fork" ,
project : "reponame" ,
cloneUrl : "https://github.com/fork/reponame.git"
} ,
2023-06-20 22:29:52 +02:00
bpBranchName : undefined ,
2023-01-05 11:41:14 +01:00
nCommits : 2 ,
// taken from head.sha
commits : [ "91748965051fae1330ad58d15cf694e103267c87" ]
} ) ;
} ) ;
test ( "closed pull request" , async ( ) = > {
const args : Args = {
dryRun : true ,
auth : "whatever" ,
pullRequest : notMergedPRUrl ,
2023-06-22 17:44:14 +02:00
targetBranch : "prod" ,
gitUser : "GitHub" ,
gitEmail : "noreply@github.com" ,
reviewers : [ ] ,
assignees : [ ] ,
inheritReviewers : true ,
2023-01-05 11:41:14 +01:00
} ;
expect ( async ( ) = > await parser . parseAndValidate ( args ) ) . rejects . toThrow ( "Provided pull request is closed and not merged!" ) ;
} ) ;
2023-06-20 22:29:52 +02:00
2023-06-22 17:44:14 +02:00
test ( "override backport pr data inherting reviewers" , async ( ) = > {
2023-06-20 22:29:52 +02:00
const args : Args = {
dryRun : false ,
auth : "" ,
pullRequest : mergedPRUrl ,
targetBranch : "prod" ,
2023-06-22 17:44:14 +02:00
gitUser : "Me" ,
gitEmail : "me@email.com" ,
2023-06-20 22:29:52 +02:00
title : "New Title" ,
body : "New Body" ,
bodyPrefix : "New Body Prefix -" ,
2023-06-22 17:44:14 +02:00
reviewers : [ ] ,
assignees : [ ] ,
inheritReviewers : true ,
2023-06-20 22:29:52 +02:00
} ;
const configs : Configs = await parser . parseAndValidate ( args ) ;
expect ( configs . dryRun ) . toEqual ( false ) ;
2023-06-22 17:44:14 +02:00
expect ( configs . git ) . toEqual ( {
user : "Me" ,
email : "me@email.com"
} ) ;
2023-06-20 22:29:52 +02:00
expect ( configs . auth ) . toEqual ( "" ) ;
expect ( configs . targetBranch ) . toEqual ( "prod" ) ;
expect ( configs . folder ) . toEqual ( process . cwd ( ) + "/bp" ) ;
expect ( configs . originalPullRequest ) . toEqual ( {
number : 2368 ,
author : "gh-user" ,
url : "https://api.github.com/repos/owner/reponame/pulls/2368" ,
htmlUrl : "https://github.com/owner/reponame/pull/2368" ,
state : "closed" ,
merged : true ,
mergedBy : "that-s-a-user" ,
title : "PR Title" ,
body : "Please review and merge" ,
reviewers : [ "requested-gh-user" , "gh-user" ] ,
2023-06-22 17:44:14 +02:00
assignees : [ ] ,
2023-06-20 22:29:52 +02:00
targetRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
sourceRepo : {
owner : "fork" ,
project : "reponame" ,
cloneUrl : "https://github.com/fork/reponame.git"
} ,
bpBranchName : undefined ,
nCommits : 2 ,
commits : [ "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc" ] ,
} ) ;
expect ( configs . backportPullRequest ) . toEqual ( {
2023-06-22 17:44:14 +02:00
author : "Me" ,
2023-06-20 22:29:52 +02:00
url : undefined ,
htmlUrl : undefined ,
title : "New Title" ,
body : "New Body Prefix -New Body" ,
reviewers : [ "gh-user" , "that-s-a-user" ] ,
2023-06-22 17:44:14 +02:00
assignees : [ ] ,
targetRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
sourceRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
bpBranchName : undefined ,
nCommits : 0 ,
commits : [ ]
} ) ;
} ) ;
test ( "override backport pr reviewers and assignees" , async ( ) = > {
const args : Args = {
dryRun : false ,
auth : "" ,
pullRequest : mergedPRUrl ,
targetBranch : "prod" ,
gitUser : "Me" ,
gitEmail : "me@email.com" ,
title : "New Title" ,
body : "New Body" ,
bodyPrefix : "New Body Prefix -" ,
reviewers : [ "user1" , "user2" ] ,
assignees : [ "user3" , "user4" ] ,
inheritReviewers : true , // not taken into account
} ;
const configs : Configs = await parser . parseAndValidate ( args ) ;
expect ( configs . dryRun ) . toEqual ( false ) ;
expect ( configs . git ) . toEqual ( {
user : "Me" ,
email : "me@email.com"
} ) ;
expect ( configs . auth ) . toEqual ( "" ) ;
expect ( configs . targetBranch ) . toEqual ( "prod" ) ;
expect ( configs . folder ) . toEqual ( process . cwd ( ) + "/bp" ) ;
expect ( configs . originalPullRequest ) . toEqual ( {
number : 2368 ,
author : "gh-user" ,
url : "https://api.github.com/repos/owner/reponame/pulls/2368" ,
htmlUrl : "https://github.com/owner/reponame/pull/2368" ,
state : "closed" ,
merged : true ,
mergedBy : "that-s-a-user" ,
title : "PR Title" ,
body : "Please review and merge" ,
reviewers : [ "requested-gh-user" , "gh-user" ] ,
assignees : [ ] ,
targetRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
sourceRepo : {
owner : "fork" ,
project : "reponame" ,
cloneUrl : "https://github.com/fork/reponame.git"
} ,
bpBranchName : undefined ,
nCommits : 2 ,
commits : [ "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc" ] ,
} ) ;
expect ( configs . backportPullRequest ) . toEqual ( {
author : "Me" ,
url : undefined ,
htmlUrl : undefined ,
title : "New Title" ,
body : "New Body Prefix -New Body" ,
reviewers : [ "user1" , "user2" ] ,
assignees : [ "user3" , "user4" ] ,
targetRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
sourceRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
bpBranchName : undefined ,
nCommits : 0 ,
commits : [ ]
} ) ;
} ) ;
test ( "override backport pr empty reviewers" , async ( ) = > {
const args : Args = {
dryRun : false ,
auth : "" ,
pullRequest : mergedPRUrl ,
targetBranch : "prod" ,
gitUser : "Me" ,
gitEmail : "me@email.com" ,
title : "New Title" ,
body : "New Body" ,
bodyPrefix : "New Body Prefix -" ,
reviewers : [ ] ,
assignees : [ "user3" , "user4" ] ,
inheritReviewers : false ,
} ;
const configs : Configs = await parser . parseAndValidate ( args ) ;
expect ( configs . dryRun ) . toEqual ( false ) ;
expect ( configs . git ) . toEqual ( {
user : "Me" ,
email : "me@email.com"
} ) ;
expect ( configs . auth ) . toEqual ( "" ) ;
expect ( configs . targetBranch ) . toEqual ( "prod" ) ;
expect ( configs . folder ) . toEqual ( process . cwd ( ) + "/bp" ) ;
expect ( configs . originalPullRequest ) . toEqual ( {
number : 2368 ,
author : "gh-user" ,
url : "https://api.github.com/repos/owner/reponame/pulls/2368" ,
htmlUrl : "https://github.com/owner/reponame/pull/2368" ,
state : "closed" ,
merged : true ,
mergedBy : "that-s-a-user" ,
title : "PR Title" ,
body : "Please review and merge" ,
reviewers : [ "requested-gh-user" , "gh-user" ] ,
assignees : [ ] ,
targetRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
sourceRepo : {
owner : "fork" ,
project : "reponame" ,
cloneUrl : "https://github.com/fork/reponame.git"
} ,
bpBranchName : undefined ,
nCommits : 2 ,
commits : [ "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc" ] ,
} ) ;
expect ( configs . backportPullRequest ) . toEqual ( {
author : "Me" ,
url : undefined ,
htmlUrl : undefined ,
title : "New Title" ,
body : "New Body Prefix -New Body" ,
reviewers : [ ] ,
assignees : [ "user3" , "user4" ] ,
2023-06-20 22:29:52 +02:00
targetRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
sourceRepo : {
owner : "owner" ,
project : "reponame" ,
cloneUrl : "https://github.com/owner/reponame.git"
} ,
bpBranchName : undefined ,
nCommits : 0 ,
commits : [ ]
} ) ;
} ) ;
2023-01-05 11:41:14 +01:00
} ) ;