// 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/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() => LeakDetectionValidator();

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 expectValidationDeprecated(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 expectValidationDeprecated(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 expectValidationDeprecated(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 expectValidationDeprecated(
        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 expectValidationDeprecated(
        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);
          });
        }
      });
    }
  });
}
