// Copyright (c) 2021, 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 p;
import 'package:pub/src/io.dart';
import 'package:test/test.dart';

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

void main() {
  test('Report retracted packages', () async {
    await servePackages((builder) => builder
      ..serve('foo', '1.0.0', deps: {'bar': 'any'})
      ..serve('bar', '1.0.0'));
    await d.appDir({'foo': '1.0.0'}).create();

    await pubGet();

    globalPackageServer!
        .add((builder) => builder..retractPackageVersion('bar', '1.0.0'));
    // Delete the cache to trigger the report.
    final barVersionsCache =
        p.join(globalPackageServer!.cachingPath, '.cache', 'bar-versions.json');
    expect(fileExists(barVersionsCache), isTrue);
    deleteEntry(barVersionsCache);
    await pubGet(output: contains('bar 1.0.0 (retracted)'));
  });

  test('Report retracted packages with newer version available', () async {
    await servePackages((builder) => builder
      ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
      ..serve('bar', '1.0.0')
      ..serve('bar', '2.0.0')
      ..serve('bar', '2.0.1-pre'));
    await d.appDir({'foo': '1.0.0'}).create();

    await pubGet();

    globalPackageServer!
        .add((builder) => builder..retractPackageVersion('bar', '1.0.0'));
    // Delete the cache to trigger the report.
    final barVersionsCache =
        p.join(globalPackageServer!.cachingPath, '.cache', 'bar-versions.json');
    expect(fileExists(barVersionsCache), isTrue);
    deleteEntry(barVersionsCache);
    await pubGet(output: contains('bar 1.0.0 (retracted, 2.0.0 available)'));
  });

  test('Report retracted packages with newer prerelease version available',
      () async {
    await servePackages((builder) => builder
      ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0-pre'})
      ..serve('bar', '1.0.0-pre')
      ..serve('bar', '2.0.1-pre'));
    await d.appDir({'foo': '1.0.0'}).create();

    await pubGet();

    globalPackageServer!
        .add((builder) => builder..retractPackageVersion('bar', '1.0.0-pre'));
    // Delete the cache to trigger the report.
    final barVersionsCache =
        p.join(globalPackageServer!.cachingPath, '.cache', 'bar-versions.json');
    expect(fileExists(barVersionsCache), isTrue);
    deleteEntry(barVersionsCache);
    await pubGet(
        output: contains('bar 1.0.0-pre (retracted, 2.0.1-pre available)'));
  });
}
