// 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/reset_try_task_v2.dart';
import 'package:cocoon_service/src/request_handling/body.dart';
import 'package:cocoon_service/src/request_handling/exceptions.dart';
import 'package:github/github.dart';
import 'package:mockito/mockito.dart';
import 'package:test/test.dart';

import '../src/datastore/fake_config.dart';
import '../src/request_handling/api_request_handler_tester.dart';
import '../src/request_handling/fake_authentication.dart';
import '../src/request_handling/fake_http.dart';
import '../src/service/fake_github_service.dart';
import '../src/service/fake_scheduler_v2.dart';
import '../src/utilities/entity_generators.dart';
import '../src/utilities/mocks.dart';

void main() {
  group('ResetTryTask', () {
    late ApiRequestHandlerTester tester;
    FakeClientContext clientContext;
    late ResetTryTaskV2 handler;
    late FakeConfig config;
    FakeSchedulerV2 fakeScheduler;
    FakeAuthenticatedContext authContext;
    MockGitHub mockGithub;
    MockPullRequestsService mockPullRequestsService;
    late MockGithubChecksUtil mockGithubChecksUtil;

    setUp(() {
      clientContext = FakeClientContext();
      clientContext.isDevelopmentEnvironment = false;
      authContext = FakeAuthenticatedContext(clientContext: clientContext);
      mockGithub = MockGitHub();
      mockPullRequestsService = MockPullRequestsService();
      config = FakeConfig(githubClient: mockGithub, githubService: FakeGithubService());
      mockGithubChecksUtil = MockGithubChecksUtil();
      tester = ApiRequestHandlerTester(context: authContext);
      fakeScheduler = FakeSchedulerV2(
        config: config,
        githubChecksUtil: mockGithubChecksUtil,
      );
      handler = ResetTryTaskV2(
        config: config,
        authenticationProvider: FakeAuthenticationProvider(clientContext: clientContext),
        scheduler: fakeScheduler,
      );
      when(mockGithub.pullRequests).thenReturn(mockPullRequestsService);
      when(mockPullRequestsService.get(any, 123)).thenAnswer((_) async => generatePullRequest(id: 123));
    });

    test('Empty repo', () async {
      tester.request = FakeHttpRequest(
        queryParametersValue: <String, String>{
          'pr': '123',
        },
      );
      expect(() => tester.get(handler), throwsA(isA<BadRequestException>()));
    });

    test('Empty pr', () async {
      tester.request = FakeHttpRequest(
        queryParametersValue: <String, String>{
          'repo': 'flutter',
        },
      );
      expect(() => tester.get(handler), throwsA(isA<BadRequestException>()));
    });

    test('Trigger builds if all parameters are correct', () async {
      when(mockGithubChecksUtil.createCheckRun(any, any, any, any, output: anyNamed('output'))).thenAnswer((_) async {
        return CheckRun.fromJson(const <String, dynamic>{
          'id': 1,
          'started_at': '2020-05-10T02:49:31Z',
          'check_suite': <String, dynamic>{'id': 2},
        });
      });
      tester.request = FakeHttpRequest(
        queryParametersValue: <String, String>{
          ResetTryTaskV2.kRepoParam: 'flutter',
          ResetTryTaskV2.kPullRequestNumberParam: '123',
        },
      );
      expect(await tester.get(handler), Body.empty);
    });

    test('Parses empty builder correctly', () {
      final List<String> builders = handler.getBuilderList('');
      expect(builders.isEmpty, true);
    });

    test('Parses non-empty builder correctly', () {
      expect(handler.getBuilderList('a, b, c'), <String>['a', 'b', 'c']);
    });
  });
}
