// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS d.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 d.file.

library pub_tests;

import 'dart:convert';

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

main() {
  initConfig();

  forBothPubGetAndUpgrade((command) {
    integration('fails gracefully on a dependency from an unknown source', () {
      d.appDir({"foo": {"bad": "foo"}}).create();

      pubCommand(command, error:
          "Package 'myapp' depends on 'foo' from unknown source 'bad'.");
    });

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

      d.appDir({"foo": {"path": "../foo"}}).create();

      pubCommand(command, error:
          "Package 'foo' depends on 'bar' from unknown source 'bad'.");
    });

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

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

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

      pubCommand(command);

      // Should upgrade to the new one.
      d.dir(packagesPath, [
        d.dir("foo", [
          d.file("foo.dart", 'main() => "foo";')
        ])
      ]).validate();
    });
  });
}
