// 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 'package:auto_submit/service/github_service.dart';
import 'package:github/github.dart';
import 'package:mockito/mockito.dart';
import 'package:test/test.dart';

import '../requests/github_webhook_test_data.dart';
import '../utilities/mocks.dart';

void main() {
  late GithubService githubService;
  late RepositorySlug slug;
  late RepositoryCommit testCommit;
  final MockGitHub mockGitHub = MockGitHub();
  final MockRepositoriesService mockRepositoriesService = MockRepositoriesService();
  final MockGitHubComparison mockGitHubComparison = MockGitHubComparison();
  final MockResponse mockResponse = MockResponse();

  const String author = '''{"login": "octocat", "id": 1}''';
  const String url = 'testUrl';
  const String sha = '6dcb09b5b57875f334f61aebed695e2e4193db5e';

  setUp(() {
    githubService = GithubService(mockGitHub);
    slug = RepositorySlug('flutter', 'cocoon');
    testCommit = RepositoryCommit.fromJson(
      jsonDecode('{"url": "$url", "author": $author, "sha": "$sha"}') as Map<String, dynamic>,
    );

    when(mockGitHubComparison.behindBy).thenReturn(10);
    when(mockGitHub.request(any, any,
            headers: anyNamed('headers'),
            params: anyNamed('params'),
            body: anyNamed('body'),
            statusCode: anyNamed('statusCode'),
            fail: anyNamed('fail'),
            preview: anyNamed('preview')))
        .thenAnswer((_) => Future.value(mockResponse));
    when(mockResponse.statusCode).thenReturn(200);
    when(mockGitHub.repositories).thenReturn(mockRepositoriesService);
    when(mockRepositoriesService.getCommit(any, any)).thenAnswer((_) => Future.value(testCommit));
    when(mockRepositoriesService.compareCommits(any, any, any)).thenAnswer((_) => Future.value(mockGitHubComparison));
  });

  test('listReviews retrieves all reviews of the pull request', () async {
    final RepositoryCommit commit = await githubService.getCommit(slug, sha);
    expect(commit.author!.login, 'octocat');
    expect(commit.url, 'testUrl');
    expect(commit.sha, '6dcb09b5b57875f334f61aebed695e2e4193db5e');
  });

  test('Merges branch', () async {
    when(mockGitHubComparison.behindBy).thenReturn(10);
    PullRequest pullRequest = generatePullRequest();
    await githubService.autoMergeBranch(pullRequest);
    verify(mockResponse.statusCode).called(1);
  });

  test('Does not merge branch', () async {
    when(mockGitHubComparison.behindBy).thenReturn(9);
    PullRequest pullRequest = generatePullRequest();
    await githubService.autoMergeBranch(pullRequest);
    verifyNever(mockResponse.statusCode);
  });
}
