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

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

void main() {
  test('handles failure to reinstall some packages', () async {
    // Only serve two packages so repairing will have a failure.
    final server = await servePackages()
      ..serve('foo', '1.2.3')
      ..serve('foo', '1.2.5');

    // Set up a cache with some packages.
    await d.dir(cachePath, [
      d.dir('hosted', [
        d.dir('localhost%58${server.port}', [
          d.dir('foo-1.2.3',
              [d.libPubspec('foo', '1.2.3'), d.file('broken.txt')]),
          d.dir('foo-1.2.4',
              [d.libPubspec('foo', '1.2.4'), d.file('broken.txt')]),
          d.dir(
              'foo-1.2.5', [d.libPubspec('foo', '1.2.5'), d.file('broken.txt')])
        ])
      ])
    ]).create();

    // Repair them.
    var pub = await startPub(args: ['cache', 'repair']);

    expect(pub.stdout, emits('Downloading foo 1.2.3...'));
    expect(pub.stdout, emits('Downloading foo 1.2.5...'));

    expect(pub.stderr, emits(startsWith('Failed to repair foo 1.2.4. Error:')));
    expect(
        pub.stderr,
        emits('Package not available '
            '(Package foo has no version 1.2.4).'));

    expect(pub.stdout, emits('Reinstalled 2 packages.'));
    expect(pub.stdout, emits('Failed to reinstall 1 package:'));
    expect(pub.stdout, emits('- foo 1.2.4'));

    await pub.shouldExit(exit_codes.UNAVAILABLE);
  });
}
