// 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.

import 'package:path/path.dart' as path;
import 'package:test/test.dart';

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

void main() {
  String hostedDir(String package) {
    return path.join(d.sandbox, cachePath, 'hosted', 'pub.dev', package);
  }

  test('running pub cache list when there is no cache', () async {
    await runPub(args: ['cache', 'list'], output: '{"packages":{}}');
  });

  test('running pub cache list on empty cache', () async {
    // Set up a cache.
    await d.dir(cachePath, [
      d.dir('hosted', [d.dir('pub.dev', [])])
    ]).create();

    await runPub(args: ['cache', 'list'], outputJson: {'packages': {}});
  });

  test('running pub cache list', () async {
    // Set up a cache.
    await d.dir(cachePath, [
      d.dir('hosted', [
        d.dir('pub.dev', [
          d.dir('foo-1.2.3', [d.libPubspec('foo', '1.2.3'), d.libDir('foo')]),
          d.dir('bar-2.0.0', [d.libPubspec('bar', '2.0.0'), d.libDir('bar')])
        ])
      ])
    ]).create();

    await runPub(
      args: ['cache', 'list'],
      outputJson: {
        'packages': {
          'bar': {
            '2.0.0': {'location': hostedDir('bar-2.0.0')}
          },
          'foo': {
            '1.2.3': {'location': hostedDir('foo-1.2.3')}
          }
        }
      },
    );
  });

  test('includes packages containing deps with bad sources', () async {
    // Set up a cache.
    await d.dir(cachePath, [
      d.dir('hosted', [
        d.dir('pub.dev', [
          d.dir('foo-1.2.3', [
            d.libPubspec(
              'foo',
              '1.2.3',
              deps: {
                'bar': {'bad': 'bar'}
              },
            ),
            d.libDir('foo')
          ])
        ])
      ])
    ]).create();

    await runPub(
      args: ['cache', 'list'],
      outputJson: {
        'packages': {
          'foo': {
            '1.2.3': {'location': hostedDir('foo-1.2.3')}
          }
        }
      },
    );
  });
}
