// Copyright (c) 2013, 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.

// @dart=2.10

import 'package:pub/src/entrypoint.dart';
import 'package:pub/src/validator.dart';
import 'package:pub/src/validator/pubspec_field.dart';
import 'package:test/test.dart';

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

Validator pubspecField(Entrypoint entrypoint) =>
    PubspecFieldValidator(entrypoint);

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

    test('looks normal', () => expectValidation(pubspecField));

    test('has an HTTPS homepage URL', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg['homepage'] = 'https://pub.dartlang.org';
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField);
    });

    test('has an HTTPS repository URL instead of homepage', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg.remove('homepage');
      pkg['repository'] = 'https://pub.dartlang.org';
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField);
    });

    test('has an HTTPS documentation URL', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg['documentation'] = 'https://pub.dartlang.org';
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField);
    });

    test('has empty executables', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg['executables'] = <String, String>{};
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField);
    });

    test('has executables', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg['executables'] = <String, String>{
        'test_pkg': null,
        'test_pkg_helper': 'helper',
      };
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField);
    });
  });

  group('should warn if a package', () {
    test('is missing both the "homepage" and the "description" field',
        () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg.remove('homepage');
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField, warnings: isNotEmpty);
    });
  });

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

    test('is missing the "description" field', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg.remove('description');
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField, errors: isNotEmpty);
    });

    test('has a non-string "homepage" field', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg['homepage'] = 12;
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField, errors: isNotEmpty);
    });

    test('has a non-string "repository" field', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg['repository'] = 12;
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField, errors: isNotEmpty);
    });

    test('has a non-string "description" field', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg['description'] = 12;
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField, errors: isNotEmpty);
    });

    test('has a non-HTTP homepage URL', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg['homepage'] = 'file:///foo/bar';
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField, errors: isNotEmpty);
    });

    test('has a non-HTTP documentation URL', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg['documentation'] = 'file:///foo/bar';
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField, errors: isNotEmpty);
    });

    test('has a non-HTTP repository URL', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg['repository'] = 'file:///foo/bar';
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField, errors: isNotEmpty);
    });

    test('has invalid executables', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg['executables'] = <String>['wrong-thing'];
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField, errors: isNotEmpty);
    });

    test('has invalid executables mapping to a number', () async {
      var pkg = packageMap('test_pkg', '1.0.0');
      pkg['executables'] = <String, dynamic>{
        'test_pkg': 33,
      };
      await d.dir(appPath, [d.pubspec(pkg)]).create();

      await expectValidation(pubspecField, errors: isNotEmpty);
    });
  });
}
