From 5527f90beb3f16ed6ab976527d2b213df52d86ae Mon Sep 17 00:00:00 2001 From: Ricardo Amador Date: Mon, 24 Oct 2022 13:29:40 -0700 Subject: [PATCH 1/2] Updated to allow different merge methods in pulls_service. --- lib/src/common/pulls_service.dart | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 9c611cf9..bbf45a51 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -121,15 +121,27 @@ class PullRequestsService extends Service { RepositorySlug slug, int number, { String? message, + MergeMethod mergeMethod = MergeMethod.merge, + String? requestSha, }) { final json = {}; if (message != null) { json['commit_message'] = message; } + if (requestSha != null) { + json['sha'] = requestSha; + } + + json['merge_method'] = mergeMethod.name; + + // Recommended Accept header when making a merge request. + Map? headers = {}; + headers['Accept'] = 'application/vnd.github+json'; return github .request('PUT', '/repos/${slug.fullName}/pulls/$number/merge', + headers: headers, body: GitHubJson.encode(json)) .then((response) { return PullRequestMerge.fromJson( @@ -184,3 +196,9 @@ class PullRequestsService extends Service { ); } } + +enum MergeMethod { + merge, + squash, + rebase, +} \ No newline at end of file From 338fb824f98f7aa5cebfc3502ad2c39136d26699 Mon Sep 17 00:00:00 2001 From: Ricardo Amador Date: Thu, 27 Oct 2022 17:33:47 -0700 Subject: [PATCH 2/2] Adding tests for pulls service merge changes. --- test/pulls_test.dart | 143 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 test/pulls_test.dart diff --git a/test/pulls_test.dart b/test/pulls_test.dart new file mode 100644 index 00000000..ae711b2c --- /dev/null +++ b/test/pulls_test.dart @@ -0,0 +1,143 @@ +import 'dart:async'; + +import 'package:github/src/common.dart'; +import 'package:http/http.dart' as http; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; + +import 'src/mocks.mocks.dart'; + +void main() { + late MockGitHub github; + late PullRequestsService pulls; + late RepositorySlug repo; + const someSha = 'someSHA'; + + setUp(() { + github = MockGitHub(); + pulls = PullRequestsService(github); + repo = RepositorySlug('o', 'n'); + }); + + group('Merge', () { + test('Merge() normal', () async { + const expectedMessage = 'Pull Request successfully merged'; + const expectedMerge = true; + + when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) + .thenAnswer((_) => Future.value( + http.Response('''{ + "sha": "$someSha", + "merged": $expectedMerge, + "message": "$expectedMessage" + }''', 200) + )); + + var pullRequestMerge = await pulls.merge(repo, 1); + + verify(github.request('PUT', '/repos/o/n/pulls/1/merge', + headers: anyNamed("headers"), body: '''{"merge_method":"merge"}''')); + + expect(pullRequestMerge.merged, isTrue); + expect(pullRequestMerge.message, expectedMessage); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with squash', () async { + const expectedMessage = 'Pull Request successfully merged'; + const expectedMerge = true; + + when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) + .thenAnswer((_) => Future.value( + http.Response('''{ + "sha": "$someSha", + "merged": $expectedMerge, + "message": "$expectedMessage" + }''', 200) + )); + + var pullRequestMerge = await pulls.merge(repo, 1, mergeMethod: MergeMethod.squash); + + verify(github.request('PUT', '/repos/o/n/pulls/1/merge', + headers: anyNamed("headers"), body: '''{"merge_method":"squash"}''')); + + expect(pullRequestMerge.merged, isTrue); + expect(pullRequestMerge.message, expectedMessage); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with rebase', () async { + const expectedMessage = 'Pull Request successfully merged'; + const expectedMerge = true; + + when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) + .thenAnswer((_) => Future.value( + http.Response('''{ + "sha": "$someSha", + "merged": $expectedMerge, + "message": "$expectedMessage" + }''', 200) + )); + + var pullRequestMerge = await pulls.merge(repo, 1, mergeMethod: MergeMethod.rebase); + + verify(github.request('PUT', '/repos/o/n/pulls/1/merge', + headers: anyNamed("headers"), body: '''{"merge_method":"rebase"}''')); + + expect(pullRequestMerge.merged, isTrue); + expect(pullRequestMerge.message, expectedMessage); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with commitMessage', () async { + const expectedMessage = 'Pull Request successfully merged'; + const expectedMerge = true; + const commitMessage = 'Some message'; + + when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) + .thenAnswer((_) => Future.value( + http.Response('''{ + "sha": "$someSha", + "merged": $expectedMerge, + "message": "$expectedMessage" + }''', 200) + )); + + var pullRequestMerge = await pulls.merge(repo, 1, message: commitMessage, mergeMethod: MergeMethod.squash); + + verify(github.request('PUT', '/repos/o/n/pulls/1/merge', + headers: anyNamed("headers"), body: '''{"commit_message":"$commitMessage","merge_method":"squash"}''')); + + expect(pullRequestMerge.merged, isTrue); + expect(pullRequestMerge.message, expectedMessage); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with commitMessage, with sha', () async { + const expectedMessage = 'Pull Request successfully merged'; + const expectedMerge = true; + const commitMessage = 'Some message'; + const commitSha = 'commitSha'; + + when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) + .thenAnswer((_) => Future.value( + http.Response('''{ + "sha": "$someSha", + "merged": $expectedMerge, + "message": "$expectedMessage" + }''', 200) + )); + + var pullRequestMerge = await pulls.merge(repo, 1, message: commitMessage, + mergeMethod: MergeMethod.squash, requestSha: commitSha); + + verify(github.request('PUT', '/repos/o/n/pulls/1/merge', + headers: anyNamed("headers"), + body: '''{"commit_message":"$commitMessage","sha":"$commitSha","merge_method":"squash"}''')); + + expect(pullRequestMerge.merged, isTrue); + expect(pullRequestMerge.message, expectedMessage); + expect(pullRequestMerge.sha, someSha); + }); + }); +} \ No newline at end of file