// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. 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:pub/src/entrypoint.dart';
import 'package:pub/src/validator.dart';
import 'package:pub/src/validator/leak_detection.dart';
import 'package:test/test.dart';

import '../descriptor.dart' as d;
import '../test_pub.dart';
import 'utils.dart';

Validator leakDetection(Entrypoint entrypoint) =>
    LeakDetectionValidator(entrypoint);

void main() {
  group('should consider a package valid if it', () {
    setUp(d.validPackage.create);

    test('contains a source file without secrets', () async {
      await d.dir(appPath, [
        d.libPubspec('test_pkg', '1.0.0'),
        d.dir('lib', [
          d.file('test_pkg.dart', '''
            void main() => print('nothing secret here');
          '''),
        ])
      ]).create();
      await expectValidation(leakDetection);
    });

    test('contains a source file listed in false_secrets', () async {
      await d.dir(appPath, [
        d.pubspec({
          'name': 'test_pkg',
          'version': '1.0.0',
          'false_secrets': [
            '/lib/test_pkg.dart',
          ],
        }),
        d.dir('lib', [
          d.file('test_pkg.dart', '''
            void main() => print('Revoked AWS key: AKIAVBOGPFGGW6HQOSMY');
          '''),
        ])
      ]).create();
      await expectValidation(leakDetection, errors: isEmpty);
    });
  });

  group('should consider a package invalid if it', () {
    test('contains a source file with secrets', () async {
      await d.dir(appPath, [
        d.libPubspec('test_pkg', '1.0.0'),
        d.dir('lib', [
          d.file('test_pkg.dart', '''
            void main() => print('Revoked AWS key: AKIAVBOGPFGGW6HQOSMY');
          '''),
        ])
      ]).create();
      await expectValidation(leakDetection, errors: isNotEmpty);
    });
  });

  group('should print', () {
    test('at-most 3 warnings', () async {
      await d.dir(appPath, [
        d.libPubspec('test_pkg', '1.0.0'),
        d.dir('lib', [
          d.file('test_pkg.dart', '''
            final apiKeys = [
              'AIzaSyDG0yD6347wy0i1U4ThqQoEZ0y37ZvFKPM',
              'AIzaSyCBSJpVO1A2yHOKP627dSmarIrdgvBygjw',
              'AIzaSyCB1pW0i5c5Wr42jykePxjrYOXwM4V4Kxk',
              'AIzaSyBg0xThpU0mAbbVgzm-BZ_4r3ByKwq8HQU',
              'AIzaSyDWpBgA7US5vfQnooBk1WsKa9U0ogKzuaI',
              'AIzaSyD95YyR7Xv1F7hdp503G6Tr2vi3CGDC27U',
              'AIzaSyCIKRF0KxSDxMkTAM7npQKQcASzRMItakw',
              'AIzaSyAH6KPIIZ5eXLrOX3l90su4YwYpaQ8X7cs',
              'AIzaSyCS78MPRLsd-Qkhc-t31OiaglmwstaU-nI',
              'AIzaSyAazCCPl4tWkSuDt9XBWRTpHxroViYhSxg',
            ];
          '''),
        ])
      ]).create();
      await expectValidation(leakDetection,
          errors: allOf(
            hasLength(lessThanOrEqualTo(3)),
            contains(contains('10 potential leaks detected in 1 file:')),
          ));
    });

    test('at-most 3 warnings when multiple files', () async {
      await d.dir(appPath, [
        d.libPubspec('test_pkg', '1.0.0'),
        d.dir('lib', [
          d.file('test_pkg.dart', '''
            final apiKeys = [
              'AIzaSyDG0yD6347wy0i1U4ThqQoEZ0y37ZvFKPM',
              'AIzaSyCBSJpVO1A2yHOKP627dSmarIrdgvBygjw',
              'AIzaSyCB1pW0i5c5Wr42jykePxjrYOXwM4V4Kxk',
              'AIzaSyBg0xThpU0mAbbVgzm-BZ_4r3ByKwq8HQU',
              'AIzaSyDWpBgA7US5vfQnooBk1WsKa9U0ogKzuaI',
              'AIzaSyD95YyR7Xv1F7hdp503G6Tr2vi3CGDC27U',
              'AIzaSyCIKRF0KxSDxMkTAM7npQKQcASzRMItakw',
            ];
          '''),
          d.file('helper.dart', '''
            final betterApiKeys = [
              'AIzaSyD95YyR7Xv1F7hdp503G6Tr2vi3CGDC27U',
              'AIzaSyCIKRF0KxSDxMkTAM7npQKQcASzRMItakw',
              'AIzaSyAH6KPIIZ5eXLrOX3l90su4YwYpaQ8X7cs',
              'AIzaSyCS78MPRLsd-Qkhc-t31OiaglmwstaU-nI',
              'AIzaSyAazCCPl4tWkSuDt9XBWRTpHxroViYhSxg',
            ];
          '''),
        ])
      ]).create();
      await expectValidation(leakDetection,
          errors: allOf(
            hasLength(lessThanOrEqualTo(3)),
            contains(contains('12 potential leaks detected in 2 files:')),
          ));
    });
  });

  group('LeakPattern', () {
    for (final pattern in leakPatterns) {
      group('for "${pattern.kind}"', () {
        for (var i = 0; i < pattern.testsWithLeaks.length; i++) {
          test('finds leak in testWithLeaks[$i]', () {
            final leaks = pattern
                .findPossibleLeaks('source.dart', pattern.testsWithLeaks[i])
                .toList(growable: false);
            expect(leaks, hasLength(equals(1)));
          });
        }

        for (var i = 0; i < pattern.testsWithNoLeaks.length; i++) {
          test('finds no leak in testsWithNoLeaks[$i]', () {
            final leaks = pattern
                .findPossibleLeaks('source.dart', pattern.testsWithNoLeaks[i])
                .toList(growable: false);
            expect(leaks, isEmpty);
          });
        }
      });
    }
  });
}
