// Copyright (c) 2012, 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 'dart:convert';

import 'package:test/test.dart';

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

void main() {
  forBothPubGetAndUpgrade((command) {
    test('fails gracefully on a dependency from an unknown source', () async {
      await d.appDir(
        dependencies: {
          'foo': {'bad': 'foo'},
        },
      ).create();

      await pubCommand(
        command,
        error: equalsIgnoringWhitespace('''
        Because myapp depends on foo from unknown source "bad", version solving
          failed.
      '''),
      );
    });

    test(
        'fails gracefully on transitive dependency from an unknown '
        'source', () async {
      await d.dir('foo', [
        d.libDir('foo', 'foo 0.0.1'),
        d.libPubspec(
          'foo',
          '0.0.1',
          deps: {
            'bar': {'bad': 'bar'},
          },
        ),
      ]).create();

      await d.appDir(
        dependencies: {
          'foo': {'path': '../foo'},
        },
      ).create();

      await pubCommand(
        command,
        error: equalsIgnoringWhitespace('''
        Because every version of foo from path depends on bar from unknown
          source "bad", foo from path is forbidden.
        So, because myapp depends on foo from path, version solving failed.
      '''),
      );
    });

    test('ignores unknown source in lockfile', () async {
      await d
          .dir('foo', [d.libDir('foo'), d.libPubspec('foo', '0.0.1')]).create();

      // Depend on "foo" from a valid source.
      await d.dir(appPath, [
        d.appPubspec(
          dependencies: {
            'foo': {'path': '../foo'},
          },
        ),
      ]).create();

      // But lock it to a bad one.
      await d.dir(appPath, [
        d.file(
          'pubspec.lock',
          jsonEncode({
            'packages': {
              'foo': {
                'version': '0.0.0',
                'source': 'bad',
                'description': {'name': 'foo'},
              },
            },
          }),
        ),
      ]).create();

      await pubCommand(command);

      // Should upgrade to the new one.
      await d.appPackageConfigFile([
        d.packageConfigEntry(name: 'foo', path: '../foo'),
      ]).validate();
    });
  });
}
