import 'dart:io';

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

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

void main() async {
  test('PUB_CACHE/README.md gets created by command downloading to pub cache',
      () async {
    final server = await servePackages();
    server.serve('foo', '1.0.0');
    await d.appDir().create();
    await pubGet();
    await d.nothing(cachePath).validate();

    await d.appDir(dependencies: {'foo': '1.0.0'}).create();
    await pubGet();
    await d.dir(cachePath, [
      d.file('README.md', contains('https://dart.dev/go/pub-cache'))
    ]).validate();
    File(pathInCache('README.md')).deleteSync();
    // No new download, so 'README.md' doesn't get updated.
    await pubGet();
    await d.dir(cachePath, [d.nothing('README.md')]).validate();
  });

  test('PUB_CACHE/README.md gets created by `dart pub cache clean`', () async {
    final server = await servePackages();
    server.serve('foo', '1.0.0');
    await d.appDir(dependencies: {'foo': '1.0.0'}).create();
    await pubGet();
    await d.dir(cachePath, [
      d.file('README.md', contains('https://dart.dev/go/pub-cache'))
    ]).validate();
  });

  test('PUB_CACHE/README.md gets created when compiling a snapshot', () async {
    final server = await servePackages();
    server.serve(
      'foo',
      '1.0.0',
      contents: [d.file('bin/foo.dart', "main() {print('Hello');}")],
    );
    await runPub(args: ['global', 'activate', 'foo']);
    File(p.join(d.sandbox, cachePath, 'README.md')).deleteSync();
    // Replace the created snapshot with one that really doesn't work with the
    // current dart.
    await d.dir(cachePath, [
      d.dir('global_packages', [
        d.dir('foo', [
          d.dir(
            'bin',
            [d.outOfDateSnapshot('foo.dart-3.1.2+3.snapshot')],
          )
        ])
      ])
    ]).create();
    await runPub(args: ['global', 'run', 'foo'], output: contains('Hello'));
    await d.dir(cachePath, [
      d.file('README.md', contains('https://dart.dev/go/pub-cache'))
    ]).validate();
  });
}
