// Copyright 2020 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 'package:cocoon_service/src/request_handlers/flaky_handler_utils.dart';
import 'package:cocoon_service/src/service/config.dart';
import 'package:cocoon_service/src/service/github_service.dart';
import 'package:github/github.dart' hide Team;
import 'package:mockito/mockito.dart';
import 'package:test/test.dart';

import '../src/datastore/fake_config.dart';
import '../src/utilities/mocks.dart';

void main() {
  group('Gets test ownership', () {
    String testOwnersContent;

    group('framework host only', () {
      test('returns correct owner when no mulitple tests share the same file', () async {
        testOwnersContent = '''
## Host only framework tests
# Linux abc
abc_test.sh @ghi @flutter/engine
## Firebase tests
''';
        final TestOwnership ownership = getTestOwnership('Linux abc', BuilderType.frameworkHostOnly, testOwnersContent);
        expect(ownership.owner, 'ghi');
        expect(ownership.team, Team.engine);
      });

      test('returns correct owner when mulitple tests share the same file', () async {
        testOwnersContent = '''
## Host only framework tests
# Linux abc
# Linu def
abc_test.sh @ghi @flutter/framework
## Firebase tests
''';
        final TestOwnership ownership1 =
            getTestOwnership('Linux abc', BuilderType.frameworkHostOnly, testOwnersContent);
        expect(ownership1.owner, 'ghi');
        expect(ownership1.team, Team.framework);
        final TestOwnership ownership2 =
            getTestOwnership('Linux def', BuilderType.frameworkHostOnly, testOwnersContent);
        expect(ownership2.owner, 'ghi');
        expect(ownership2.team, Team.framework);
      });
    });

    group('firebaselab only', () {
      test('returns correct owner', () async {
        testOwnersContent = '''
## Firebase tests
# Linux abc
/test/abc @def @flutter/tool
## Shards tests
''';
        final TestOwnership ownership =
            getTestOwnership('Linux firebase_abc', BuilderType.firebaselab, testOwnersContent);
        expect(ownership.owner, 'def');
        expect(ownership.team, Team.tool);
      });
    });

    group('devicelab tests', () {
      test('returns correct owner', () async {
        testOwnersContent = '''
## Linux Android DeviceLab tests
/dev/devicelab/bin/tasks/abc.dart @def @flutter/web

## Host only framework tests
''';
        final TestOwnership ownership = getTestOwnership('Linux abc', BuilderType.devicelab, testOwnersContent);
        expect(ownership.owner, 'def');
        expect(ownership.team, Team.web);
      });
    });

    group('shards tests', () {
      test('returns correct owner', () async {
        testOwnersContent = '''
## Shards tests
#
# abc @def @flutter/engine
''';
        final TestOwnership ownership = getTestOwnership('Linux abc', BuilderType.shard, testOwnersContent);
        expect(ownership.owner, 'def');
        expect(ownership.team, Team.engine);
      });
    });

    group('getExistingPRs', () {
      test('throws more detailed logs for bad prs with inappropriate body meta tag', () async {
        final MockGitHub mockGitHubClient = MockGitHub();
        final MockPullRequestsService mockPullRequestsService = MockPullRequestsService();
        const String expectedHtml = 'https://someurl';
        // when gets existing marks flaky prs.
        when(mockPullRequestsService.list(captureAny)).thenAnswer((Invocation invocation) {
          return Stream<PullRequest>.value(PullRequest(
            htmlUrl: expectedHtml,
            body: '''
<!-- meta-tags: To be used by the automation script only, DO NOT MODIFY.
{
  "name"
}
-->''',
          ));
        });
        when(mockGitHubClient.pullRequests).thenReturn(mockPullRequestsService);
        final FakeConfig config = FakeConfig(
          githubService: GithubService(mockGitHubClient),
        );
        expect(() => getExistingPRs(config.githubService!, Config.flutterSlug), throwsA(predicate<String>((String e) {
          return e.contains('Unable to parse body of $expectedHtml');
        })));
      });

      test('handles PRs with empty body message', () async {
        final MockGitHub mockGitHubClient = MockGitHub();
        final MockPullRequestsService mockPullRequestsService = MockPullRequestsService();
        const String expectedHtml = 'https://someurl';
        when(mockPullRequestsService.list(captureAny)).thenAnswer((Invocation invocation) {
          return Stream<PullRequest>.value(PullRequest(
            htmlUrl: expectedHtml,
          ));
        });
        when(mockGitHubClient.pullRequests).thenReturn(mockPullRequestsService);
        final FakeConfig config = FakeConfig(
          githubService: GithubService(mockGitHubClient),
        );
        expect(await getExistingPRs(config.githubService!, Config.flutterSlug), <String?, PullRequest>{});
      });
    });
  });
}
