diff --git a/lib/src/common/checks_service.dart b/lib/src/common/checks_service.dart index f3085197..21feff81 100644 --- a/lib/src/common/checks_service.dart +++ b/lib/src/common/checks_service.dart @@ -231,6 +231,26 @@ class CheckRunsService extends Service { preview: _previewHeader, ); } + + /// Triggers GitHub to rerequest an existing check run, without pushing new code to a repository. + /// This endpoint will trigger the [`check_run` webhook](https://developer.github.com/v3/activity/events/types/#checkrunevent) event with the action rerequested. + /// When a check run is `rerequested`, the `status` of the check suite it belongs to is reset to `queued` and the `conclusion` is cleared. + /// The check run itself is not updated. + /// To rerequest a check run, your GitHub App must have the `checks:write` permission. + /// + /// API docs: https://docs.github.com/en/rest/checks/runs#rerequest-a-check-run + Future reRequestCheckRun( + RepositorySlug slug, { + required int checkRunId, + }) { + ArgumentError.checkNotNull(checkRunId); + return github.request( + 'POST', + 'repos/$slug/check-runs/$checkRunId/rerequest', + statusCode: StatusCodes.CREATED, + preview: _previewHeader, + ); + } } class CheckSuitesService extends Service { diff --git a/test/unit/checks_service_test.dart b/test/unit/checks_service_test.dart new file mode 100644 index 00000000..1da8579e --- /dev/null +++ b/test/unit/checks_service_test.dart @@ -0,0 +1,75 @@ +import 'package:github/github.dart'; +import 'package:http/http.dart'; +import 'package:http/testing.dart'; +import 'package:test/test.dart'; + +void main() { + group(ChecksService, () { + late GitHub github; + late ChecksService checksService; + Request? lastRequest; + + void setUpGitHub(Future Function(Request) handler) { + final client = MockClient((request) async { + lastRequest = request; + return handler(request); + }); + github = GitHub(client: client); + checksService = ChecksService(github); + } + + tearDown(() { + lastRequest = null; + }); + + group(CheckRunsService, () { + test('reRequestCheckRun', () async { + setUpGitHub((request) async { + return Response('', 201); + }); + + final slug = RepositorySlug('owner', 'repo'); + await checksService.checkRuns.reRequestCheckRun( + slug, + checkRunId: 123, + ); + + expect(lastRequest, isNotNull); + expect(lastRequest!.method, 'POST'); + expect( + lastRequest!.url.path, + '/repos/owner/repo/check-runs/123/rerequest', + ); + expect( + lastRequest!.headers['Accept'], + 'application/vnd.github.antiope-preview+json', + ); + }); + }); + + group(CheckSuitesService, () { + test('reRequestCheckSuite', () async { + setUpGitHub((request) async { + return Response('', 201); + }); + + final slug = RepositorySlug('owner', 'repo'); + await checksService.checkSuites.reRequestCheckSuite( + slug, + checkSuiteId: 456, + ); + + expect(lastRequest, isNotNull); + expect(lastRequest!.method, 'POST'); + expect( + lastRequest!.url.path, + '/repos/owner/repo/check-suites/456/rerequest', + ); + expect( + lastRequest!.headers['Accept'], + 'application/vnd.github.antiope-preview+json', + ); + }); + }); + }); +}