// Copyright (c) 2022, 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/exit_codes.dart';
import 'package:test/test.dart';

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

void main() {
  test('should consider a package valid if it contains no warnings or errors',
      () async {
    await d.dir(appPath, [
      d.validPubspec(),
      d.file('LICENSE', 'Eh, do what you want.'),
      d.file('README.md', "This package isn't real."),
      d.file('CHANGELOG.md', '# 1.0.0\nFirst version\n'),
      d.dir('lib', [d.file('test_pkg.dart', 'int i = 1;')])
    ]).create();
    await expectValidation();
  });

  test('should handle having no code in the analyzed directories', () async {
    await d.dir(appPath, [
      d.validPubspec(),
      d.file('LICENSE', 'Eh, do what you want.'),
      d.file('README.md', "This package isn't real."),
      d.file('CHANGELOG.md', '# 1.0.0\nFirst version\n'),
    ]).create();

    await expectValidation();
  });

  test(
      'follows analysis_options.yaml and should not warn if package contains only infos',
      () async {
    await d.dir(appPath, [
      d.libPubspec(
        'test_pkg', '1.0.0',
        sdk: '^3.0.0',
        // Using http where https is recommended.
        extras: {'repository': 'http://repo.org/'},
      ),
      d.file('LICENSE', 'Eh, do what you want.'),
      d.file('README.md', "This package isn't real."),
      d.file('CHANGELOG.md', '# 1.0.0\nFirst version\n'),
      d.file('analysis_options.yaml', '''
linter:
  rules:
    - secure_pubspec_urls
''')
    ]).create();

    await expectValidation();
  });

  test(
      'follows analysis_options.yaml and should warn if package contains warnings in pubspec.yaml',
      () async {
    await d.dir(appPath, [
      d.libPubspec(
        'test_pkg', '1.0.0',
        sdk: '^3.0.0',
        // Using http where https is recommended.
        extras: {'repository': 'http://repo.org/'},
      ),
      d.file('LICENSE', 'Eh, do what you want.'),
      d.file('README.md', "This package isn't real."),
      d.file('CHANGELOG.md', '# 1.0.0\nFirst version\n'),
      d.file('analysis_options.yaml', '''
linter:
  rules:
    - secure_pubspec_urls
analyzer:
  errors:
    secure_pubspec_urls: warning
''')
    ]).create();

    await expectValidation(
      error: allOf([
        contains(
          "The 'http' protocol shouldn't be used because it isn't secure. Try using a secure protocol, such as 'https'.",
        ),
        contains('Package has 1 warning.'),
      ]),
      exitCode: DATA,
    );
  });

  test(
      'should consider a package valid even if it contains errors in the example/ sub-folder',
      () async {
    await d.dir(appPath, [
      d.validPubspec(),
      d.file('LICENSE', 'Eh, do what you want.'),
      d.file('README.md', "This package isn't real."),
      d.file('CHANGELOG.md', '# 1.0.0\nFirst version\n'),
      d.dir('lib', [d.file('test_pkg.dart', 'int i = 1;')]),
      d.dir('example', [
        d.file('test_pkg.dart', '''
void main() {
  final a = 10; // Unused.
}
''')
      ])
    ]).create();

    await expectValidation();
  });

  test(
      'should warn if package contains errors in bin/, and works with --directory',
      () async {
    await d.dir(appPath, [
      d.validPubspec(),
      d.file('LICENSE', 'Eh, do what you want.'),
      d.file('README.md', "This package isn't real."),
      d.file('CHANGELOG.md', '# 1.0.0\nFirst version\n'),
      d.dir('lib', [d.file('test_pkg.dart', 'int i = 1;')]),
      d.dir('bin', [
        d.file('test_pkg.dart', '''
void main() {
// Missing }
''')
      ])
    ]).create();

    await expectValidation(
      error: allOf([
        contains('`dart analyze` found the following issue(s):'),
        contains('Analyzing lib, bin, pubspec.yaml...'),
        contains('error -'),
        contains("Expected to find '}'."),
        contains('Package has 1 warning.')
      ]),
      exitCode: DATA,
      extraArgs: ['--directory', appPath],
      workingDirectory: d.sandbox,
    );
  });

  test('should warn if package contains warnings in test folder', () async {
    await d.dir(appPath, [
      d.validPubspec(),
      d.file('LICENSE', 'Eh, do what you want.'),
      d.file('README.md', "This package isn't real."),
      d.file('CHANGELOG.md', '# 1.0.0\nFirst version\n'),
      d.dir('lib', [d.file('test_pkg.dart', 'int i = 1;')]),
      d.dir('test', [
        d.file('test_pkg.dart', '''
void main() {
  final a = 10; // Unused.
}
''')
      ]),
    ]).create();

    await expectValidation(
      error: allOf([
        contains('`dart analyze` found the following issue(s):'),
        contains('Analyzing lib, test, pubspec.yaml...'),
        contains('warning -'),
        contains("The value of the local variable 'a' isn't used"),
        contains('Package has 1 warning.')
      ]),
      exitCode: DATA,
    );
  });
}
