| // Copyright 2022 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:convert'; |
| import 'dart:typed_data'; |
| |
| import 'package:auto_submit/requests/exceptions.dart'; |
| import 'package:auto_submit/requests/github_webhook.dart'; |
| import 'package:cocoon_server_test/test_logging.dart'; |
| import 'package:crypto/crypto.dart'; |
| import 'package:github/github.dart'; |
| import 'package:shelf/shelf.dart'; |
| import 'package:test/test.dart'; |
| |
| import '../src/request_handling/fake_pubsub.dart'; |
| import '../src/service/fake_config.dart'; |
| import './github_webhook_test_data.dart'; |
| |
| void main() { |
| useTestLoggerPerTest(); |
| |
| group('Check Webhook', () { |
| late Request req; |
| late GithubWebhook githubWebhook; |
| const keyString = 'not_a_real_key'; |
| final config = FakeConfig(webhookKey: keyString); |
| final pubsub = FakePubSub(); |
| late Map<String, String> validHeader; |
| late Map<String, String> inValidHeader; |
| |
| String getHmac(Uint8List list, Uint8List key) { |
| final hmac = Hmac(sha1, key); |
| return hmac.convert(list).toString(); |
| } |
| |
| setUp(() { |
| githubWebhook = GithubWebhook(config: config, pubsub: pubsub); |
| }); |
| |
| test('call handler to handle the post request', () async { |
| final body = utf8.encode(generateWebhookEvent()); |
| final key = utf8.encode(keyString); |
| final hmac = getHmac(body, key); |
| validHeader = <String, String>{ |
| 'X-Hub-Signature': 'sha1=$hmac', |
| 'X-GitHub-Event': 'yes', |
| }; |
| req = Request( |
| 'POST', |
| Uri.parse('http://localhost/'), |
| body: generateWebhookEvent(), |
| headers: validHeader, |
| ); |
| final response = await githubWebhook.post(req); |
| final resBody = await response.readAsString(); |
| final reqBody = json.decode(resBody) as Map<String, dynamic>; |
| final labels = PullRequest.fromJson( |
| reqBody['pull_request'] as Map<String, dynamic>, |
| ).labels!; |
| expect(labels[0].name, 'cla: yes'); |
| expect(labels[1].name, 'autosubmit'); |
| }); |
| |
| test('Rejects invalid hmac', () async { |
| inValidHeader = <String, String>{ |
| 'X-GitHub-Event': 'pull_request', |
| 'X-Hub-Signature': 'bar', |
| }; |
| req = Request( |
| 'POST', |
| Uri.parse('http://localhost/'), |
| body: 'Hello, World!', |
| headers: inValidHeader, |
| ); |
| await expectLater(githubWebhook.post(req), throwsA(isA<Forbidden>())); |
| }); |
| |
| test('Rejects missing headers', () async { |
| req = Request( |
| 'POST', |
| Uri.parse('http://localhost/'), |
| body: generateWebhookEvent(), |
| ); |
| await expectLater( |
| githubWebhook.post(req), |
| throwsA(isA<BadRequestException>()), |
| ); |
| }); |
| }); |
| } |