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

import '../../test_pub.dart';

void main() {
  test('activating a package from a custom pub server', () async {
    // The default pub server (i.e. pub.dartlang.org).
    final server = await servePackages();
    server.serve('baz', '1.0.0');

    // The custom pub server.
    final customServer = await startPackageServer();
    Map<String, dynamic> hostedDep(String name, String constraint) => {
          'hosted': {
            'url': customServer.url,
            'name': name,
          },
          'version': constraint,
        };

    customServer.serve('foo', '1.0.0', deps: {'bar': hostedDep('bar', 'any')});
    customServer.serve('bar', '1.0.0', deps: {'baz': 'any'});

    await runPub(
        args: ['global', 'activate', 'foo', '-u', customServer.url],
        output: allOf([
          contains('Downloading bar 1.0.0...'),
          contains('Downloading baz 1.0.0...'),
          contains('Downloading foo 1.0.0...'),
          contains('Activated foo 1.0.0')
        ]));
  });
}
