// Copyright (c) 2022, 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() {
  forBothPubGetAndUpgrade((command) {
    test('supports dependency_overrides', () async {
      await servePackages()
        ..serve('lib', '1.0.0')
        ..serve('lib', '2.0.0');

      await d.dir(appPath, [
        d.appPubspec({'lib': '1.0.0'}),
        d.dir('lib'),
        d.pubspecOverrides({
          'dependency_overrides': {'lib': '2.0.0'}
        }),
      ]).create();

      await pubCommand(
        command,
        warning:
            'Warning: pubspec.yaml has overrides from pubspec_overrides.yaml\n'
            'Warning: You are using these overridden dependencies:\n'
            '! lib 2.0.0',
      );

      await d.dir(appPath, [
        d.packageConfigFile([
          d.packageConfigEntry(
            name: 'lib',
            version: '2.0.0',
            languageVersion: '2.7',
          ),
          d.packageConfigEntry(
            name: 'myapp',
            path: '.',
            languageVersion: '0.1',
          ),
        ])
      ]).validate();
    });
  });

  test('is ignored by publish command', () async {
    await d.validPackage.create();
    await d.dir(appPath, [
      d.pubspecOverrides({
        'dependency_overrides': {'lib': '1.0.0'}
      }),
    ]).create();

    await runPub(
      args: ['lish', '--dry-run'],
      exitCode: exit_codes.SUCCESS,
    );
  });
}
