// 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 '../../hosted/offline_test.dart' show populateCache;
import '../../test_pub.dart';

void main() {
  test('Do not consider retracted packages', () async {
    final server = await servePackages()
      ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
      ..serve('bar', '1.0.0')
      ..serve('bar', '1.1.0');
    await d.appDir({'foo': '1.0.0'}).create();

    server.retractPackageVersion('bar', '1.1.0');
    await pubGet();

    await d.cacheDir({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
    await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
  });

  test('Error when the only available package version is retracted', () async {
    final server = await servePackages()
      ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
      ..serve('bar', '1.0.0');
    await d.appDir({'foo': '1.0.0'}).create();

    server.retractPackageVersion('bar', '1.0.0');
    await pubGet(
        error:
            '''Because every version of foo depends on bar ^1.0.0 which doesn't match any versions, foo is forbidden. 
            So, because myapp depends on foo 1.0.0, version solving failed.''');
  });

  // Currently retraction does not affect prioritization. I.e., if
  // pubspec.lock already contains a retracted version, which is the newest
  // satisfying the dependency contstraint we will not choose to downgrade.
  // In this case we expect a newer version to be published at some point which
  // will then cause pub upgrade to choose that one.
  test('Allow retracted version when it was already in pubspec.lock', () async {
    final server = await servePackages()
      ..serve('foo', '1.0.0', deps: {'bar': '^1.0.0'})
      ..serve('bar', '1.0.0')
      ..serve('bar', '1.1.0');
    await d.appDir({'foo': '1.0.0'}).create();

    await pubGet();
    await d.cacheDir({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
    await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();

    server.retractPackageVersion('bar', '1.1.0');
    await pubUpgrade();
    await d.cacheDir({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
    await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();

    server.serve('bar', '2.0.0');
    await pubUpgrade();
    await d.cacheDir({'foo': '1.0.0', 'bar': '1.1.0'}).validate();
    await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();

    server.serve('bar', '1.2.0');
    await pubUpgrade();
    await d.cacheDir({'foo': '1.0.0', 'bar': '1.2.0'}).validate();
    await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.2.0'}).validate();
  });

  test('Offline versions of pub commands also handle retracted packages',
      () async {
    final server = await servePackages();
    await populateCache({
      'foo': ['1.0.0'],
      'bar': ['1.0.0', '1.1.0']
    }, server);

    await d.cacheDir({
      'foo': '1.0.0',
      'bar': ['1.0.0', '1.1.0']
    }).validate();

    final barVersionsCache =
        p.join(globalServer.cachingPath, '.cache', 'bar-versions.json');
    expect(fileExists(barVersionsCache), isTrue);
    deleteEntry(barVersionsCache);

    server.retractPackageVersion('bar', '1.1.0');
    await pubGet();

    await d.cacheDir({'bar': '1.1.0'}).validate();

    // Now serve only errors - to validate we are truly offline.
    server.serveErrors();

    await d.appDir({'foo': '1.0.0', 'bar': '^1.0.0'}).create();

    await pubUpgrade(args: ['--offline']);

    // We choose bar 1.1.0 since we already have it in pubspec.lock
    await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.1.0'}).validate();

    // Delete lockfile so that retracted versions are not considered.
    final lockFile = p.join(d.sandbox, appPath, 'pubspec.lock');
    expect(fileExists(lockFile), isTrue);
    deleteEntry(lockFile);

    await pubGet(args: ['--offline']);
    await d.appPackagesFile({'foo': '1.0.0', 'bar': '1.0.0'}).validate();
  });

  test('Allow retracted version when pinned in dependency_overrides', () async {
    final server = await servePackages()
      ..serve('foo', '1.0.0')
      ..serve('foo', '2.0.0')
      ..serve('foo', '3.0.0');

    await d.dir(appPath, [
      d.pubspec({
        'name': 'myapp',
        'dependencies': {'foo': '<3.0.0'},
        'dependency_overrides': {'foo': '2.0.0'}
      })
    ]).create();

    server.retractPackageVersion('foo', '2.0.0');

    await pubGet();
    await d.appPackagesFile({'foo': '2.0.0'}).validate();
  });

  test('Prefer retracted version in dependency_overrides over pubspec.lock',
      () async {
    final server = await servePackages()
      ..serve('foo', '1.0.0')
      ..serve('foo', '2.0.0')
      ..serve('foo', '3.0.0');

    await d.appDir({'foo': 'any'}).create();
    await pubGet();

    server.retractPackageVersion('foo', '2.0.0');
    server.retractPackageVersion('foo', '3.0.0');

    await pubUpgrade();
    await d.appPackagesFile({'foo': '3.0.0'}).validate();

    await d.dir(appPath, [
      d.pubspec({
        'name': 'myapp',
        'dependencies': {'foo': '<=3.0.0'},
        'dependency_overrides': {'foo': '2.0.0'}
      })
    ]).create();

    await pubUpgrade();
    await d.appPackagesFile({'foo': '2.0.0'}).validate();
  });
}
